Java堆转储表明,在OutOfMemory异常之后,使用的堆大小比实际堆定义小30%
在JVM抛出Java堆转储表明,在OutOfMemory异常之后,使用的堆大小比实际堆定义小30%,java,garbage-collection,jvm,heap-dump,eclipse-memory-analyzer,Java,Garbage Collection,Jvm,Heap Dump,Eclipse Memory Analyzer,在JVM抛出OutOfMemory异常之后,我正在分析一些堆转储。我正在Windows2008R2平台上使用HotSpotJDK1.7(64位)。应用服务器是JBoss 4.2.1GA,通过启动 它是通过以下参数启动的: wrapper.java.additional.2=-XX:MaxPermSize=256m wrapper.java.initmemory=1498 wrapper.java.maxmemory=3000 wrapper.java.additional.19=-XX:+Hea
OutOfMemory
异常之后,我正在分析一些堆转储。我正在Windows2008R2平台上使用HotSpotJDK1.7(64位)。应用服务器是JBoss 4.2.1GA,通过启动
它是通过以下参数启动的:
wrapper.java.additional.2=-XX:MaxPermSize=256m
wrapper.java.initmemory=1498
wrapper.java.maxmemory=3000
wrapper.java.additional.19=-XX:+HeapDumpOnOutOfMemoryError
这意味着:
-Xms1498m-Xmx3000m-XX:MaxPermSize=256m-XX:+HeapDumpOnAutoFMemoryError
还有一些其他GC&JMX配置参数
我的问题是,当我使用MAT分析由于OutOfMemoryException
而创建的堆转储时,总是显示2.3G或2.4G的堆大小。我已经在MAT中启用了保留不可访问对象的选项,所以我不认为MAT正在修整堆
java.lang.RuntimeException: java.lang.OutOfMemoryError: GC overhead limit exceeded
或
MAT中的摘要:
Size: 2.3 GB Classes: 21.7k Objects: 47.6m Class Loader: 5.2k
我的实际堆文件大小约为3300KB,因此它们符合我的3000m最大堆大小设置
那么MAT中缺失的500-600M内存在哪里呢?为什么MAT只显示我的堆大小为2.4G
SO上的其他帖子倾向于指出是JVM在转储堆之前进行了一些GC,但是如果丢失的500M是由于GC造成的,那么为什么它会首先抛出OOM呢?如果GC实际上可以清除500米(或我堆的近25%),JVM真的内存不足吗
有没有办法调整堆转储,以便我可以获得堆的完整图片(包括缺少的500米)
如果没有,我发现我真的很难找到如何/为什么我会首先遇到这些OOM
根据某人的请求,我正在从一个活动节点附加一个jstat-gc1000
的输出:。您正在使用哪个gc?
您可能缺少Eden,请尝试使用哪个GC?
您可能缺少Eden,请尝试使用
java.lang.OutOfMemoryError:超出GC开销限制
这并不一定意味着堆已满,请参阅
java.lang.OutOfMemoryError:java堆空间
这并不意味着堆剩下0个字节,而是意味着无法满足分配请求。如果有东西试图分配600MB,但只剩下500MB,那么这将抛出一个OOME
如果没有,我发现我真的很难找到如何/为什么我会首先遇到这些OOM
获取堆栈跟踪以查看执行相关分配的调用站点是否有任何可疑行为将是一个开始。或者您可以尝试增大堆大小,看看问题是否消失
java.lang.OutOfMemoryError:超出GC开销限制
这并不一定意味着堆已满,请参阅
java.lang.OutOfMemoryError:java堆空间
这并不意味着堆剩下0个字节,而是意味着无法满足分配请求。如果有东西试图分配600MB,但只剩下500MB,那么这将抛出一个OOME
如果没有,我发现我真的很难找到如何/为什么我会首先遇到这些OOM
获取堆栈跟踪以查看执行相关分配的调用站点是否有任何可疑行为将是一个开始。或者您可以尝试改变堆大小,看看问题是否消失。据我所知,它使用的是默认GC,据我所知,是ParallelGC。你能分享你的jstat输出吗?我应该为jstat
使用你想看到的任何特定选项/配置吗?jstat-gc PID 1000应该足够了。显然,访问生产JVM来运行jstat并不像我想象的那么简单,需要几个不同级别的干预。统计数据有多重要?据我所知,它使用的是默认GC,据我所知,是ParallelGC。你能分享你的jstat输出吗?我应该为jstat
使用你想看到的任何特定选项/配置吗?jstat-gc PID 1000应该足够了。显然,访问生产JVM来运行jstat并不像我想象的那么简单,需要几个不同级别的干预。统计数据有多重要?我意识到,GC开销限制超过了
并不意味着它已满,而是意味着它无法回收足够的空间。然而,如果它不需要
来回收额外的空间,它就会抛出这种类型的异常,这似乎很奇怪。在java中,我无法想象在一次调用中分配500MB内存块的任何方式。可能是初始分配给一个数组或哈希表等,但除此之外,我无法想象任何东西会分配这么大的内存块。我是否遗漏了一些明显的东西?我意识到,GC开销限制超过了
并不意味着它已满,而是它无法回收足够的空间。然而,如果它不需要来回收额外的空间,它就会抛出这种类型的异常,这似乎很奇怪。在java中,我无法想象在一次调用中分配500MB内存块的任何方式。可能是初始分配给一个数组或哈希表等,但除此之外,我无法想象任何东西会分配这么大的内存块。我是否遗漏了一些明显的内容?MAT只是打印了一个存储在堆转储文件头中的数字。这个数字并没有说明转储文件中对象图的完整性。MAT只是打印一个存储在堆转储文件头中的数字。这个数字并没有说明转储文件中对象图的完整性。
Size: 2.3 GB Classes: 21.7k Objects: 47.6m Class Loader: 5.2k