【问题标题】:OutOfMemoryError: Java heap space in solr, but heap is not fullOutOfMemoryError:solr 中的 Java 堆空间,但堆未满
【发布时间】:2015-05-30 18:48:47
【问题描述】:

前提:我是java问题的新手,但我正在努力理解。

我在高负载下的 SOLR 实例中遇到“OutOfMemoryError: Java heap space”(许多并发请求处于只读状态)。

我发现在这些情况下的一般解决方案是使用-Xmx 参数增加最大堆大小,但是查看 jconsole 上的数据我发现只有 1G 总堆的 50% 被使用。只有伊甸空间和幸存者空间有时会达到100%,但我理解这是正常的。

在某些情况下,即使堆空间未满,我们也会在堆空间中出现 OutofMemoryError?我可以设置哪些参数来避免这种情况?

【问题讨论】:

  • 你确定不是永久区域被填满了吗?
  • 是的,solr 日志说:java.lang.OutOfMemoryError: Java heap space
  • @AniketThakur 如果 permgen 区域被填充而不是堆错误,您将收到 permgen 错误
  • 好的,那么只有堆被填满了。是的,当伊甸园空间被填满时,它的内容将与其他幸存者空间的内容一起转移到幸存者空间之一。并且只有在 YG 的全部 GC 内容被移动到 OG 之后。
  • 我建议从 jconsole 或 jvisualvm 进行堆转储以查看实际的堆使用情况。

标签: java solr heap-memory


【解决方案1】:

只需检查您是否在 OSx64 上使用 JREx32。它可能会导致您的问题。 我刚刚在查看日志后启动了我的 solr 服务器。

查看类似这样的 java 转储日志:

tenured generation 总计 174784K,已使用 174765K [0x09750000, 0x14200000, 0x14200000) 空间 174784K, 99% 已使用 [0x09750000, 0x141fb588, 0x141fb600, 0x14200000)

似乎垃圾收集器在 JRE 和 OS 的不同位中对某些 java 代的工作不太好。

【讨论】:

    【解决方案2】:

    当然可以。一个比较常见的情况是,如果你有非常大的对象,那么有时 JVM 会在老生代中自动实例化它们。如果没有可用于实例化它的连续块,那么您将收到堆空间错误。

    大约一年前,我在 Solr 上遇到了类似的问题,这与导入中大量使用动态字段有关,这些字段反过来又试图创建许多(和大型)对象。您是否使用了很多动态字段?

    我认为评论者说得对,您应该进行堆转储并尝试弄清楚这种方式发生了什么。当您进行 Solr 调优时,您可能无论如何都会调整堆空间大小。

    我发现这个页面非常有用:http://www.kdgregory.com/index.php?page=java.outOfMemory

    【讨论】:

    • 很棒的链接@Mike:非常有趣。我们不使用动态字段。我已经执行了一个堆转储,但现在我试图理解它:它是巨大的!
    • 这不是答案,而是评论。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2016-04-17
    相关资源
    最近更新 更多