このプログラムを解凍し、Amazon S3にファイルを展開するように書いています。私はJavaヒープのバグに遭遇しました。Javaヒープスペース - ByteArrayOutputStream.Write
私が試したこと: 引数のヒープスペースを増やしてください。 バイトサイズを[1024 * 1024]に変更
outputStream.write(buffer、0、len)でバグを取得しています。 バイトサイズは1024で初期化されます。 このコードは、これまでのサイズの166メガバイトまでのほとんどのファイルで機能します。 JavaヒープサイズはXmx4096m Javaバージョンで解凍の1.7
方法です:
public static void extractObjects(byte[] buffer, AmazonS3 s3Client, ZipInputStream zis, ZipEntry entry)
throws IOException {
try {
while (entry != null) {
String fileName = entry.getName();
if (fileName == "lib") {
fileName = entry.getName();
}
boolean containsBackup = fileName.contains(doc.getDesiredFile());
if (containsBackup == true) {
System.out.println("A back up file was found");
formatSchemaName();
System.out.println("Extracting :" + app.getCurrentPacsId());
log.info("Extracting " + app.getCurrentPacsId() + ", compressed: " + entry.getCompressedSize() + " bytes, extracted: " + entry.getSize() + " bytes");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len;
while ((len = zis.read(buffer)) >= 0)
{
outputStream.write(buffer, 0, len);
}
InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
meta = new ObjectMetadata();
meta.setContentLength(outputStream.size());
fileName = app.getCurrentPacsId();
runDataConversion(is,s3Client,fileName);
is.close();
outputStream.close();
System.out.println("Unzip complete");
}
else{
System.out.println("No back up found");
}
entry = zis.getNextEntry();
}
zis.closeEntry();
zis.close();
} catch (AmazonServiceException e) {
log.error(e);
} catch (SdkClientException e) {
log.error(e);
}
}
あなた本当にはByteArrayOutputStream
をエラー
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at com.amazonaws.image.DataMiner.extractObjects(DataMiner.java:112)
at com.amazonaws.image.DataMiner.downloadBucket(DataMiner.java:76)
at com.amazonaws.image.DataMiner.obtainConnection(DataMiner.java:58)
at com.amazonaws.image.DataMiner.main(DataMiner.java:208)
実行コマンドとJavaコンソールのJavaヒープスペースを増やすことで問題が解決されました。しかし、私はあなたの権利はまだ、私はバイト配列が役に立たないと思うが、不必要な無駄なメモリでいっぱいです。私はこのコードを再訪しますが、現在は1GBまでのサイズのファイルを処理していますが、それはずっと良いかもしれないと確信しています。 –