一:JVM内存为什么要分成新生代,老年代,永久代(元空间)?
因为对象的生命周期不一样,有的对象生命周期很短,这样的对象会高频率的触发垃圾回收;有的对象生命周期比较长,就可以被低频率的垃圾回收。每一部分使用到的垃圾回收算法也会不同。所以JVM根据对象在内存中存活时间的长短,把堆内存分为新生代(包括一个Eden区、两个Survivor区)和老年代(Tenured或Old)。Perm代(永久代,Java 8开始被“元空间”取代)属于方法区了,而且仅在Full GC时被回收。
二:新生代中为什么有两个Survivor区?为什么每次只使用其中一个呢?
这就跟新生代采用的垃圾回收算法有关,新生代用的是“复制”算法,复制算法的特点是(空间换时间)牺牲一定的空间成本,来换取高效率的垃圾回收,此算法不会产生内存碎片,回收后内存比较规整。