jvm 垃圾回收

用户头像
GalaxyCreater
关注
发布于: 2020 年 08 月 05 日

机制

检查变量,如果被引用,则标记;没被标记的,就是需要回收的对象;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回收器:把不同类型的内存区域分成多片,并在一个配置的回收时间内进行阻塞并回收,每次回收一部分。在影响空间和影响时间上减少对系统的影响。



发布于: 2020 年 08 月 05 日 阅读数: 30
用户头像

GalaxyCreater

关注

还未添加个人签名 2019.04.21 加入

还未添加个人简介

评论

发布
暂无评论
jvm垃圾回收