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】协议,转载请保留原文出处及本版权声明。
 
  
  
  
  
  
  
  
  
  
    
评论