首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆转储!=虚拟内存?

堆转储!=虚拟内存?
EN

Stack Overflow用户
提问于 2015-09-25 10:29:50
回答 3查看 722关注 0票数 3

不太了解Java,尤其是在Java中调试,但是在Jenkins中使用监控进行堆转储,然后在Eclipsewith垫子中解码它,显示了使用了169.4 MB的总内存,而在Jenkins监控中,内存似乎经常被使用,GC经常运行。-XmX是4G。

为什么我只有169.4 MB的垫子?可能是因为在进行转储之前Jenkins执行GC吗?如果是这样的话,我能避免看到完整的内存转储吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-30 17:10:23

理解记忆

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

Java堆转储只包含与Java相关的内存,即Java对象所在的位置。Java堆转储使用MAT (如您提到的)或Java堆分析工具之类的工具进行分析。

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

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

因此,在比较内存大小时,重要的是要了解该工具是特定于Java的还是OS通用的。

在您的例子中,监控看起来很像一个通用工具,因为它处理的是进程列表和CPU时间,没有什么似乎是Java特定的。另一方面,MAT显然是一个Java工具。

记忆差异

那么,Java堆大小与虚拟内存大小有多少不同呢?

很多:

  1. 将EXEs/DLL帐户加载到虚拟内存,但不加载到Java堆
  2. 本机代码(例如通过JNI)帐户将内存用于虚拟内存,但不用于Java堆
  3. Java从操作系统请求的内存(但Java尚未使用)肯定是虚拟内存,但从Java的角度可以报告为“空闲”。
票数 3
EN

Stack Overflow用户

发布于 2015-09-27 12:46:03

显然,收集堆转储的工具执行GC以减小转储的大小。由于可以是GCed的东西不应该产生OOM,这是为了查找内存泄漏,而不是对内存使用进行故障排除。

票数 1
EN

Stack Overflow用户

发布于 2016-08-05 17:25:40

VM请求虚拟内存来存储各种数据。然后,VM分配一些内存来存储变量(即堆)、本机代码(不是堆)、保留一些尚未使用的内存。因此,虚拟内存比堆大。考虑到可以编写简单的无限递归(堆将几乎与虚拟内存一样大)或在hello world程序中加载大型dll (堆比虚拟内存小得多),堆和虚拟内存之间没有任何明显的关联。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32780222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档