gpt4 book ai didi

java - 线程 "main"java.lang.OutOfMemoryError 中的异常

转载 作者:可可西里 更新时间:2023-11-01 16:33:27 24 4
gpt4 key购买 nike

我正在用 java 读取大量 XML 文件,并将它们转换为 JSON 并将它们写回文件系统。 XML 文件夹的总大小约为 100Gb,单个 XML 文件的大小可达 100MB 左右。 JVM 内存大小设置为 512Mb。这是读取和写入文件的循环:

  for(int i=0; i<fileNames.size(); i++) {

try{
File f = new File(File.separator+fileNames.get(i));


BufferedReader br = new BufferedReader(new FileReader(f));

String line;

StringBuilder sb = new StringBuilder();

long startTime = System.nanoTime();

while((line=br.readLine())!= null){
sb.append(line.trim());
}


String jsonData = XML.toJSONObject(sb.toString()).toString(0);

String outputFilename = fileNames.get(i).split("\\.")[0]+".json";

Path jsonFilePath = new Path(jsonPath+File.separator+outputFilename);

FSDataOutputStream out = fileSystem.create(jsonFilePath);
out.writeChars(jsonData);
byte[] b = jsonData.getBytes("UTF-8");

out.close();
br.close();

long endTime = System.nanoTime();
double executionTime = (double)(endTime - startTime) / 1000000000.0;

System.out.println("Input file : "+fileNames.get(i)+" - "+(double)(f.length()/1000) + " kb");
System.out.println("Output file : "+outputFilename+" - "+(double)(b.length/1000) + " kb"+" in "+executionTime + " seconds");
System.out.println("--------------------------------------------------");

}catch(IOException ioe){
ioe.printStackTrace();
}catch (JSONException je) {
System.out.println(je.toString());
}catch(Exception e){
e.printStackTrace();
}

}

运行一段时间后,该程序抛出:Exception in thread "main"java.lang.OutOfMemoryError: Java heap space,如果我将 JVM 内存增加到 -Xmx1024 程序运行非常缓慢并且 java 进程消耗大量内存。因为我在 for 循环中创建文件、stringbuilder 和 bufferedreader,所以它们在内存中,不会被垃圾回收。我怎样才能使这段代码工作。谢谢

最佳答案

仔细查看代码,没有明显的内存泄漏,因此问题很可能是由一个太大而无法处理的单个输入文件引起的。

如果 JVM 堆大小超过服务器上的可用内存,将 JVM 堆大小设置为 1024 可能会运行得非常慢,因为这会导致交换,这是磁盘 I/O 并且非常慢。

使用相同的硬件来消除由单个输入文件引起的问题的唯一方法是以某种使用较少内存的方式更改处理。例如,使用占用内存较少的 xml 到 json 的转换工具,或者想办法将 XML 拆分成多个部分并重新组合在一起;但这不是微不足道的。

您可以转向更大的硬件。如果可能,请确保使用 64 位操作系统和 64 位版本的 java。

关于java - 线程 "main"java.lang.OutOfMemoryError 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com