1. JVM 垃圾回收 简介
1.1. 什么是JVM的垃圾回收
JVM的垃圾回收机制(Garbage Collection,简称GC)是Java内存管理的核心组件,它的存在解决了手动内存管理带来的诸多问题。
1.2. 垃圾回收机制的核心作用
自动内存管理
- 自动识别并回收不再使用的对象内存
- 程序员无需手动调用
free()
或delete
释放内存
防止内存泄漏
// 没有GC的语言可能出现的内存泄漏示例(C++)
void leakMemory() {
while(true) {
Object* obj = new Object(); // 分配后没有释放
}
}
- 避免野指针问题
- 自动回收确保不会访问已释放的内存
- 对比C++中的悬垂指针问题:
int* ptr = new int(5);
delete ptr;
*ptr = 10; // 危险!访问已释放内存
1.3. 为什么要垃圾回收?
回顾之前文章,Java 内存是如何使用的?程序执行的时候,Java 栈内存可能会有局部变量,引用堆中的地址(对象实例的位置)。
现在有一个核心点:在Java堆内存里创建的对象,都是占用内存资源的,而且内存资源有限。
当程序执行结束后,方法及局部变量会出栈,导致堆内存中的对象没有其他地方来引用,这时这个对象会一直在堆内存中存在,时间越久,这种没有被引用的对象会越来越多,应该怎么办呢?
所以问题的答案来了:需要JVM 垃圾回收机制
JVM本身是有垃圾回收机制的,它是后台自动运行的线程,只要启动一个JVM进程,就会自带一个垃圾回收的后台线程。
如果对象没有任何一个方法的局部变量指向它,也没有任何一个类的静态变量、常量等指向它。这个对象可以称为 垃圾对象。
这个线程会在后台不断检查JVM堆内存中的各个实例对象,当变成 垃圾对象 的时候,垃圾回收器会定期清除掉垃圾,释放 JVM 的存储空间。
1.4. JVM 自己实现垃圾回收的好处
1. 解决手动内存管理的痛点
问题类型 | 手动管理(C/C++) | JVM垃圾回收 |
---|---|---|
忘记释放内存 | 内存泄漏 | 自动回收 |
重复释放内存 | 程序崩溃 | 无需手动释放 |
访问已释放内存 | 未定义行为 | 安全访问 |
2. 提升开发效率
- 开发者专注业务逻辑而非内存管理
- 减少约70%与内存相关的bug(来源:IBM研究数据)
3. 保障系统稳定性
// Java中即使循环创建对象也不会泄漏
void safeCreation() {
while(true) {
// GC会自动回收不再使用的对象
Object obj = new Object();
}
}