jvm常用的垃圾收集算法,垃圾收集算法分析

2020-06-20 11:24栏目:编程
TAG: java 算法

标记清除算法
劣势会产生大量不连续的内存碎片,当要分配一个大对象时,不得不再次进行gc, 而且每次gc都会产生更多的内存碎片。
复制算法
将可用内存按照容量划分了大小相等的2块,每次只是用其中一块,当一块的内存用完,进行gc,将存活的对象复制到另一块内存后,清空原先一块的内存, 实现简单,运行高效,但是将内存缩小为原来的一半显得有些不合理。新生代的回收基本采用这种方式来实现。因为新生代的对象的98%的生命周期都很短,都是朝生夕死,而复制算法的实现也不会对半划分,具体实现是在内存分为一块较大的Eden空间和两块较小的Survivor空间(比例为8:1:1),每次使用Eden空间和其中一块Survivor空间,gc后,会将存活的对象复制到另外一块Survivor空间中,这意味着只会有10%的空间被浪费,如果Survivor空间不足以接收存活的对象时,此时需要依赖老年代来帮忙分担。这个算法的缺点是如果存活的对象很多时,会进行较多次的复制操作,效率便会降低,但是用于新生代中这个算法是很合适的。
标记-整理算法
这个算法一般针对老年代而言,比较过程和标记清除算法相同,但后续的步骤不同,标记完成后,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
当前虚拟机都采用此算法,这个算法没什么新的思想,他将虚拟机的堆内存分为新生代和老年代,新生代采用复制算法来进行垃圾收集,老年代一般采用标记整理算法进行垃圾收集。

 
可达性分析中,必须在一个确保一致性的快照上进行,因为如果如果分析过程引用还在变化便无法分析出准确的结果。这点是导致GC进行时必须停顿所有java执行线程(这个过程被称为stop the world)。OopMap结构快速帮助GcRoots获取引用链的关系,当程序运行到安全点(safepoint)时,停顿下来开始执行gc.
gc发生时使所有线程停顿下来有2种方案“
抢占式中断
强制让所有线程中断,如果发现有现成中断的地方不是安全点上,就恢复线程,使其运行到安全点。
主动式中断
一般都采用这种方式。不主动对线程进行操作,仅仅简单地设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时,就中断挂起。

上一篇:
jvm垃圾收集器具体实现

本文来自网络,不代表山斋月平台立场,转载请注明出处: https://www.shanzhaiyue.top