文章目录
1 什么是promotion failed
promotion是“晋升”的意思,promotion failed当然是“晋升失败”了,在JVM GC的世界里,也有类似人类社会中的分等分级的概念,我所说的是对象是被区分对待的,有用(存在引用)的对象会在垃圾回收的过程中被晋升到较高等级的内存区域,然而有时候会出现一些意外,导致对象晋升失败,这就是promotion failed,无用(没有引用)对象会被清除从而释放其所占用的资源。
2 什么情况下会发生promotion failed
如果说整个堆一共分为新生代(level=0)和老年代(level=1)两个等级的话,那么年轻代也分为eden(伊甸园)区和survivor(幸存)区两个内存等级。注意对象晋升的大环境是年轻代GC,因为老年代已经是最高等级区域了,不存在再次晋升的情况。对象晋升的路线是eden→survivor或者是eden→old,因为当有用对象从eden区域晋升到survivor区域的时候有可能会晋升失败,因此会GC线程会再尝试直接往老年代晋升,同样晋升有可能失败。那么什么时候会被认为是晋升失败呢?有两种情况,一种情况是基于历史统计数据,比如统计数据显示历史上平均每次晋升对象的大小是av_promo,而当前老年代的空间并不足以存放av_promo大小的对象,则GC线程认为实际晋升的过程中可能会发生失败,晚失败不如早点失败,这种策略虽然会略有些悲观,但是实际上是这么做的