JVM常见问题(2)
作者:互联网
GC的算法有哪些?怎么用
GC算法主要有四种:
1、引用计数法(一般不用)
每个对象都有一个引用计数器,当该对象被引用一次,则计数器+1,若对象引用失效一次,则计数器-1,当计数器为0时,则说明该对象为垃圾对象。
优点:
- 简单
- 计算代价分散
- 对象从死亡到回收的时间短
缺点:
- 不擅长处理循环引用的对象
- 并发支持较弱
- 占用内存
2、复制算法
通过将内存平均分成两个部分,每次只使用其中一个部分,当这部分的内存满时,将内存中所有存活的对象复制到另一部分内存中,然后清空之前的内存,只使用当前的内存,以此交替进行。最典型的例子就是新生区的轻GC机制。
优点:
- 简单
- 不产生内存碎片
缺点:
- 浪费内存空间
3、标记清除算法
给每个对象标记,表示该对象的状态(是否需要清除)。整个过程分为两个阶段,第一个阶段是标记阶段,这个阶段会为每个对象更新标记,确认对象是否死亡,第二个阶段是清除阶段,对那些死亡的对象进行清除。
优点:
- 不需要移动对象
- 相较于引用计数,只需要检测标记即可
缺点:
- 效率低,需要遍历全部对象,标记阶段需遍历活的对象,清除阶段需遍历所有对象
- 从对象死亡到回收的时间长
- 碎片空间无法利用
4、标记压缩算法
该算法是在标记清除算法的基础上进行改进,在清除阶段,将所有存活对象进行移动,移至一个区域,将其余对象清除
优点:
- 不会产生大量碎片空间,且gc后有连续的空内存空间
缺点:
-
需要移动成本
-
内存效率:复制算法 > 标记清除算法 > 标记压缩算法
-
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
-
内存利用率:标记压缩算法 = 标记清除算法 > 复制算法
标签:常见问题,标记,对象,清除,算法,内存,JVM,压缩算法 来源: https://www.cnblogs.com/ymw617/p/15390500.html