java - "Requested array size exceeds VM limit"位于 java.io.PrintWriter.newLine

标签 java out-of-memory printwriter

我的服务器应用程序(运行 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/

相关文章:

在 Tomcat 上部署时,java web 应用程序拒绝连接到 SQL 数据库

c# - 简单的 C# 数组抛出 OutOfMemory 异常

c++ - 内存碎片会导致内存不足异常吗?

java - Android中PrintWriterPrinter有什么用?

java - 如何(或)是否可以使用 PrintWriter 类实现输入 "* "来保存文件并在获取扫描仪输入后退出的逻辑?

java - PrintWriter 不写入指定文件

java - 如何对合法 Action 进行硬编码以进行快速查找?

java - 如何在一个 session 中发送多封电子邮件?

java - 如何在 Ant 中使用并行任务

java.lang.OutOfMemory错误: GC overhead limit exceeded JAVA