新生代一个Survivor区会怎么样

我们了解的基础上,新生代一定要有2个Survivor,如果一个Survivor呢,或者说就不要存在Survivor会发生什么?

没有Survivor,Eden区每次进行一次Minor GC,存活的对象就会被送到老年代。

老年代将很快被填满,触发Major GC。进行一次Full GC消耗的时间比Minor GC长得多,这很影响大型程序的执行和响应速度

没有Survivor解决办法就是 

1.加大老年代空间,降低Full GC频率。缺点就是每次Full GC时间很长。
2.减小老年代空间,降低Full GC每次时间。缺点就是Full GC频率提高。

建立一块Survivor区

新建的对象在Eden中,一旦Eden满了,触发Minor GC,Eden中的存活对象就会被移动到Survivor区。下一次Eden满了的时候,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象放到Survivor区,这两部分对象所占有的内存空间是不连续的,导致了内存碎片化。 

内存碎片的后果

内存碎片严重影响JAVA程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间,如果程序中要使用一个连续内存空间的大对象。直接内存溢出。

建立两块Survivor区

新建的对象在Eden中,经历Minor GC,Eden中的存活对象就会被移动到第一块S0,
Eden清空,等Eden区满了,就再触发Minor GC。Eden和S0中的存活对象又会被复制送入第二块S1( 复制到S1过程中采用复制算法,这个保证了连续内存空间,不会出现内存碎片化)。如此循环往复。一旦survivor放不下,直接会被送到老年代中。

这样保证了有一个survivor space是空的,另一个非空的survivor space无碎片。如果建立二块survivor以上没有必要,完全是在浪费。

假设有二个survivor space是空的,另一个非空的survivor space无碎片。有什么意思?


猜你喜欢

转载自blog.csdn.net/m0_37444820/article/details/81045167