繁体   English   中英

为什么我的Java堆转储仅显示一半的堆?

[英]Why does my Java heap dump show only half the heap?

我故意在数据结构中添加项目,直到Java抛出OutOfMemoryError ,然后使用-XX:+HeapDumpOnOutOfMemoryError抓取堆转储。 我正在使用-Xmx100M ,所以我希望堆转储将显示将近100MB的活动对象,但它只会显示46MB。

如果只有46MB的活动对象,为什么Java会用100MB的堆抛出OOM?

(我意识到我很可能没有提供足够的信息来回答这个问题,但是我不确定有什么意义。很高兴根据需要添加更多信息。)

编辑: -verbose:gc输出的结尾:

 [Full GC (Ergonomics) [PSYoungGen: 1056K->64K(2560K)] [ParOldGen: 7116K->7116K(7168K)] 8173K->7180K(9728K), [Metaspace: 5981K->5981K(1056768K)], 0.0071141 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
 [Full GC (Allocation Failure) [PSYoungGen: 64K->0K(2560K)] [ParOldGen: 7116K->7075K(7168K)] 7180K->7075K(9728K), [Metaspace: 5981K->5974K(1056768K)], 0.0190392 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
 java.lang.OutOfMemoryError: Java heap space

堆分为年轻一代和老一代两个部分。 当例如老一代人已满或支离破碎时,您将获得OOM,从而不可能将对象从年轻一代提升到老一代(可能还有其他)。

如果使用-verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log记录GC使用情况,那么您将看到每个世代的大小。

您可以在此处查看如何调整世代大小:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM