我正在使用 weblogic 和 java ee。当我尝试读取一个文本文件(大约 100mb)并从中创建一个数组时,java 堆大小超出并且 weblogic 出现故障。我scanner
用来避免读取内存中的文件,也尽量不在循环内创建任何新变量以防止 java 堆错误。但不幸的是,我收到了那个错误并weblogic exit on panic
在控制台中收到了消息,它崩溃了。
public static CensusData[] load(String path) throws Exception {
List<CensusData> list = new ArrayList<>(43);
String s;
try (FileInputStream inputStream = new FileInputStream(path); Scanner sc = new Scanner(inputStream, "UTF-8")) {
while (sc.hasNextLine()) {
s=sc.nextLine();
list.add(new CensusData(Integer.parseInt(s.split(",")[0].trim()),
s.split(",")[1].trim(),
Integer.parseInt(s.split(",")[2].trim()),
Integer.parseInt(s.split(",")[3].trim()),
s.split(",")[4].trim(),
Integer.parseInt(s.split(",")[5].trim()),
s.split(",")[6].trim(),
s.split(",")[7].trim(),
s.split(",")[8].trim(),
s.split(",")[9].trim(),
s.split(",")[10].trim(),
s.split(",")[11].trim(),
s.split(",")[12].trim(),
s.split(",")[13].trim(),
s.split(",")[14].trim(),
s.split(",")[15].trim(),
Integer.parseInt(s.split(",")[16].trim()),
Integer.parseInt(s.split(",")[17].trim()),
Integer.parseInt(s.split(",")[18].trim()),
s.split(",")[19].trim(),
s.split(",")[20].trim(),
s.split(",")[21].trim(),
s.split(",")[22].trim(),
s.split(",")[24].trim(),
s.split(",")[25].trim(),
s.split(",")[26].trim(),
s.split(",")[27].trim(),
s.split(",")[28].trim(),
s.split(",")[29].trim(),
s.split(",")[30].trim(),
s.split(",")[31].trim(),
s.split(",")[32].trim(),
s.split(",")[33].trim(),
s.split(",")[34].trim(),
s.split(",")[35].trim(),
s.split(",")[36].trim(),
s.split(",")[37].trim(),
s.split(",")[38].trim(),
Integer.parseInt(s.split(",")[39].trim()),
s.split(",")[40].trim()));
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} catch (Exception e) {
e.printStackTrace();
}
我知道增加 Xmx 大小会有所帮助(在我的情况下不会),我正在寻找一个真正的解决方案。为什么当我没有在循环内存储任何新实例时超出堆大小?
还要考虑情况。我需要从CensusData
文件中获取一个数组。因此我迭代文本文件的每一行并将其拆分以获得创建该数组所需的数据。