Skip to content

自动垃圾回收入门

1. C/C++的内存管理

在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。
Alt text

2. Java的内存管理

Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。

3. 垃圾回收的对比

自动垃圾回收: 自动根据对象是否使用由虚拟机来回收对象

  • 优点:降低程序员实现难度、降低对象回收bug的可能性
  • 缺点:程序员无法控制内存回收的及时性
    手动垃圾回收: 由程序员编程实现对象的删除
    优点:回收及时性高,由程序员把控回收的时机
    缺点:编写不当容易出现悬空指针、重复释放、内存泄漏等问题

4. 垃圾回收范围

Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。运行时数据区的组成如下:
Alt text 其中线程不共享的部分,都是伴随着线程的创建而创建,线程的销毁而销毁。而方法的栈帧在执行完方法之后就会 自动弹出栈并释放掉对应的内存。
Alt text 垃圾回收并不涉及到线程不共享部分,也就是垃圾回收不关心程序计数器、虚拟机栈、本地方法区的使用。涉及垃圾回收的是堆和方法区。