java的垃圾收集器

2019-08-05  本文已影响0人  小白牙_2fc6

    前言:在java虚拟机中堆内存保存着java实例,在执行代码的过程中,有的对象是全局变量,生命周期就长很多,而一些方法中的变量就是朝生夕灭。没有这种的机制,java的堆内存很快就消耗殆尽。

一:首先就需要确定jvm怎么判断哪些对象是需要回收的,这就涉及GC算法

1:引用计数算法:该算法言简意赅,就是程序中有引用一个对象时,该对象的引用就加1,但是该算法有个缺陷,当两个对象相互引用时,jvm就无法回收这两个对象。

2: 可达性分析算法:通过"GC ROOTS"的对象作为起点向下搜索,搜索所走过的路径称为引用链,当一个对象没有任何引用链的时候证明这个对象不可用。可以GC回收。

二:确定了哪些对象是可以回收了,就要开始真正的GC回收算法

1:标记-清楚算法:标记出需要回收的对象,在标记完成后统一回收所有被标记的对象。

有两个不足:效率不足,标记和清除两个过程的效率都不高,第二个就是空间原因,空间碎片太多可能会导致之后的程序运行时需要分配大对象,但是空间都是碎片化。导致会触发一次gc。

2:复制算法:将空间分为Eden区,FromSurvivor区,ToSurvivor区。比例是8:1:1。每次使用eden和一个survivor。在gc时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor上,在清理掉Eden和刚才用过的survivor空间。(在对象存活率比较低的时候使用更合适)

3:标记-整理算法:标记过程和标记清楚算法相同,后续的步骤不是直接对可回收的对象进行清理,而是让所有存活的对象都向一端移动,然后清理掉端边界以外的内存。

4:分代收集算法:一般将java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的GC算法,新生代由于对象朝生夕灭,使用复制算法,只需要复制少量的对象就可以完成GC、而老年代中因为对象存活率高,可以使用标记-清理或者标记-整理算法进行回收。

三:垃圾回收器

Serial收集器:是单线程进行gc回收,而且在回收的过程中会采用stop the world,会影响用户的体验。

ParNew收集器:多线程gc回收。

上一篇下一篇

猜你喜欢

热点阅读