直到今天我知道Java有堆(heap),由JVM创建。此外,操作系统将该内存分配给JVM实例,即堆位于JVM实例内部。
但是今天我看到了一张图片,
,它显示了JVM和堆相距很远的样子。
所以,我现在感到困惑,是否有人能告诉我,以前我的理解是错误的,还是我没有能够理解这张图片?
![enter image description here](https://istack.dev59.com/Uieu9.webp)
这个问题涉及到很多方面。我喜欢IBM的文章,因为它们包含很好的信息。针对这个特定的问题,以下是摘录:
来自IBM的 The native and Java heaps 文章:
JVM维护两个内存区域:Java™堆和本地(或系统)堆。这两个堆具有不同的目的,并由不同的机制维护。
Java堆包含Java对象的实例,通常称为“堆”。垃圾回收(Garbage Collection)维护Java堆,并且命令行堆设置更改Java堆。Java堆使用mmap分配,如果请求大页支持则使用shmat。即使最小堆大小设置较低,JVM启动期间预分配了Java堆的最大大小作为一个连续的区域。这种分配方式允许通过堆扩展将人工堆大小限制向实际堆大小限制移动。
本地或系统堆由操作系统的基础malloc和free机制使用来分配,用于特定Java对象的底层实现,例如:
- AWT和Swing需要的Motif对象
- 数据压缩例程的缓冲区,是Java类库读取或写入压缩数据(如.zip或.jar文件)所需的内存空间。
- 应用程序JNI代码使用的Malloc分配
- 即时(JIT)编译器生成的编译代码
- 线程映射到Java线程
希望这能帮助您理解。
绿色的JVM很可能不是JVM实例,而是驻留在系统内存中的JVM代码,在Java堆内有您期望的JVM实例。
如果您查看下面的图像,会更清晰,您图像中的绿色JVM将在主机操作系统蓝色区域内。
JVM只是操作系统上的一个应用程序,因此它将运行在操作系统的内存上。
操作系统将为JVM分配内存(本地 + 堆 + 非堆)。
JVM使用本地内存,而在JVM上运行的应用程序使用堆和非堆。
Java使用堆内存和堆外内存。您可以在http://www.slideshare.net/slideshow/embed_code/27597947?startSlide=7中查看完整的内存布局。