&引用;请求的数组大小超过VM限制“;在java.io.PrintWriter.newLine

&引用;请求的数组大小超过VM限制“;在java.io.PrintWriter.newLine,java,out-of-memory,printwriter,Java,Out Of Memory,Printwriter,我的服务器应用程序(运行Java 7)出现以下非常奇怪的错误: 查看PrintWriter.java:480: out.write(lineSeparator); lineseparator在PrintWriter的构造函数中设置,如下所示: lineSeparator = java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction("line.seperator")); 我已经在

我的服务器应用程序(运行Java 7)出现以下非常奇怪的错误:

查看PrintWriter.java:480:

out.write(lineSeparator);
lineseparator
在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();
}
公共静态字符串getMessage(Throwable t){
StringWriter sw=新的StringWriter();
PrintWriter pw=新的PrintWriter(sw);
t、 printStackTrace(pw);//此行
有没有人见过类似的东西,或者知道分线器是否会变得很长

此代码只是检索系统属性,需要调用代码可能没有的权限。(请参阅)

可通过以下方式进行设置:

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

但是对我来说,没有理由设置这么长。

也许你在错误的地方进行了调查。OOM的原因就在这里
java.util.Arrays.copyOf(Arrays.java:2367)
。似乎剩余的可用内存低于应该复制的数组大小


什么是应打印的可丢弃的
?代码中可能涉及一些循环或递归异常处理。

这与此处发布的问题相同:

试一试

boolean autoFlush=true;
PrintWriter输出=新的PrintWriter(myFileName,自动刷新);


它创建了一个PrintWriter实例,每当出现新行或新格式时,它都会刷新内容。

我知道它被称为“行分隔符”而不是“行分隔符”。这是您的错误源吗?将其更改为lineSeparator=System.getProperty(“line.separator”);查看stacktrace,您似乎试图在传递给
PrintWriter
StringWriter
内部使用的
StringBuilder
中放入太多数据。文件分隔符正是触发溢出的字符这一事实可能纯粹是巧合。@Maksym
System.lineSeparator()
会更好。您可能只有很少的可用内存(而且捕获的异常本身可能是OOM)当StringWriter试图调整缓冲区大小以容纳更多字符时,Java抛出另一个OOM。字符是行分隔符只是巧合。Java需要分配一个新数组以容纳所有已写入的字符,并且新分配的数组的长度将是旧数组的两倍(启发式)避免频繁扩展和复制的需要。
System.setProperty("line.separator", whatever)