我的應用程序運行在HotSpot jvm 1.8.0_45上,打包好的8GB堆。應用程序嘗試爲新對象分配內存失敗,併發生堆空間OOM錯誤。我查看了堆轉儲,發現大部分空間都被charCCufferCaches的T4CConnection實例佔用。這個緩存爲char數組保存了SoftReferences。我很驚訝SoftReferences在OOM之前沒有發佈。我再次檢查是否有一個這個數組的硬引用,但沒有找到一個。OOM錯誤和怪異的SoftReferences
爲什麼我的應用程序通過SoftReferences持有3GB字符數組時存在堆空間OOM? 爲什麼這個SoftReferences在應用程序需要新內存時不能發佈? T4CConnection對象的
部分表示charBufferCache:用於字符數組
傳入的引用在T4CConnection charBufferCache holded者:
什麼時候被轉儲捕獲?這可能是由於堆棧上的某些東西使數組保持活動狀態,並且由於異常導致堆棧解開後,轉儲中並未反映該數組。而且,OOM的具體類型也很重要,例如,即使釋放軟引用後分配請求可能已滿足,也可能發生超出一個的開銷。使用+ HeapDumpOnOutOfMemoryError JVM選項創建了 – the8472
轉儲。我認爲這個選項產生的快照應該包含OOM錯誤出現時的所有對象和引用。快照中是否有任何參考文獻缺失的機會?另外,我的應用程序沒有通過大幀消耗內存 - 它不會一次嘗試分配2GB對象。 – nukie
是的,我認爲這個選項確實包含了棧根。但OOME的確切類型仍然可能會有所作爲。 – the8472