直到今天我才知道java有堆,而且是由JVM创建的。此外,该内存由OS分配给JVM实例,即堆驻留在JVM实例中。
但是今天我看到了一张照片,
表明,JVM与堆相距很远。
所以,我现在很困惑,任何人都可以让我知道,我之前是否错了,或者我无法理解这张照片?
答案 0 :(得分:14)
绿色的JVM很可能不是JVM实例,而是驻留在系统内存中的JVM代码,在Java堆中有您期望的JVM实例。
如果您看下面的图像更清楚,图像中绿色的JVM将位于主机操作系统蓝色区域内
答案 1 :(得分:13)
在这个问题上有很多讨论。我总是喜欢IBM的文章,因为它包含非常好的信息。对于这个具体问题,这里有一段摘录。
来自The native and Java heaps article on IBM:
JVM维护两个内存区域,Java™堆和本机(或 系统)堆。这两个堆有不同的用途 由不同机制维护。
Java堆包含Java对象的实例,并且经常出现 被称为“堆”。它是由Java维护的 垃圾收集,它是由Java更改的Java堆 命令行堆设置。使用mmap或分配Java堆 shmat如果请求大页面支持。 Java的最大大小 堆在JVM启动期间预先分配为一个连续区域,甚至 如果最小堆大小设置较低。这种分配允许 最小堆大小设置强加的人工堆大小限制 通过堆扩展移动到实际的堆大小限制。
使用底层分配本机或系统堆 malloc和操作系统的自由机制,用于 特定Java对象的底层实现;例如:
- AWT和Swing所需的Motif对象
- 数据压缩例程的缓冲区,它是Java类库读取或写入压缩数据所需的内存空间 比如.zip或.jar文件。
- 应用程序JNI代码的Malloc分配
- Just In Time(JIT)编译器生成的编译代码
- 要映射到Java线程的线程
希望它能帮助你理解。
答案 2 :(得分:1)
你混淆了两件事。第一个是进程内存。是的,堆是JVM进程内存的一部分。您图片中标记为“JVM”的内容很可能是JVM的程序代码。它与堆分开是有道理的。实际上,几乎所有程序都有独立的代码/数据区域;我不确定,但我认为操作系统对此负有部分责任。
答案 3 :(得分:1)
jvm只是OS上的一个应用程序,因此它将在OS的memroy上运行。
操作系统将为JVM分配内存(本机+堆+非堆)。
jvm使用本机内存和在JVM上运行的应用程序使用堆和非堆。
答案 4 :(得分:1)
Java正在使用堆和堆外内存。您可以检查完整的内存布局 http://www.slideshare.net/slideshow/embed_code/27597947?startSlide=7