美文网首页
Java的GC机制

Java的GC机制

作者: zhujiaqqq | 来源:发表于2019-10-15 18:00 被阅读0次

    判断哪些对象需要被GC

    • 方法区

    可达性分析方法(Java使用):通过判断对象是否被GC Root 直接或间接引用,进而判断对象是否可用,如果对象不可以就可以对这个对象进行GC

    引用计数方法(python使用):每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,但无法解决对象相互循环引用的问题。

    如何触发GC

    • 程序调用System.gc()
    • 根据Eden区和FromSpace区的内存大小来决定,如果内存不足,则会启动GC(此时应用线程停止)

    GC又分为 minor GC 和 Full GC (也称为 Major GC )

    Minor GC触发条件:当Eden区满时,触发Minor GC。

    Full GC触发条件:

    a.调用System.gc时,系统建议执行Full GC,但是不必然执行

    b.老年代空间不足

    c.方法去空间不足

    d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存

    e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

    GC算法

    GC常用算法有:标记-清除算法标记-压缩算法复制算法分代收集算法。

    新生代、老年代的转化过程

    具体过程:新生代(Young)分为Eden区,From区与To区

    image

    当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收。一般来说这时候不是所有的对象都没用了,所以就会把还能用的对象复制到From区。

    image

    这样整个Eden区就被清理干净了,可以继续创建新的对象,当Eden区再次被用完,就再触发一次YoungGC,然后呢,注意,这个时候跟刚才稍稍有点区别。这次触发YoungGC后,会将Eden区与From区还在被使用的对象复制到To区,

    image

    再下一次YoungGC的时候,则是将Eden区与To区中的还在被使用的对象复制到From区。

    image

    经过若干次YoungGC后,有些对象在From与To之间来回游荡,这时候From区与To区亮出了底线(阈值),这些家伙要是到现在还没挂掉,对不起,一起滚到(复制)老年代吧。

    image

    老年代经过这么几次折腾,也就扛不住了(空间被用完),好,那就来次集体大扫除(Full GC),也就是全量回收。如果Full GC使用太频繁的话,无疑会对系统性能产生很大的影响。所以要合理设置年轻代与老年代的大小,尽量减少Full GC的操作。

    相关文章

      网友评论

          本文标题:Java的GC机制

          本文链接:https://www.haomeiwen.com/subject/fhasmctx.html