JVM-垃圾回收算法
JVM——垃圾回收算法
垃圾:运行程序中没有任何指针指向的对象
1. 标记阶段
引用计数法:每个对象保存一个引用计数器,记录对象被引用的情况
优点:实现简单
缺点:计数器增加了存储空间开销;计数器更新增加了时间开销;无法处理循环引用
可达性分析:以GCRoots集合为起始点,所有存活对象都会被GCRoots集合直接或间接连接
GCRoots:一组必须活跃的引用(虚拟机栈中的引用对象、本地方法栈中的引用对象、方法区中的静态变量和常量、被synchronized所持有的对象……)
2. finalize()方法
若一个对象obj到GCRoots没有引用链,则开始判断:
- 若obj没有重写finalize()方法 或 finalize()方法已被调用过,则obj被判为不可触及,准备清除;
- 若obj重写了finalize()方法 且 未执行过,则将obj插入 F-Queue中执行它的finalize()方法,这是它的最后一次逃脱死亡的机会,若执行finalize()方法过程中被引用则逃离死亡,这之后若再出现没有引用的情况就会直接被判为不可触及
3. 清除阶段
3.1 标记-清除算法
从GCRoots出发,标记所有被引用的对象,然后对堆内存遍历,回收那些未被标记的对象。
缺点:效率不高;gc时需停止整个应用程序;有内存碎片
3.2 标记-复制算法
将内存空间分为两块,每次只使用其中一块,gc时将存活对象复制到另一块内存,然后清空当前内存块
优点:不会出现内存碎片
缺点:需要两倍的内存空间;若大量对象存活,则需复制的对象较多,效率低
3.3 标记-整理算法
从GCRoots出发,标记所有被引用的对象,然后将所有存活对象压缩到内存的一端,然后清理边界外的空间
优点:消除了“标记-清除”中的内存碎片,内存地址连续;消除了“标记-复制”中内存减半的代价
缺点:效率低于复制算法;移动对象需调整引用地址
4. Stop-the-World
STW,指gc发生过程中产生应用程序的停顿
5. 引用
- 强引用Strong Reference:代码中普遍存在的赋值引用,只要强引用关系还在,对象就不会被回收
- 软引用Soft Reference:系统将要发生内存溢出时,才将这些对象纳入回收范围,回收后内存还是不足才报错OOM
- 弱引用Weak Reference:弱引用对象只能存活到下一次gc
- 虚引用Phantom Reference:一个对象是否有虚引用存在,不会对其生存时间产生影响,设置虚引用的唯一目的:这个对象被回收后收到一个系统通知
JVM-垃圾回收算法
http://example.com/2025/05/16/JVM-垃圾回收算法/