jvm 垃圾回收
机制
检查变量,如果被引用,则标记;没被标记的,就是需要回收的对象;java并不会使用引用计数来进行垃圾回收,因为会存在重复引用问题
回收方法:
使用清理的方法,如果新创建的对象比被标记的空间大,不能重复利用,会产生过多内存碎片。
压缩方式,是对只标记的方法的改进,减少内存碎片的产生。但同时带来空间移动的开销
复制方式,对压缩方式的优化,减少空间移动的开销
分代回收
原因:大多数java对象生命周期都很短,所有设计成eden区和老年代区。老年代区的对象数目远大于eden区。
规则:
新对象在eden区分配
当eden区用完,会区里所有标记对象移动from区
当eden区再次用完,会把eden区+from区的标记对象移动to区
eden区再次用完,把eden区+to区移动from区,如此往复移动。
移动到一定次数后,把对象移动老年代区
回收算法
设计原则:回收时必定会阻塞所有线程,只有回收线程在运行;优化算法方面,在减少对系统的影响面积和减少阻塞时间上考虑。
串行回收器:开始回收时,阻塞所有工作线程,启动一个垃圾回收线程(早期的单核cpu),所以叫stop-the-world
并行回收器:对上一代的优化,stop-the-world,多个线程同时执行回收
CMS回收器:
设计目的:对上一代的优化,将一次性回收所有资源,改进成分两次,缩短阻塞时间,不过相对单纯的并行回收更耗些cpu。
回收线程和其它工作线程同时运行,进行初步标记;
重标记:stop-the-world,对初步标记时线程运行时还没释放的对象进行标记。
G1回收器:把不同类型的内存区域分成多片,并在一个配置的回收时间内进行阻塞并回收,每次回收一部分。在影响空间和影响时间上减少对系统的影响。
版权声明: 本文为 InfoQ 作者【GalaxyCreater】的原创文章。
原文链接:【http://xie.infoq.cn/article/b22a2d882943796da1a06c5cf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论