四种GC算法
GC垃圾回收,首先需要判断哪些对象需要回收
判断对象存活
可达性分析:
? 从GC Roots开始向下查询,如果一个对象到任何一个GC Root对象都没有一个引用链相连的话,说明此对象不可用。
? 四个GC Root对象
- JVM栈中引用的对象
- 方法区静态属性引用的对象
- 方法区中常量引用的对象
- 本地栈中JNI中引用的对象
四种GC算法
引用计数:
? 每个对象都有一个引用计数属性,多一个引用+1,少一个引用-1,为0的时候代表可以回收。
? 致命缺点:无法解决循环引用
复制算法:
? 将内存分为两块,当一块内存用完了,就将存活的对象复制到另一块内存中。
? 优点:空间连续,没有内存碎片,运行效率高。
? 缺点:占用内存,如果复制长期生存的对象,会导致效率低。
? 主要用在新生代,因为新生代对象存活率低。
标记-清除:
? 先标记出需要清除的对象,再将标记的对象回收。
? 优点:占用内存小
? 缺点:
? (1)需要进行两次动作,标记和清除,所以效率低。
? (2)回收完之后,内存不连续,会有内存碎片
标记-压缩:
? 先标记出需要清除的对象,但是不进行回收,而是让所有存活对象都向一段移动,然后清除边界之外的内存空间。
? 优点:占用内存小,没有内存碎片
? 缺点:效率低
分代收集:
? 根据Java堆的新生代和老年代的特点,选用不同的回收算法。新生代内存空间大,对象会大量死去,回收频繁,使用效率高的复制算法,只需要每次复制少量存活下来的对象即可。老年代内存空间小,对象存活率高,使用标记-清除/标记-压缩算法。
原文地址:https://www.cnblogs.com/jjpp/p/12176243.html
时间: 2024-10-07 23:15:36