在java虚拟机JVM中,内存空间的粗略分配如下图所示: 我们可以这样理解: 1、JVM内存包含堆区(Heap)和非堆区( Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(Java虚拟机栈)、Local Method Statck(本地方法栈)), 2、堆区又包含老一代区(Old Memory)和幼年区(Yong Gen), 3、幼年区又分为Eden Space(伊甸园)、Survivor Space(幸存者区), 4、Survivor Space(幸存者区)有两块区域S0和S1,
为什么要这样分呢? 1、为什么要区分新生代和老生代? 堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存活期一般不长,而老年代中的对象存活期较长,所以当垃圾回收器回收内存时,新生代中垃圾回收效果较好,会回收大量的内存,而老年代中回收效果较差,内存回收不会太多。 2、不同代采用的算法区别? 基于以上特性,新生代中一般采用复制算法,因为存活下来的对象是少数,所需要复制的对象少,而老年代对象存活多,不适合采用复制算法,一般是标记整理和标记清除算法。 因为复制算法需要留出一块单独的内存空间来以备垃圾回收时复制对象使用,所以将新生代分为eden区和两个survivor区,每次使用eden和一个survivor区,另一个survivor作为备用的对象复制内存区。
新闻热点
疑难解答