当前商业虚拟机基本上都是采用分代垃圾回收算法来回收垃圾,思想也很简单,就是根据对象的生命周期将内存划分,然后进行分区管理。

在Java虚拟机分代垃圾回收机制中,应用程序可用的堆空间可以分为年轻代老年代,然后呢,年亲代有被分为Eden区,From区与To区


这里写图片描述

当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收

一般来说这时候不是所有的对象都没用了,所以就会把还能用的对象复制到From区。


这里写图片描述

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


这里写图片描述

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


这里写图片描述

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


这里写图片描述

老年代经过这么几次折腾,也就扛不住了(空间被用完),好,那就来次集体大扫除(Full GC),也就是全量回收,一起滚蛋吧。

全量回收呢,就好比我们刚才比作的大扫除,毕竟动做比较大,成本高,不能跟平时的小型值日(Young GC)相比,所以如果Full GC使用太频繁的话,无疑会对系统性能产生很大的影响。

所以要合理设置年轻代与老年代的大小,尽量减少Full GC的操作

参考文献

[1] 《深入理解Java虚拟机——JVM高级特征与最佳实践》,周志明,机械工业出版社。
[2] 《大型网站技术架构——核心原理与案例分析》,李智慧,电子工业出版社。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐