JVM的堆内存是按照新生代和老年代进行分代的,这种分代的设计是为了更高效地处理不同生命周期的对象。在JDK 1.7和JDK 1.8中,堆内存的分代设计略有不同,下面将对两个版本进行详细解释。
JDK 1.7中的分代堆结构
在JDK 1.7中,堆内存一般被分为三个区域:新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为三个区:Eden区、SurvivorFrom、ServivorTo区,三个区的默认比例为:8:1:1。
-
新生代(Young Generation):
- Eden区:新创建的对象首先被分配到Eden区。
- Survivor区:Eden区中经过一次Minor GC(新生代的垃圾收集)后仍然存活的对象会被移动到Survivor区,同时也会有一部分对象从一个Survivor区移到另一个Survivor区。
-
老年代(Old Generation):
- 存放长期存活的对象,一般需要经过多次Minor GC后才会晋升到老年代。
-
永久代(Permanent Generation):
- 用于存放类的元数据、常量池等信息,这部分空间在JDK 1.8中被移除,取而代之的是元空间(Metaspace)。
JDK 1.8中的分代堆结构
在JDK 1.8中,移除了永久代,取而代之的是元空间(Metaspace)。
-
新生代和老年代:
- 新生代和老年代的概念和处理方式基本保持不变,但这两代的空间布局、内存分配和回收策略得到了一些优化,例如G1垃圾收集器的引入等。
-
元空间(Metaspace):
- 元空间被用来替代永久代,它存放类的元数据,和类相关的字符串常量池等。相比于永久代,元空间的大小可以动态调整,减少了一些永久代的常见问题例如内存溢出等。
值得注意的是,从JDK 9开始,永久代被彻底移除,之后的版本仍然沿用元空间来代替。这些改进使得JVM在内存管理方面变得更加灵活和高效。