首页 > 解决方案 > macOS 上 Java 上的 OutOfMemoryError

问题描述

我正在开发一个 Java 服务器应用程序,它曾经在运行 Debian 的 PC 上运行良好。最近,我将它移到了带有 macOS High Sierra 的 MacMini 上。几周来一切似乎都运行良好,直到最近,我几乎每天都会遇到一次随机的 OutOfMemoryErrors。当它发生时,服务器应用程序似乎停止响应大多数请求,我需要杀死它并重新启动它。

当它发生时,在活动监视器上,我的服务器应用程序使用大约 2GB 或 4GB,这远低于我为应用程序设置的限制(即 -Xmx8G)。

我不知道我应该去哪里解决这个问题,我需要你的洞察力。

一些注意事项:MacMini 有 16GB。服务器在 Java SDK 1.8 上无头运行。它在 GNU 屏幕下启动。该应用程序使用大量 HashMap 并使用 Lucene 和 FSDirectory 来索引文档和管理查询。

编辑:这是错误的一个例子:

Exception in thread "NRT Reopen Thread" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:717)
    at org.apache.lucene.index.ConcurrentMergeScheduler.merge(ConcurrentMergeScheduler.java:553)
    at org.apache.lucene.index.IndexWriter.maybeMerge(IndexWriter.java:2247)
    at org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:511)
    at org.apache.lucene.index.StandardDirectoryReader.doOpenFromWriter(StandardDirectoryReader.java:293)
    at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:268)
    at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:258)
    at org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:140)
    at org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:156)
    at org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:58)
    at org.apache.lucene.search.ReferenceManager.doMaybeRefresh(ReferenceManager.java:176)
    at org.apache.lucene.search.ReferenceManager.maybeRefreshBlocking(ReferenceManager.java:253)
    at org.apache.lucene.search.ControlledRealTimeReopenThread.run(ControlledRealTimeReopenThread.java:226)

标签: javamemoryserverout-of-memory

解决方案


推荐阅读