JVM调优简要思想及简单案例-老年代空间分配担保机制

167 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

也有一些特殊情况,比如说如果在新生代 GC 里面,发现Eden区,垃圾回收完之后,它有大批对象都是存活的,它可能那个内存对象大小已经大于了这个 serviver 2 区或者 serviver 1,他们两个都是一样的,大于了 serviver 2 区,那它也会直接到这个老年代里面去。

这是属于一个只是例外情况,下面具体说明一下:

老年代空间分配担保机制:

  1. 在执行任何一次新生代GC之前,JVM会先检查一下老年代可用的可用内存空间,是否大于新生代所有对象的总大小
  2. 看老年代的内存大小,是否大于之前每一次新生代GC后进入老年代的对象的平均大小
  3. 如果上面两个步骤都判断成功了,那么JVM会尝试尝试进行新生代GC
  4. 新生代GC后,剩余的存活对象的大小,可直接进入Survivor区
  5. 新生代GC后,大于Survivor区可用空间大小,但是小于老年代可用空间大小,则直接进入老年代
  6. 新生代GC过后,剩余的存活对象大小大于了Survivor区域可用空间,也大于了老年代可用空间,触发FULL GC,对老年代和新生代进行垃圾回收。 1. FULL GC后,老年代有空间存放剩余的存活对象,则存活对象进行老年代 2. FULL GC后,老年代还是没有空间存放剩余存活对象,则发生内存溢出(OOM)

GC 的内存性能开销: FULL GC>老年代GC>新生代GC

GC性能开销由大到小是 FULL GC,其次是老年代 GC, 最小的是一个新生代 GC 。这地方没有把那个新生代 GC 分得很细,比如 通常说的Mior GC 或者是 Young GC, 为了便于理解,没有引入其他概念。

有了这个这样一个内存性能开销的一个大小比例之后,那我们为了让性能达到最优,主要也尽量让这个智能开销大的 GC 尽量的少发生。比如说我们这个可以新生代的 GC 多发生一些。