我从我的服务器应用程序获得以下非常奇怪的错误(运行Java 7):“请求数组大小超过VM限制”在java.io.PrintWriter.newLine
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"));
我已经在这个特定的数据集上重新运行了两次我的应用程序,并且我在同一个地方得到了两次相同的异常。对我来说,这似乎不太可能是将导致OOM的新行分隔符(它应该只是“\ n”)的附加。
跟踪中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
能在某种程度上得到很长的?
那么我知道它被称为“行分隔符”而不是“行分隔符”。这是你的bug的来源吗? – Kayaman
将其更改为lineSeparator = System.getProperty(“line.separator”); – Maksym
看看堆栈跟踪,看起来你正在尝试将太多的数据放入'StringBuilder'中,该数据由你传递给'PrintWriter'的'StringWriter'内部使用。文件分隔符恰恰是触发溢出的字符的事实可能是纯粹的巧合。 –