큰 폴더 (10GB)를 압축하면이 오류로 인해 메모리에 오류가 발생합니다. 그것은 1GB의 주위에 폴더로 잘 작동합니다.압축 - java.lang.OutOfMemoryError : Java 힙 공간
아마도 일부 메모리 누수가 발생하지만 내 코드에서 누수가있는 곳은 어디입니까? 이 문제를 어떻게 해결할 수 있습니까?
감사합니다.
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:93)
at java.io.File.<init>(File.java:207)
at java.io.File.listFiles(File.java:1056)
at Zipper.addDir(Zipper.java:27)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.addDir(Zipper.java:32)
at Zipper.zipDir(Zipper.java:17)
at Schedule.runBackup(Schedule.java:128)
at Machine.runBackup(Machine.java:108)
at Person.main(Person.java:51)
이 코드는 다음과 같습니다 :
언급 한 바와 같이import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Zipper {
static void zipDir(String zipFileName, String dir) throws Exception {
File dirObj = new File(dir);
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
addDir(dirObj, out);
out.close();
} catch(Exception e) {
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame, e.getMessage() + ". Is settings.xml correct?");
}
}
static void addDir(File dirObj, ZipOutputStream out) throws IOException {
try {
File[] files = dirObj.listFiles();
byte[] tmpBuf = new byte[1024];
for (int i = 0; i < files.length; i++) {
try {
if (files[i].isDirectory()) {
addDir(files[i], out);
continue;
}
FileInputStream in = new FileInputStream(files[i].getAbsolutePath());
out.putNextEntry(new ZipEntry(files[i].getAbsolutePath().replace(File.separatorChar,'/')));
int len;
while ((len = in.read(tmpBuf)) > 0) {
try {
out.write(tmpBuf, 0, len);
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
out.closeEntry();
in.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
jdk 버전이 무엇입니까? 내가 물었던 이유는 jdk 1.4에 [JIRA] (http://bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4705373)가 있다는 것입니다. – CoolBeans