我的服务器应用程序(运行 Java 7)收到以下非常奇怪的错误:
Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuffer.append(StringBuffer.java:237)
at java.io.StringWriter.write(StringWriter.java:101)
at java.io.PrintWriter.newLine(PrintWriter.java:480)
at java.io.PrintWriter.println(PrintWriter.java:629)
at java.io.PrintWriter.println(PrintWriter.java:757)
at java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:764)
at java.lang.Throwable.printStackTrace(Throwable.java:655)
at java.lang.Throwable.printStackTrace(Throwable.java:721)
查看 PrintWriter.java:480:
out.write(lineSeparator);
lineSeperator
在PrintWriter的构造函数中设置,如下:
lineSeparator = java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction("line.seperator"));
我已经在这个特定的数据集上重新运行我的应用程序两次,并且在完全相同的位置两次得到相同的异常。在我看来,新行分隔符的附加(应该只是“\n”)不太可能导致 OOM。
上面跟踪中的 printStackTrace
函数是从以下位置调用的:
public static String getMessage(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw); // THIS LINE <-----
return sw.toString();
}
有没有人见过类似的东西,或者知道 lineSeperator
是否会变得很长?
最佳答案
也许你调查错地方了。 OOM的原因就位于此时java.util.Arrays.copyOf(Arrays.java:2367)
。似乎剩余的可用内存小于应复制的数组的大小。
应该打印的Throwable
是什么?也许代码中的某个地方涉及一些循环或递归异常处理。
关于java - "Requested array size exceeds VM limit"位于 java.io.PrintWriter.newLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29772401/