发布于 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堆大小与虚拟内存大小有多少不同呢?
很多:
发布于 2015-09-27 12:46:03
显然,收集堆转储的工具执行GC以减小转储的大小。由于可以是GCed的东西不应该产生OOM,这是为了查找内存泄漏,而不是对内存使用进行故障排除。
发布于 2016-08-05 17:25:40
VM请求虚拟内存来存储各种数据。然后,VM分配一些内存来存储变量(即堆)、本机代码(不是堆)、保留一些尚未使用的内存。因此,虚拟内存比堆大。考虑到可以编写简单的无限递归(堆将几乎与虚拟内存一样大)或在hello world程序中加载大型dll (堆比虚拟内存小得多),堆和虚拟内存之间没有任何明显的关联。
https://stackoverflow.com/questions/32780222
复制相似问题