Java スレッド プールを使用してバックグラウンドで負荷の高い処理を実行するアプリケーションがあります。
スレッドプールは、実行中に発生した例外をログに記録するように構成されています
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
このメッセージを受け取る他の理由はありますか?