【发布时间】:2014-12-08 08:13:17
【问题描述】:
我的应用程序将 .zip 文件分成两部分。当文件大小低于 100MB 时,它可以正常工作。如果文件大小超过 100MB,它会给出
java.lang.OutOfMemoryError
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:198)
我正在使用 glassfishV3 和 JDK6
-Xms512m -Xmx512m 不够用
then I have set
<jvm-options>-Xms1024m</jvm-options>
<jvm-options>-Xmx1024m</jvm-options>
然后它给了
"Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine."
public void create() {
byte[] bFile = takeByteArr("file1.zip");
byte[] bPart1 = Arrays.copyOfRange(bFile, 0, 100000);
byte[] bPart2 = Arrays.copyOfRange(bFile, 100000, bFile.length);
createFile(bPart1, "part1.zip");
createFile(bPart2, "part2.zip");
}
void createFile(byte[] bFile, String path) {
try {
FileOutputStream fos = new FileOutputStream(path);
fos.write(bFile);
fos.close();
} catch (FileNotFoundException ex) {
System.out.println("FileNotFoundException : " + ex);
} catch (IOException ioe) {
System.out.println("IOException : " + ioe);
}
}
byte[] takeByteArr(String filePath) {
File file = new File(filePath);
byte[] bFile = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bFile);
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return bFile;
}
【问题讨论】:
-
您的计算机上有多少内存?当您收到此消息时,有多少可用 RAM?你有 32 位或 64 位系统和 JDK。当我收到此消息时,我会尝试关闭尽可能多的程序并重新启动,大多数情况下就足够了。
-
真的必须用 Java 完成吗?也许可以从 Java 调用 OS 命令来拆分文件...
-
为什么你要这样做?没有所有其他部分,这些部分就毫无意义。似乎是徒劳的。在任何情况下,如果您只是将前 100000 个字节复制到另一块内存中,然后假设其余部分也将适合内存以及原始文件,那么它肯定不会起作用。文件应一次处理一行或一条记录或一个缓冲区。
-
@StephaneM - 我的电脑 RAM 是 4GB 和 1.5GB 可用。它在 64 位 windows 7 操作系统和 JDK 64 位上运行。
-
@BorisPavlovic - 是的,我必须在 java 中完成。我正在 Windows 7 中开发此应用程序。但我必须在 centOs 中部署它。所以我认为使用 os 命令将无助于解决这个问题。
标签: glassfish-3 fileinputstream fileoutputstream java-6