我有一个使用 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
出现此消息?
最佳答案
当内存分配失败时,您将得到一个 OutOfMemoryError。
这可能发生在什么时候
- 你的内存用完了。
- 您的 GC 转向参数阻止它使用所有内存。例如为未满的世代设置最小尺寸。
- 你分配了一大块内存。在此失败后,您立即仍有可用内存,只是不足以分配大块。
- 你得到一个 OutOfMemoryError,它不是针对堆的,例如PermGen 或直接内存或虚拟内存(用于线程等)
关于java - 有可用内存的 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13270232/