2017-10-08 6 views
2

私はメモリの面で爆発するようなコードを書いています。java.lang.OutOfMemoryError:オブジェクトがすべてのメモリを取得しているJavaのヒープスペース?

オブジェクトのほとんどは、補足的な方法で作成されているので、私は理由を理解していないと私はスペースがmethod.?!?(orの終わりではありません後にフリーであることを期待する?)

私はメモリ消費の対象にはまったく新しいものです。そして私はそれを改善するために何をすべきか分かりません。

フラグ-Xmx8192を追加してJVMを設定することは役に立ちませんでした。それは私に3つのパッケージを処理するだけでした。 (最初に-Xmxフラグで処理された27個のパッケージが30に達しました)

GCに空き領域を確保するために何とか遅延させることができますか? これは役に立ちませんか?ここで

は、私がこれまでに書いたコードです:

public class mainToTest{ 

     public static void main(String [] args)throws IOException{  String str;  
      String home = "C:/Users/Eirini/Desktop/OP/";  
      String s = "13092017-1800";  
      File Descriptor;   
      final Charset ENCODING = StandardCharsets.UTF_8;  
      Path path = Paths.get(home+"output.xml");   
      List <String> LOP= new ArrayList(); 
      LOP.clear();  

      List<String> lines; 
      int i,j; 

      File [] a =(new File(home+s)).listFiles();   
      System.out.println("Packages found...");  
      for (i=0; i<a.length; i++){   
      System.out.print("For package " + i);    
      Descriptor=findDescriptor(a[i]);    
      XSL.transformation(Descriptor,new File 
      (home+"extractprocedureid.xslt")); 

      lines = Files.readAllLines(path, ENCODING);    
      str=lines.get(1);   
      if (LOP.isEmpty()){ 
      LOP.add(str);}   
      for(j=0; j<LOP.size(); j++){ 
      if(!(str.equals(LOP.get(j)))){ 
        LOP.add(str);}   
      } 
      }   
      System.out.println("");  
      System.out.println("Finished Procedures found:");   
      for (i=0; i<LOP.size();i++){   
      System.out.println(LOP.get(i)); } 


    } 


     public static File findDescriptor(File pckg){  
      String s;   
      int i,k;   
      int j=0; 
      File[] ind=pckg.listFiles();   
      System.out.println(" all Items and descriptor listed"); 

      k=ind.length; 

      for (i=0;i<k;i++){   
       System.out.println("File " +i);   
       if (ind[i].getName().endsWith("_immc.xml")){ 
        j=i; 
        i=200; 
        System.out.println("Descriptor found !!!!");     }    
       else{ 
       System.out.println(" not a descriptor. Moving to the next");}  }  

      return ind[j];    

     } 
} 

とXSL.transformationはその

public static void transformation (File immc,File xslt){ 

     Source xmlInput = new StreamSource(immc); 
     Source xsl = new StreamSource(xslt); 
     Result xmlOutput = new StreamResult(new File("C:/Users/Eirini/Desktop/OP/output.xml")); 

     try { 
       Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl); 
      transformer.transform(xmlInput, xmlOutput); 
     } 
     catch (TransformerException e) { 
       System.out.println("Exception caught"); 
     } 
     System.out.println("XSLT transformation finnished...The result can be found in file C:/Users/Eirini/Desktop/OP/output.xml"); 

    } 

のように見えるエラーは通常、右のXSL.transformation(2個目の後に起こりますコード)

ありがとう

+0

ちょうどそれをプロファイルします。 '-Xmx8192'で8KBのメモリーしか得られないのではなく、代わりに' -Xmx8192m'を試してみてください。 (しかし、それは単にタイプミスであると仮定します) – lexicore

+0

これらの変換されたファイルの出力はどれくらいですか?変換するすべてのファイルに対して、テキスト行を読み込み、 'LOP' ArrayListに追加しています。したがって、変換されたすべてのファイルの出力をメモリに保持します。あなたの 'LOP'を追加して、物事が一定であるかどうかを調べたり、各ファイルの後に' LOP.clear() 'を呼び出して、OOMエラーを止めてそこからチューニングするのを見てみてください。 –

+0

はい私の正確なコマンドは、java -Xmx2048m -Xms512m mainToTest –

答えて

3

問題はlin es:

for(j=0; j<LOP.size(); j++){ 
     if(!(str.equals(LOP.get(j)))){ 
      LOP.add(str);}   
     } 

このスニペットは、strの新しい値があるたびにリストLOPのサイズを2倍にします。だから、ちょうどそこに指数関数的なメモリ使用量があります。