2017-07-14 19 views
0

このプログラムを解凍し、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) 

答えて

0

が必要ですか? 。圧縮されていないサイズを取得するためにのみ使用するようですが、すでにentry.getSize()にあります。 ZipInputStreamrunDataConversion(...)に直接渡すことはできますか?

実際の問題としては、これらのレベルのメモリ消費量に達すると、断片化の問題に遭遇することは珍しいことではありません。つまり、要求された空きメモリより多くの空きメモリがある間は、連続したチャンクが大きくないため、割り当てが失敗します。コンパイルガベージコレクタはそれを処理する必要がありますが、JVM内のすべてのガベージコレクタがIIRCで圧縮されているわけではありません。

+0

実行コマンドとJavaコンソールのJavaヒープスペースを増やすことで問題が解決されました。しかし、私はあなたの権利はまだ、私はバイト配列が役に立たないと思うが、不必要な無駄なメモリでいっぱいです。私はこのコードを再訪しますが、現在は1GBまでのサイズのファイルを処理していますが、それはずっと良いかもしれないと確信しています。 –

関連する問題