2010-05-11 32 views
2

我有一個配置爲在OOM上創建內存轉儲的Tomcat應用程序服務器,它以-Xmx1024M啓動,因此應該有一個Gigabyte提供給他。內存轉儲比可用內存小得多

現在我發現了一個這樣的轉儲,它只包含260MB的未保留內存。垃圾場如何可能比他應有的規模小得多?

+2

Heap Space或PermGen空間是內存不足異常嗎? – Affe 2010-05-11 05:34:22

+0

+1 @Affe:好問題。出於某種原因,這個異常沒有記錄到日誌文件中,我也必須對此進行調查。 xprof轉儲是否也包含有關已加載類的信息,或僅包含有關堆中對象的信息? – Daniel 2010-05-11 07:27:40

+0

@affe:你說得對,這是一個PermGen錯誤(今天早上在我的日誌中發現它)。請添加這個添加答案,以便我可以接受它。 – Daniel 2010-05-14 07:50:29

回答

2

PermGen的空間是獨立的堆管理,並可以運行了,即使有足夠的可用內存整體。一些Web框架(特別是JSF)是真正的豬,並且很容易導致默認配置用完。可以用-XX增加:MaxPermSize = ### m

請記住系統空間受堆和permgen的總和限制,所以在開始獲取無法創建本機線程OOM例外之前,您可以佔用更少的總資源如果你不減少PermGen增加的數量。

2

只有關於分配內存使用情況的信息纔會被轉儲到文件中。 堆轉儲不是堆的二進制映像,它包含有關數據類型等的信息,可能會超出可用內存。

Text (classic) Heapdump file format

+0

+1正確,我知道,但它怎麼會是約。只有可用內存大小的25%? – Daniel 2010-05-11 07:28:35

+1

@Daniel對於更大的對象,與其實際內存分配相比,heapdump中的表示將很小。 – stacker 2010-05-11 08:39:24

+0

這是爲什麼呢?我知道對象被對齊到8個字節,但這不是最大差異的解釋。 – Daniel 2010-05-11 10:07:15