OutOfMemoryError:solr中的Java堆空间,但堆未满

时间:2015-03-26 16:25:26

标签: java solr heap-memory

前提:我是关于java问题的再见,但我正在努力理解。

我在高负载下的SOLR实例中遇到“OutOfMemoryError:Java堆空间”(许多并发请求只读)。

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

是否存在堆空间中可能出现OutofMemoryError的情况,即使它未满?我可以设置哪些参数来避免这种情况?

2 个答案:

答案 0 :(得分:1)

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

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

我认为评论者说得对,你应该采取堆转储并尝试弄清楚那是怎么回事。当你进入Solr调整时,你可能会调整堆空间大小。

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

答案 1 :(得分:1)

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

在java转储日志中查看类似这样的内容:

  

终身代总计174784K,使用174765K [0x09750000,   0x14200000,0x14200000)空间174784K,99%使用[0x09750000,   0x141fb588,0x141fb600,0x14200000)

似乎垃圾收集器在JRE和操作系统的不同位置上的somths java代表工作不太好。