私はメモリの面で爆発するようなコードを書いています。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個目の後に起こりますコード)
ありがとう
ちょうどそれをプロファイルします。 '-Xmx8192'で8KBのメモリーしか得られないのではなく、代わりに' -Xmx8192m'を試してみてください。 (しかし、それは単にタイプミスであると仮定します) – lexicore
これらの変換されたファイルの出力はどれくらいですか?変換するすべてのファイルに対して、テキスト行を読み込み、 'LOP' ArrayListに追加しています。したがって、変換されたすべてのファイルの出力をメモリに保持します。あなたの 'LOP'を追加して、物事が一定であるかどうかを調べたり、各ファイルの後に' LOP.clear() 'を呼び出して、OOMエラーを止めてそこからチューニングするのを見てみてください。 –
はい私の正確なコマンドは、java -Xmx2048m -Xms512m mainToTest –