java - 有可用内存的 OutOfMemoryError

标签 java memory-leaks

我有一个使用 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/

相关文章:

c# - PerfView 无法访问内存

android - context 和 INSTANCE 静态声明的内存泄漏,我该如何改变它?

java - java中的ruby gsub函数,可能是replaceAll?

java - 不断改变JLabel的背景颜色

java - 如何在android中导入XmlAccessorType

node.js - 使用 Node 流时内存不足

ios - 非公共(public) NSURLConnection 泄漏

java - 序列化期间忽略空集合

java - 如何制作在行数可变的选项卡上运行的方法?

c - 子进程中fork()后泄漏,为什么?