有没有办法处理Java堆space异常
Is there any way to handle Java heap space exception
我正在为大文件(文件大小为 100MB)转换文件输入流,它正在抛出 java.lang.OutOfMemoryError:Java 堆 space
import java.io.FileInputStream; import java.io.IOException;
import org.apache.commons.io.IOUtils;
public class TestClass {
public static void main(String args[]) throws IOException
{
//Open the input and out files for the streams
FileInputStream fileInputStream = new FileInputStream("file.pdf");
IOUtils.toByteArray(fileInputStream);
}
}
实际堆栈跟踪是
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.io.output.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:322)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:463)
at TestClass.main(TestClass.java:12)
我确实尝试过使用下面的方法来处理它
public static byte[] toByteArray(InputStream is) {
if (is == null) {
throw new NullPointerException("The InputStream parameter is null.");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
byte[] buffer = new byte[32];
int read;
while ((read = is.read(buffer)) != -1) {
baos.write(buffer, 0, read);
}
return baos.toByteArray();
} catch (IOException e) {
}
然后失败
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at TestClass.toByteArray(TestClass.java:25)
at TestClass.main(TestClass.java:14)
我们有什么办法可以解决这个问题吗!!!任何输入将不胜感激。
谢谢!!!
一个名为 -XshowSettings 的 Oracle java 命令行标志可能会帮助您了解正在发生的事情。
在我的机器 (Ubuntu 12.04) 和 Oracle JVM 1.7 上。0_75,对于一个 100MB 的文件,这个程序运行良好,没有产生预期的输出:
$ java -XshowSettings:vm -cp target/classes/:/data/home/kmhaswade/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar foo.TestClass
VM settings:
Max. Heap Size (Estimated): 1.73G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
为了证明其他人对 JVM 堆处理的看法 space,我 运行 使用 -Xmx10m,这是我得到的结果(如预期):
$ java -XshowSettings:vm -Xmx10m -cp target/classes/:/data/home/kmhaswade/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar foo.TestClass
VM settings:
Max. Heap Size: 10.00M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.io.output.ByteArrayOutputStream.needNewBuffer(ByteArrayOutputStream.java:122)
at org.apache.commons.io.output.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1793)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:462)
at foo.TestClass.main(TestClass.java:12)
因此,基本上,在 TestClass 的第 12 行,我们要求返回整个 bytearray,我们是 运行 OOM,因为我们启动 JVM 时将最大 10MB 作为堆分配。
我的默认最大堆是 1.73G,因为 JVM 人体工程学是根据机器的 class 确定的。也许您的情况有所不同,因此默认情况下,对于 100MB 的文件,它会失败。
我正在为大文件(文件大小为 100MB)转换文件输入流,它正在抛出 java.lang.OutOfMemoryError:Java 堆 space
import java.io.FileInputStream; import java.io.IOException;
import org.apache.commons.io.IOUtils;
public class TestClass {
public static void main(String args[]) throws IOException
{
//Open the input and out files for the streams
FileInputStream fileInputStream = new FileInputStream("file.pdf");
IOUtils.toByteArray(fileInputStream);
}
}
实际堆栈跟踪是
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.io.output.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:322)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:463)
at TestClass.main(TestClass.java:12)
我确实尝试过使用下面的方法来处理它
public static byte[] toByteArray(InputStream is) {
if (is == null) {
throw new NullPointerException("The InputStream parameter is null.");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
byte[] buffer = new byte[32];
int read;
while ((read = is.read(buffer)) != -1) {
baos.write(buffer, 0, read);
}
return baos.toByteArray();
} catch (IOException e) {
}
然后失败
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at TestClass.toByteArray(TestClass.java:25)
at TestClass.main(TestClass.java:14)
我们有什么办法可以解决这个问题吗!!!任何输入将不胜感激。
谢谢!!!
一个名为 -XshowSettings 的 Oracle java 命令行标志可能会帮助您了解正在发生的事情。
在我的机器 (Ubuntu 12.04) 和 Oracle JVM 1.7 上。0_75,对于一个 100MB 的文件,这个程序运行良好,没有产生预期的输出:
$ java -XshowSettings:vm -cp target/classes/:/data/home/kmhaswade/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar foo.TestClass
VM settings:
Max. Heap Size (Estimated): 1.73G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
为了证明其他人对 JVM 堆处理的看法 space,我 运行 使用 -Xmx10m,这是我得到的结果(如预期):
$ java -XshowSettings:vm -Xmx10m -cp target/classes/:/data/home/kmhaswade/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar foo.TestClass
VM settings:
Max. Heap Size: 10.00M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.io.output.ByteArrayOutputStream.needNewBuffer(ByteArrayOutputStream.java:122)
at org.apache.commons.io.output.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1793)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:462)
at foo.TestClass.main(TestClass.java:12)
因此,基本上,在 TestClass 的第 12 行,我们要求返回整个 bytearray,我们是 运行 OOM,因为我们启动 JVM 时将最大 10MB 作为堆分配。
我的默认最大堆是 1.73G,因为 JVM 人体工程学是根据机器的 class 确定的。也许您的情况有所不同,因此默认情况下,对于 100MB 的文件,它会失败。