Java堆内存是在JVM内存中还是外部存储器中?

21
直到今天我知道Java有堆(heap),由JVM创建。此外,操作系统将该内存分配给JVM实例,即堆位于JVM实例内部。 但是今天我看到了一张图片,enter image description here,它显示了JVM和堆相距很远的样子。 所以,我现在感到困惑,是否有人能告诉我,以前我的理解是错误的,还是我没有能够理解这张图片?

@Batty 你好,已经有一段时间了,你能否考虑接受其中一个回答作为你问题的解决方案呢?请选择对你最有帮助或解决你疑惑的那个回答。 - Jorge Campos
x586的图片不正确。通常32位内存模型在内核中使用符号位作为地址。请参考http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/或谷歌搜索**程序内存模型**。 - gavenkoa
5个回答

16

这个问题涉及到很多方面。我喜欢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线程

希望这能帮助您理解。


16

绿色的JVM很可能不是JVM实例,而是驻留在系统内存中的JVM代码,在Java堆内有您期望的JVM实例。

如果您查看下面的图像,会更清晰,您图像中的绿色JVM将在主机操作系统蓝色区域内。

JVM


1
你混淆了两件事情。第一是进程内存。是的,堆是JVM进程内存的一部分。在你的图片中标记为“JVM”的东西很可能是JVM的程序代码。它与堆分离是有道理的。实际上,几乎所有程序都有分离的代码/数据区域;我不确定,但我认为操作系统在其中扮演了一定的角色。

1

JVM只是操作系统上的一个应用程序,因此它将运行在操作系统的内存上。

操作系统将为JVM分配内存(本地 + 堆 + 非堆)。

JVM使用本地内存,而在JVM上运行的应用程序使用堆和非堆。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接