Full GC后新生代对象会直接进入老年代吗
泻药。题主使用System.gc()进行了显式的Full GC(注意:System.gc()在CMS或G1中启用-XX:+ExplicitGCInvokesConcurrent会立即发生GC,其他情况默认立即发生GC,使用-XX:+DisableExplicitGC禁止显式GC)。关于Full GC对GC Heap的收集区域,我在另一个回答中已经有过阐述,详情参考:ETIN:JVM Full GC对于年轻代的收集算法与Young GC的收集算法是一样的吗?。其中切题的部分为:
Full GC的收集范围包含整个Heap区域( Eden + S1 + S2 + Tenured),它发生时Mutator停止工作——Stop The World。对于Serial Collector,它采用MSC(Mark-Sweep-Compact)的算法对全堆进行Full GC,在HotSpot VM的实现中,主要用MarkSweep这个类来实现;对于Parallel Collector而言,PSMarkSweep是多线程的MarkSweep,名不副实,这玩意儿其实是个实现了Lisp2的Mark-Compact GC算法。PSMarkSweep有个特殊的地方是如果配置了ScavengeBeforeFullGC 这个flag,则会在Full GC之前对年轻代进行一次Minor GC;其他情况根本不需要Full GC之前先执行Minor GC,Full GC会对年轻代发起GC。Full GC前后Heap的对比示意参见:
可见,一般情况下,年轻代的存活对象都被Compact到了年老代,所以,你看到年轻代都被清空了;只有当年老代满了的时候,才会Compact到Eden区域。根据题主的GC Log,可以看到题主的JVM默认启用了UseParallelGC;此时,GC Heap的初始化参考Universe::initialize_heap()为:Universe::_collectedHeap = new ParallelScavengeHeap();不妨看看System.gc()的执行路径,一下简略描述了这个方法在HotSpot VM中的调用路径,主要用于显示MSC的执行流程:
JVM_GC\t--\u0026gt;VM_ParallelGCSystemGC::doit\t\t--\u0026gt;ParallelScavengeHeap::do_full_collection\t\t\t--\u0026gt;PSMarkSweep::invoke_no_policy\t\t\t\t--\u0026gt;PSMarkSweep::mark_sweep_phase2()\t\t\t\t\t--\u0026gt;PSOldGen::precompact()\t\t\t\t\t\t--\u0026gt;PSMarkSweepDecorator::precompact() --\u0026gt;PSYoungGen::precompact()
■网友
泻药。
【Full GC后新生代对象会直接进入老年代吗】
刚刚进行GC后,注意右下角左边一排三个柱子,第一个柱子是老年带,第二个是新生代,第三个是survivor区,发现啥了没上个图不清楚,贴一张高清的。
推荐阅读
- |2020年徐州市青年创新创业大赛决赛暨新生代企业家传承接力活动举行
- 行车智|全新GLA SUV:新生代用户的专属豪华座驾
- 结婚对象的抉择
- 咨读君|交警提醒:即日起,这些汽车禁止上路,已经成为严查对象
- 扬州|扬州三鸟友养鹦鹉被追刑责 警方:爱动物要找对对象
- 金晨|金晨新约会对象遭扒,武汉人讲话台湾腔还疑穿高仿,这个也难成?
- 因为打代码冷落的对象,最后分了,想听听大家的看法
- 陆虎|07届快男陆虎公布恋情,女方是陈曌旭,本尊还艾特错对象让人大笑
- 赛车|情怀致敬新生代,新老捷达战队同台亮相
- 关于 lua 使用c++对象 并添加自定义属性的内存管理问题
