2011-03-31 199 views
11

是否有日志选项,可以让tomcat记录坏的查询,而不是扔这个?Java中如何解决“请求的数组大小超过VM限制”错误?

SEVERE: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

(试过日志级别为FULL,但只捕获以上)

这是没有足够的信息,以进一步调试
可选地,如果这可以固定通过分配更多的内存通过调整以下?

-Xms1024M -Xmx4096M -XX:MaxPermSize=256M

更新

-Xms6G -Xmx6G -XX:MaxPermSize=1G -XX:PermSize=512M

(上述作品似乎更好,不断监测)

+0

你可以试试'-mx8g'或'-mx16g'吗?你有多少内存? – 2011-03-31 08:50:13

+0

对于有这个问题的服务器是8G – ajreal 2011-03-31 08:52:19

+1

我会尝试'-mx6g'或'-Xmx6g'(做这个事情)然而它很可能这不会有任何区别。如果你有一个工具来分析堆转储,你也可以尝试'-XX:+ HeapDumpOnOutOfMemoryError'。 – 2011-03-31 08:57:12

回答

0

升级的solr到更新的版本似乎有这种问题排序,可能更新的版本有更好的堆内存管理。

9

我怀疑你可能会使用一个大的索引排序。这是我确定知道的一件事情,可能需要使用Lucene的大数组大小。无论哪种方式,您可能需要使用一个64位JVM使用这些选项尝试:

-Xmx6G -XX:MaxPermSize=128M -XX:+UseCompressedOops 

的最后一个选项将减少64位内存指针到32位(只要堆为32GB下)。这通常会将内存开销减少约40%,因此可以显着延长内存。

更新:最有可能你不需要这么大的永久代大小,当然不是1G。如果你使用Java 6,你可能会遇到一个特定的错误。由于你的服务器只限于8G,所以你可以用7G来获得更小的perm堆根。注意不要掉换,这可能会严重减慢Java的速度。

我注意到你没有在你的更新中提到-XX:+UseCompressedOops。如果你还没有尝试过,那可能会有很大的不同。您可以通过缩小伊甸园的面积来缩小空间,让年长一代拥有更多空间。除此之外,我认为你只需要更多的内存或更少的排序字段。

0

我用这个在catalina.sh

JAVA_OPTS="-Dsolr.solr.home=/etc/tomcat6/solr -Djava.awt.headless=true -server -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC" 

我从来没有MEM问题在Tomcat/Solr的有30M的小文件。尽管我遇到了solrJ索引客户端的问题。我必须使用-Xms8G -Xmx8G作为Java客户端,并以250K文档块为单位添加文档。

2

如果你想找出是什么原因导致内存溢出,您可以添加

-XX:+HeapDumpOnOutOfMemoryError 

到Java OPTS。

下一次内存不足时,您将得到一个堆转储文件,可以使用位于jdk/lib中的“jhat”进行分析。 Jhat会告诉你堆中存在什么对象以及它们消耗多少内存。

+0

遇到此选项之前,但是,无法获得该选项的作品,tomcat抱怨一个选项未定义的错误 – ajreal 2011-04-18 03:40:55

0

内存不足!看看有没有数组越界,或循环系统资源被吞噬!


1.java.lang。OutOfMemoryError:Java堆空间 在JVM中,如果有98%的时间可用于GC堆大小,并且少于2%的时间抛出此异常信息。 JVM堆设置是java程序运行的JVM内存空间,可用于部署设置。 JVM在启动时会自动设置堆大小值,初始空间(ie-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。JVM可以用来提供 - 可以设置Xmn-Xms-Xmx和其他选项。

2.Requested阵列大小超过限制VM:这是因为数组的大小的应用程序超出堆空间的大小,诸如阵列中的堆空间一个256M申请512M

1

您将得到此异常,因为您正尝试创建一个大于Java VMs堆中最大连续内存块的数组。

https://plumbr.eu/outofmemoryerror/requested-array-size-exceeds-vm-limit

什么解决的办法?

的java.lang.OutOfMemoryError:要求数组大小超过VM限制可以出现的以下任一情况的结果:

你的阵列增加过大,最终不得不平台限制之间的大小和Integer.MAX_INT

您故意尝试分配大于2^31-1元素的数组来尝试限制。

在第一种情况下,检查你的代码库,看看你是否真的需要大的数组。也许你可以减小数组的大小并完成它。或者将数组分成更小的数量,并将批量处理所需的数据加载到平台限制中。

在第二种情况下 - 记住Java数组是通过int索引的。因此,在平台内使用标准数据结构时,您不能超越数组中的2^31-1元素。事实上,在这种情况下,编译期间编译器宣布“错误:整数太大”已经阻塞了它。 但是,如果你确实使用真正的大数据集,你需要重新考虑你的选择。您可以以较小批量加载需要使用的数据,并仍使用标准Java工具,或者您可能超出标准实用程序。实现这一目标的一种方法是查看sun.misc.Unsafe类。这允许你直接分配内存,就像你在C中一样。

相关问题