JVM(Java虚拟机)的堆(Heap)是用于存储对象实例的内存区域,是Java运行时数据区的一部分。JVM堆被划分为几个主要区域,每个区域都有特定的用途和管理方式。以下是JVM堆的主要结构及其特点:
1. 新生代(Young Generation)
新生代是堆中用于存储新创建对象的区域。它被进一步划分为两个主要部分:Eden区和两个Survivor区(通常称为S0和S1)。
子区域:
-
Eden区:
- 大部分新创建的对象都首先分配在Eden区。
- 当Eden区满时,存活的对象会被复制到其中一个Survivor区(通常是S0)。
-
Survivor区(S0和S1):
- 用于存放从Eden区复制过来的对象。
- 当一个Survivor区满时,存活的对象会被复制到另一个Survivor区。
- 经过多次复制后仍然存活的对象会被移动到老年代(Old Generation)。
2. 老年代(Old Generation)
老年代用于存储那些经过多次垃圾回收后仍然存活的对象。这些对象通常已经存在了很长时间,并且预计还会继续存活一段时间。
3. 永久代(Permanent Generation)/ 元空间(Metaspace)
在Java 7及之前版本中,永久代用于存储类的元数据(如类的结构信息、方法数据等)。然而,从Java 8开始,永久代被元空间(Metaspace)所取代。
元空间(Metaspace):
- 存储类的元数据。
- 使用本地内存而不是堆内存。
- 大小默认情况下不受限制,可以通过
-XX:MaxMetaspaceSize
参数进行设置。
4. 直接内存(Direct Memory)
直接内存不是JVM堆的一部分,但它也是JVM管理的内存区域之一。直接内存用于NIO(New Input/Output)操作,可以减少数据在JVM堆和本地内存之间的复制,提高性能。
垃圾回收(Garbage Collection)
JVM使用不同的垃圾回收器来管理堆内存中的对象。常见的垃圾回收器包括:
- Serial GC:单线程垃圾回收器,适用于单线程环境。
- Parallel GC:多线程垃圾回收器,适用于多核处理器。
- CMS(Concurrent Mark-Sweep)GC:并发垃圾回收器,适用于低延迟需求的应用。
- G1(Garbage-First)GC:面向大内存的垃圾回收器,旨在提供可预测的暂停时间。
- ZGC:低延迟垃圾回收器,适用于大内存应用。
- Shenandoah GC:低延迟垃圾回收器,适用于大内存应用。
堆的配置参数
可以通过JVM参数来配置堆的大小和其他相关设置:
-
堆总大小:
-Xms
:设置初始堆大小。-Xmx
:设置最大堆大小。
-
新生代大小:
-Xmn
:设置新生代的大小。
-
永久代/元空间大小:
-XX:PermSize
和-XX:MaxPermSize
:用于永久代(Java 7及之前)。-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
:用于元空间(Java 8及之后)。
总结
JVM堆被划分为新生代和老年代,新生代又分为Eden区和Survivor区。老年代用于存储长期存活的对象。元空间用于存储类的元数据。垃圾回收器负责管理堆内存中的对象,确保内存的有效利用和性能优化。通过适当的配置参数,可以调整堆的大小和其他相关设置,以满足不同的应用需求。
以下是一个简单的图示,展示了JVM堆的结构:
+---------------------+
| |
| Old Generation |
| |
+---------------------+
| |
| Survivor S1 |
| |
+---------------------+
| |
| Survivor S0 |
| |
+---------------------+
| |
| Eden |
| |
+---------------------+
标签:Java,Survivor,虚拟机,回收,区域,内存,JVM,垃圾
From: https://blog.csdn.net/xiongjikai/article/details/145185480