自动垃圾回收入门
1. C/C++的内存管理
在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。
2. Java的内存管理
Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。
3. 垃圾回收的对比
自动垃圾回收: 自动根据对象是否使用由虚拟机来回收对象
- 优点:降低程序员实现难度、降低对象回收bug的可能性
- 缺点:程序员无法控制内存回收的及时性
手动垃圾回收: 由程序员编程实现对象的删除
优点:回收及时性高,由程序员把控回收的时机
缺点:编写不当容易出现悬空指针、重复释放、内存泄漏等问题
4. 垃圾回收范围
Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。运行时数据区的组成如下: 其中线程不共享的部分,都是伴随着线程的创建而创建,线程的销毁而销毁。而方法的栈帧在执行完方法之后就会 自动弹出栈并释放掉对应的内存。
垃圾回收并不涉及到线程不共享部分,也就是垃圾回收不关心程序计数器、虚拟机栈、本地方法区的使用。涉及垃圾回收的是堆和方法区。