【问题标题】:How does Hotspot Java/JVM store memory?Hotspot Java/JVM 如何存储内存?
【发布时间】:2013-08-01 14:48:12
【问题描述】:

除了这些地方之外,hostspot JVM 进程是否还有其他地方存储内存:

  • 烫发
  • 终身代
  • 伊甸园空间
  • 来自太空
  • 到太空
  • 代码缓存

也就是说:热点进程有哪些可能的方式可以在机器上保留和提交内存,以使所述内存不会显示在其中一个位置的统计信息中?

我能想到的一些答案(如果是真的,请告诉我):

  • 用于线程堆栈的虚拟内存未以这些数字表示
  • 任何加载的 dll 或文件。

编辑:

给出了一些其他答案:

  • java.exe 本身
  • JNI 方法可以自己分配内存
  • 任何本机代码(例如来自 dll)都可以分配内存。
  • 用于自行运行的常规 JVM 元数据。

【问题讨论】:

  • 本机代码将分配自己的内存。严格来说,这在 JVM 之外运行,但它会导致您的程序使用更多内存,然后报告这些数字。
  • 请记住,以上所有“空格”都代表一个特定的 JVM 系列(热点)——没有什么可以说每个 JVM 都有一个“伊甸园空间”或一个“到空间” ”。几乎所有 JVM 进程中存在的三个主要空间是主对象堆、用于类信息和代码的堆以及 JVM 内部使用的“非 Java”堆。 (有人可能会说执行堆栈是另一个“空间”,或者将其视为“非 Java”。)

标签: java memory jvm jvm-hotspot


【解决方案1】:

到目前为止,您是正确的(DLL 包括所有 JNI 库以及它们分配的任何内存)。 VM 也有自己的代码(例如,java 的内容)、关于分配给 Java 程序的内存的簿记信息,以及 VM 代理可能使用的内存。基本上,您在第一个列表中描述的是构成虚拟机“运行内存”的项目; JVM 内存的其余部分是代表虚拟机“硬件”的所有项目,例如将其连接到操作系统网络、图形等的库。

【讨论】:

  • memory mapped files 也不会出现在堆/代码缓存统计信息中吗?
  • 您是在谈论 Java 中的内存映射文件吗?这样做的唯一方法是使用Buffers,但在这种情况下,您会看到Buffer 的Java 字段使用了一些内存,但映射的内存区域却没有。操作系统是否以及如何将映射内存计入 JVM 进程取决于操作系统。
  • 不是要把映射的内存计入JVM虚拟内存空间吗?那这个过程还能怎么读呢?
  • 内存统计因操作系统而异,内存映射(包括可执行代码)的处理方式尤其多变。记帐与实际设置描述符表不同,对于任何存储支持的内存都必须这样做。
猜你喜欢
  • 2020-10-28
  • 2012-08-30
  • 2013-07-27
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2021-05-13
相关资源
最近更新 更多