Java 堆在 jvm 内存内部还是外部?
直到今天,我知道java有堆,这是由JVM创建的。此外,该内存由操作系统分配给JVM实例,即堆驻留在JVM实例内。
但今天我看到了一张照片,
这表明,JVM和堆相距甚远。
所以,我现在很困惑,谁能告诉我,我以前是错了还是看不懂图片?
直到今天,我知道java有堆,这是由JVM创建的。此外,该内存由操作系统分配给JVM实例,即堆驻留在JVM实例内。
但今天我看到了一张照片,
这表明,JVM和堆相距甚远。
所以,我现在很困惑,谁能告诉我,我以前是错了还是看不懂图片?
在这个问题上有很多值得讨论的地方。我总是喜欢IBM的文章,因为它包含非常好的信息。对于这个具体问题,这里有一个摘录。
JVM 维护两个内存区域:Java™ 堆和本机(或系统)堆。这两个堆具有不同的用途,并由不同的机制进行维护。
Java 堆包含 Java 对象的实例,通常称为“堆”。它是由垃圾回收维护的 Java 堆,也是由命令行堆设置更改的 Java 堆。Java 堆是使用 mmap 分配的,如果请求了大页面支持,则使用 shmat 进行分配。Java 堆的最大大小在 JVM 启动期间作为一个连续区域预先分配,即使最小堆大小设置较低也是如此。此分配允许最小堆大小设置施加的人为堆大小限制在堆扩展时向实际堆大小限制移动。
本机或系统堆是通过使用操作系统的底层malloc和free机制分配的,并用于特定Java对象的基础实现;例如:
- AWT 和 Swing 所需的图案对象
- 数据压缩例程的缓冲区,它们是 Java 类库读取或写入压缩数据(如.zip或.jar文件)所需的内存空间。
- 按应用程序划分的 Malloc 分配 JNI 代码
- 由实时 (JIT) 编译器生成的编译代码
- 要映射到 Java 线程的线程
希望它能帮助你理解。
绿色的 JVM 很可能不是 JVM 实例,而是驻留在系统内存中的 JVM 代码,在 Java 堆内有您期望的 JVM 实例。
如果您看下面的此图像,它会更清晰,图像中绿色的JVM将位于主机操作系统蓝色区域内。