簡體   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