gpt4 book ai didi

java - 关闭 java InputStream 后内存未释放

转载 作者:行者123 更新时间:2023-12-02 01:58:08 24 4
gpt4 key购买 nike

在这段代码中,我使用 Apache POI 库加载一个大小为 10MB 的 Excel 文件。这会消耗近 2GB 内存。迭代所有行后,我最终调用 close 方法。然而,GC 似乎并没有释放该流和对象消耗的空间。并且仍然使用 2GB + 400MB 内存。

有什么想法吗?

这是我的代码:

public List<Meter> loadFile(File excelFile) throws IOException, InvalidFormatException {
List<Meter> allMeters = new ArrayList<>();
InputStream inputStream = new FileInputStream(excelFile);
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet1 = workbook.getSheetAt(0);
Iterator<Row> rows_sheet1 = sheet1.iterator();
if (rows_sheet1.hasNext()) {
rows_sheet1.next(); //skip header
}

while (rows_sheet1.hasNext()) {
try {
Row currentRow = rows_sheet1.next();
Cell meterNoCell = currentRow.getCell(0);
Cell startPeriodCell = currentRow.getCell(1);
Cell endPeriodCell = currentRow.getCell(2);
Cell previousConsumption = currentRow.getCell(3);
Cell currentConsumption = currentRow.getCell(4);
Cell periodConsumptionCell = currentRow.getCell(5);

meterNoCell.setCellType(CellType.STRING);
startPeriodCell.setCellType(CellType.STRING);
endPeriodCell.setCellType(CellType.STRING);

//Reading values from above_defined cells and filling allMeters list (defined at the begining of the function).
//......
//Done
}
catch (Exception ex) {
Logger.getLogger(MetersList.class.getName()).log(Level.SEVERE, null, ex);
}
}
workbook.close();
inputStream.close();
return allMeters;
}

最佳答案

首先,我注意到使用任务管理器 (Windows) 或 Activity 监视器 (Mac) 进行监控是一项愚蠢的工作。这些工具显示的是保留的堆空间(而不是已使用的堆空间)。因此,当我使用 NetBeans 分析来监视应用程序的内存使用情况时,我注意到 GC 工作得很好并且释放了堆内存。

此外,取消引用 WorkbookInputStream 对象(使用 =null;)可加速 GC 执行。

之后,我的问题发生了变化。

关闭这些流后,GC 运行良好,并且使用的堆空间减少了。但预留的堆空间将保持不变,不会减少,如下图所示:

Fig. 1我看了一下this article 。综上所述,您需要使用以下 JVM 参数:

-XX:MinHeapFreeRatio
-XX:MaxHeapFreeRatio

我设置了-XX:MaxHeapFreeRatio=40,过了一会儿,保留的堆空间被释放了。

关于java - 关闭 java InputStream 后内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52036267/

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