vlambda博客
学习文章列表

阿牛代码日记,GC算法入门

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

标记清除

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




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

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


标记压缩

阿牛代码日记,GC算法入门

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

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

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

复制算法


阿牛代码日记,GC算法入门

GCq前和GC后

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

分代GC

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

阿牛代码日记,GC算法入门

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

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

G1算法

阿牛代码日记,GC算法入门

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



阿牛代码日记,GC算法入门

JVM大咖你假笨大神


欢迎关注spring4all