在学习jvm堆空间时,了解到堆中年轻代分为三个区域:伊甸园区和两个幸存者区,当伊甸园区满了之后会使用gc回收不再被引用的对象销毁,剩余对象在两个幸存者区之间倒腾
但是为什么要两个幸存者区,我一个幸存者区不就行了?伊甸园剩下的直接放到这个幸存者区,再加一个计数的不就行了。
主要原因是内存碎片!何为内存碎片,就是没法使用的内存,下面来介绍一下(其实内存碎片分为内部碎片和外部碎片,这里指的是外部碎片)
看一个例子来理解
当产生内存碎片时,会调用full gc来整理内存
然后就可以放了
但是我们知道,Full GC最终会导致JVM暂停较长时间,十分影响效率,因此为了解决内存碎片所带来的麻烦,再划分一个幸存者区,将gc回收之后的from幸存区倒腾到to幸存者区,就可以避免这种问题,是一种空间换时间的思路