美文网首页jmm
阿牛学编程之GC算法入门

阿牛学编程之GC算法入门

作者: 铁拳阿牛 | 来源:发表于2017-08-29 23:57 被阅读21次

    转载请注明原文出处,谢谢!

    标记清除

    如图中所示,每次标记后JVM会对堆里的数据进行GC。当发现又有,没有引用的对象是会将他回收。

    蓝色可回收白色空闲黑色不能回收

    如果很明显按照这样的做发很快内存碎片还是有点坑,虽然他的效率高,一些长时间不被清楚的对象放里面还是很划算的。要是对齐的对象在这种环境下就非常好用了。


    标记压缩

    蓝色可回收白色空闲黑色不能回收

    当发生GC后,首先会把所有的没有被引用的对象给回收了。而有引用的对象呢?则会被整齐的排列起来。

    这里我的疑问来了,标记清除内存能到100%再回收这个没有问题,而标记压缩是不能的,他需要一小块交换空间来对空间进行排列所以自然不能100%才回收,这里我猜测可能奇数次重上往下排列,偶数次重下往上排列,之后再去求证这个猜测。

    复制算法

    GCq前和GC后

    这个算法是这三种算法中效率最高的,不过他浪费的空间也是很明显的,由于内存的物理特性它再COPY的时候是非常的快速的高效的(要是再同一根内存条上更猛),把有引用的对象全部复制到新的内存块上,然后之前的内存块直接重置。

    分代GC

    如果说复制算法是直拳,那么标记清除就是勾拳,标记压缩则是膝击。高手都是组合拳。对于GC也是。

    整个年轻代使用的是复制算法,其中默认Eden和survivor是8:1:1。而且两个survivor总有一个是空的,用来做交换空间,发生YGC的时候,首先把Eden中存在引用的对象清理到空的S区中(如果S区满了就把所有余下的对象直接升级到老年代去,自然另一个S区中还被引用的也会升级到老年代。),然后把另一个老S区中小于15岁的放入新S区,将15岁的晋升到老年代。(这个是用记在对象头中用4位来记得).

    老年代默认是使用标记清楚算法(cms),因为这些对象长时间被引用所以也不是很快销毁,而且这个GC的效率也很高。

    G1算法

    G1采用分段GC的思想进行GC减少GC时间这里阿牛还再研究中下次总结以下G1

    关注阿牛的公众号,从小菜比到老菜比

    JVM大咖你假笨大神 462563010加QQ群一起学习 欢迎关注spring4all

    相关文章

      网友评论

        本文标题:阿牛学编程之GC算法入门

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