當與堆空間不足相關的異常被拋出時,我增加了Java Xmx內存限制。但是,我目前正在經歷很長的執行時間,可能與內存有關,但我還沒有看到拋出的異常(還)。JVM是否交換堆?
我想知道可能會佔用很長的執行時間。 JVM是否將堆交換到磁盤?
我使用的HotSpot 1.6.0更新34
當與堆空間不足相關的異常被拋出時,我增加了Java Xmx內存限制。但是,我目前正在經歷很長的執行時間,可能與內存有關,但我還沒有看到拋出的異常(還)。JVM是否交換堆?
我想知道可能會佔用很長的執行時間。 JVM是否將堆交換到磁盤?
我使用的HotSpot 1.6.0更新34
JVM不交換到磁盤,不。操作系統可能會這樣做。你可以通過檢查你的操作系統統計數據來檢測這個過程。
由於JVM耗盡內存,垃圾收集越來越頻繁地觸發。每次運行可釋放更少的內存,進一步提高GC的速度。最終在GC中花費了大量時間,這可能是您看到的放緩時間。
JVM不會等到0字節被釋放纔會拋出OutOfMemoryError
。當GC相對於釋放的字節數而言花費太長時間時,它實際上會放棄。
更大的堆的一個可能的後果是GC倍多 - JVM已經分析了較大的空間,因此它需要更長的時間 - 特別是如果其一個停止世界的GC。
你可以充實一下你的問題嗎?
您使用的堆大小是多少?你看到什麼持續時間?什麼是你的應用程序中的對象的使用模式?例如,一些長壽命的物體或許多短命的物體。
我將Xmx設置爲2GB,並且正在使用3GB進行重試。單線程執行以2GB拋出堆空間異常。我用3GB運行了15分鐘,並沒有拋出,但我不能確定3GB是否足夠,因爲總執行時間將達到數百小時。如果高位標記有可能達到15分鐘,那麼使用3GB作爲我的網格(9節點)運行限制似乎是值得的。我將在9個節點上運行9個對象,希望能持續時間的1/9。 – H2ONaCl
交換是我想的操作系統行爲。 – StarPinkER