2015-04-21 76 views
1

我从我的服务器应用程序获得以下非常奇怪的错误(运行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能在某种程度上得到很长的?

+0

那么我知道它被称为“行分隔符”而不是“行分隔符”。这是你的bug的来源吗? – Kayaman

+0

将其更改为lineSeparator = System.getProperty(“line.separator”); – Maksym

+0

看看堆栈跟踪,看起来你正在尝试将太多的数据放入'StringBuilder'中,该数据由你传递给'PrintWriter'的'StringWriter'内部使用。文件分隔符恰恰是触发溢出的字符的事实可能是纯粹的巧合。 –

回答

0

有没有人看过类似的东西,或者知道lineSeperator是否可以变得很长?

此代码只是检索系统属性需要调用代码可能没有的权限。 (见here

它可以通过设置:

System.setProperty("line.separator", whatever) 

至于我,没有理由将其设置这种长。

0

也许你在错误的地方调查。 OOM的原因是位于这一点java.util.Arrays.copyOf(Arrays.java:2367)。似乎剩余的空闲内存低于应该复制大小的数组。

什么是Throwable应该打印哪个?也许在代码中某处存在一些循环或递归异常处理。

0

这是张贴在这里同样的问题: https://stackoverflow.com/posts/35143048

尝试

boolean autoFlush = true; PrintWriter output = new PrintWriter(myFileName, autoFlush);

时,有一个新的行或格式化它创建一个PrintWriter实例,它刷新的内容每次。

相关问题