写点什么

架构师训练营 第九周 作业

用户头像
一雄
关注
发布于: 2020 年 08 月 03 日

1. 请简述 JVM 垃圾回收原理。

JVM 垃圾回收就是将 JVM 不再被使用的对象清理掉,释放宝贵的内存资源。



JVM 通过一种可达性分析算法进行垃圾对象的识别并标记,它对线程栈中的局部变量或者静态变量出发,将这些变量引用的对象做标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。



回收主要有三种方法:

  • 清理

  • 将原来垃圾对象内存空间标记为空闲。

  • 压缩

  • 从堆空间头部开始,将存活的对象拷贝到一段连续的内存空间中。

  • 复制

  • 将堆空间分成两部分,当一部分用完时,将标记过的对象复制到另一个空间中。



分代回收:将堆分为新生代、老年代。新生代又分为 Eden 区、Survivors(From 区、To 区)。

  • 新生代

  • Eden

  • Survivors

  • From

  • To

  • 老年代

新创建的对象一开始处于新生代区中,当新生代区满时,将存活的对象复制到 From 区,等到下次新生代再次满时,新生代和 From 区中的存活对象会被一起复制到 To 区。如果一个对象经过多轮的 From 区和 To 区之间的复制后仍然存活,那么它会被复制到老年代。新生代的空间远小于老年代,空间小在垃圾回收时效率更高。

JVM 会记录 Survivor 区中的对象一共被来回复制了几次。如果一个对象被复制的次数达到一个值(对应虚拟机参数 -XX:+MaxTenuringThreshold),该对象会被 promo 至老年代。如果带个 Survivor 区被占用 50%(对应虚拟机参数 -XX:TargetSurvivorRatio),较高复制次数的对象也会被 promo 至老年代。

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

一雄

关注

还未添加个人签名 2020.03.05 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 第九周 作业