目录
- 1. 说明
- 2. 年轻代(Young Generation)
- 2.1 说明
- 2.2 Eden区
- 2.3 Survivor区
- 3. 老年代(Old Generation)
- 3.1 说明
- 3.2 对象存放
- 3.3 垃圾回收
- 4. jdk7及之前
- 5. jdk8及之后
1. 说明
- 1.JVM堆的内部结构主要包括年轻代(Young Generation)和老年代(Old Generation),这种划分是基于对象的存活时间和使用特点来进行的。
2. 年轻代(Young Generation)
2.1 说明
- 1.年轻代是堆内存的一部分,主要用于存放新生成的对象。
- 2.由于新生成的对象大多都很快变得不可达,因此年轻代的设计目标是尽快回收这些对象所占用的内存。
2.2 Eden区
- 1.新生成的对象首次会尝试在Eden区中分配内存。
- 2.Eden区是年轻代中最大的区域,用于存放大多数新生成的对象。
2.3 Survivor区
- 1.Survivor区被划分为两个相等的部分,通常称为From Survivor(S0)和To Survivor(S1),或者简称为S0和S1。
- 2.在发生Minor GC(年轻代垃圾回收)时,存活的对象会从Eden区和当前的Survivor区(比如S0)复制到另一个Survivor区(比如S1),然后清空原来的区域。
- 3.经过多次Minor GC后,仍然存活的对象会被转移到老年代中。
3. 老年代(Old Generation)
3.1 说明
- 1.老年代是堆内存的一部分,用于存放那些经过多次年轻代垃圾回收后仍然存活的对象。
- 2.这些对象通常生命周期较长,因此老年代的设计目标是提供稳定的内存空间,
- 3.以减少垃圾回收的频率和开销。
3.2 对象存放
- 1.当年轻代中的对象存活时间较长,或者年轻代空间不足无法容纳新生成的对象时,这些对象会被转移到老年代中。
3.3 垃圾回收
- 1.老年代的垃圾回收通常称为Major GC或Old GC。
- 2.由于老年代中的对象存活时间较长,因此Major GC通常比Minor GC更耗时。
- 3.Major GC会扫描整个老年代空间,并回收那些不再被引用的对象所占用的内存。
4. jdk7及之前
- 1.堆结构图。
- 2.Java 7及之前堆内存逻辑上分为三部分:新生区+养老区+永久区。
- 3.新生区:Young Generation Space,Young/New。
- 4.新生区被划分为Eden区和Survivor区。
- 5.养老区:Tenure generation space,Old/Tenure。
- 6.永久区:Permanent Space,Perm。
5. jdk8及之后
-
1.堆结构图。
-
2.Java 8及以后堆内存逻辑上分为三部分:新生区+养老区+元空间。
-
3.新生区:Young Generation Space,Young/New。
-
4.新生区被划分为Eden区和Survivor区。
-
5.养老区:Tenure generation space,Old/Tenure。
-
6.元空间:Meta Space,Meta。