我有一個應用程序在後臺使用java線程池執行一些繁重的處理。OutOfMemoryError具有可用內存
線程池被配置爲記錄異常的執行
public enum ExceptionLogger implements Thread.UncaughtExceptionHandler {
INSTANCE;
private static final Logger log = LoggerFactory.getLogger(ExceptionLogger.class);
@Override
public void uncaughtException(Thread t, Throwable e) {
log.error("Exception occurred at thread " + t.getName() + "\n", e);
}
}
在我的應用程序的日誌,我隨機得到java.lang.OutOfMemoryError: Java heap space
但如果我登錄使用Runtime.getRuntime().freeMemory()
內存使用情況,我可以看到很多免費的堆空間時發生可用。
此外,我得到這個異常後應用程序繼續工作。
是否有任何其他原因使此消息變得OutOfMemoryError
?
+1 - 另一種情況是當新線程堆棧沒有足夠內存時。 –
我認爲虛擬內存不足,但也可能缺少交換空間。 –
另一種可能性是你的堆堆滿了無法訪問的對象,因爲至少有一個線程持有「GC鎖定器」互斥鎖(當例如JNI代碼使用GetPrimitiveArrayCritical時,它保留着)。當鎖被鎖定時,Hotspot似乎從不執行任何GC。 –