java.lang.OutOfMemoryError:java堆空间哪些对象获得所有内存?
我写了一些在内存方面似乎爆炸性的代码 我不明白为什么,因为大多数对象都是在补充方法中创建的,我希望在方法结束后空间是空闲的。?!?(还是没有?) 我对记忆消耗这个话题还不太熟悉。我不知道该怎么做才能改善它 通过添加标志-Xmx8192来配置JVM没有帮助。它只让我处理了3个以上的包。(最初使用-Xmx标志I处理的27个包达到30个) 我是否可以以某种方式延迟它,以便让GC有时间释放空间? 或者这不会有帮助吗 以下是我迄今为止编写的代码:java.lang.OutOfMemoryError:java堆空间哪些对象获得所有内存?,java,xslt,Java,Xslt,我写了一些在内存方面似乎爆炸性的代码 我不明白为什么,因为大多数对象都是在补充方法中创建的,我希望在方法结束后空间是空闲的。?!?(还是没有?) 我对记忆消耗这个话题还不太熟悉。我不知道该怎么做才能改善它 通过添加标志-Xmx8192来配置JVM没有帮助。它只让我处理了3个以上的包。(最初使用-Xmx标志I处理的27个包达到30个) 我是否可以以某种方式延迟它,以便让GC有时间释放空间? 或者这不会有帮助吗 以下是我迄今为止编写的代码: public class mainToTest{
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之后(第二段代码)
谢谢看起来问题在于线路:
for(j=0; j<LOP.size(); j++){
if(!(str.equals(LOP.get(j)))){
LOP.add(str);}
}
for(j=0;jJust profile它。顺便说一下-Xmx8192
只提供8kb的内存,请尝试-Xmx8192m
。(但我假设它只是一个输入错误。)这些转换文件的输出有多大?对于您转换的每个文件,您都在读取文本行并附加到LOP
ArrayList。因此,您将在内存中保留所有这些转换文件的输出。请尝试不要附加到LOP
以查看事情是否保持不变,或者调用LOP.clear()
在每个文件之后查看是否停止抛出OOM错误,然后从那里进行调整。是的,我的确切命令是java-Xmx2048m-Xms512m main测试转换后的文件是2-5行。xicore你说的评测是什么意思?
for(j=0; j<LOP.size(); j++){
if(!(str.equals(LOP.get(j)))){
LOP.add(str);}
}