gpt4 book ai didi

java - 堆转储!=虚拟内存?

转载 作者:行者123 更新时间:2023-12-01 14:18:04 24 4
gpt4 key购买 nike

并不是真正了解 Java,尤其是 Java 调试,但使用 Monitoring 在 Jenkins 中进行堆转储然后在 Eclipse 中使用 MAT 对其进行解码显示总内存使用量为 169.4 MB,而在 Jenkins 监控中,内存似乎经常被大量使用,并且 GC 运行频繁。 -XmX为4G。

为什么我使用 MAT 只能获得 169.4 MB?可能是因为在进行转储之前 Jenkins 执行了 GC?如果是这样,我可以避免看到完整的内存转储吗?

最佳答案

理解内存

是的,Java 堆转储和虚拟内存转储(在 Windows 上称为“崩溃转储”或“内存转储”)是不同的东西。

Java 堆转储仅包含与 Java 相关的内存,即 Java 对象所在的位置。使用 MAT(如您所述)或 Java Heap Analysis Tool 等工具分析 Java 堆转储。

(用户模式)进程的 Windows 故障转储包含所有虚拟内存,其中虚拟内存是提供内存的操作系统的术语。在 Windows 上,这是通过 VirtualAlloc 分配的所有内存.

操作系统虚拟内存将包括 Java 堆,因为 Java 只能从操作系统请求内存。

因此,在比较内存大小时,了解该工具是特定于 Java 还是通用操作系统非常重要。

在您的情况下,Monitoring 看起来很像一个通用工具,因为它处理进程列表和 CPU 时间,似乎没有什么是特定于 Java 的。另一方面,MAT 从其描述来看显然是一个 Java 工具。

内存差异

那么 Java 堆大小与虚拟内存大小可以相差多少?

很多:

  1. 加载的 EXE/DLL 占用虚拟内存,但不占用 Java 堆
  2. 本地代码(例如通过 JNI)使用的内存计入虚拟内存,但不计入 Java 堆
  3. Java 从操作系统请求的内存,但尚未被 Java 使用,肯定是虚拟内存,但从 Java 的角度来看可以报告为“空闲”。

关于java - 堆转储!=虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32780222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com