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的对比示意参见:Full GC后新生代对象会直接进入老年代吗

可见,一般情况下,年轻代的存活对象都被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后新生代对象会直接进入老年代吗
【Full GC后新生代对象会直接进入老年代吗】
刚刚进行GC后,注意右下角左边一排三个柱子,第一个柱子是老年带,第二个是新生代,第三个是survivor区,发现啥了没上个图不清楚,贴一张高清的。Full GC后新生代对象会直接进入老年代吗


    推荐阅读