gpt4 book ai didi

java - visualvm 配置文件 jvm 堆发现 int 数组占用大量内存

转载 作者:行者123 更新时间:2023-12-05 02:06:37 27 4
gpt4 key购买 nike

我有一个在服务器上运行的使用 OpenJdk (jdk1.8) 的 Spring Bootstrap ,每天从 kafka 消耗大约 200 或 3 亿条数据并写入 csv 文件。开机不到2小时,就用了6GB多内存。所以我使用 jmap histo 转储堆。并找到使用 2.6GB 的 int[] 数组和使用 1.3GB 的 byte[] 数组。 enter image description here但是我在我的项目中既没有定义 int[] 也没有定义 byte[] 。我正在使用 spring kafka(org.springframework.kafka, version2.3.3) 使用 kafka 消息,opencsv(com.opencsv, version4.6) 写入 csv。

有人知道原因吗?

下面是我的部分代码:

public <T> Boolean parseDataToFile(String filePath, List<T> data) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
if (data == null || data.size() <= 0) {
return false;
}
File file = new File(filePath);
//创建父目录
boolean mkdirs = file.getParentFile().mkdirs();
Writer writer = null;
try {
writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).withThrowExceptions(false).withSeparator(',').build();
beanToCsv.write(data);
return true;
} finally {
if (writer != null) {
writer.flush();
writer.close();
}
}
}

补充:在Instance View 中,大部分(90%以上)都没有被使用(retained size为0),所以可以GC?但为什么不呢?这些 int[] byte[] 数据是什么? enter image description here

最佳答案

感谢@AlBlue 和@JurajMartinka。我分析了 byte[] 数组和 int[] 数组,找到了部分答案。int[]数组有166921个实例,使用2.6GB内存(57.3%)。他们中的大多数没有引用: enter image description here其中一些被kafka使用: enter image description here同时 spring boot loader: enter image description here

另一方面,byte[] 数组有 39400 个实例,使用 1.3GB 内存(28.8%)。其中大部分是kafka数据: enter image description here一些是其他引用的依赖项: enter image description here

Activity 对象使用的实际内存并不大。 MAT(The Eclipse Memory Analyzer tool)显示只占用了43.6M。 enter image description here

然而,还有很多问题需要找出来。比如什么时候GC,netty用在什么地方等等。

关于java - visualvm 配置文件 jvm 堆发现 int 数组占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62688008/

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