[英]visualvm profiles jvm heap found int array takes huge memory
我有一個 Spring 啟動程序,它使用在服務器上運行的 OpenJdk (jdk1.8),每天從 kafka 消耗大約 200 或 3 億個數據並寫入 csv 文件。 啟動后不到 2 小時,它使用超過 6GB memory。 所以我使用 jmap histo 轉儲堆。 並找到使用 2.6GB 的 int[] 數組和使用 1.3GB 的 byte[] 數組。 但是我在我的項目中既沒有定義 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視圖中,大部分(90%以上)都沒有使用( retained size為0),可以GCed嗎? 但為什么不呢? 這些 int[] byte[] 數據是什么?
程序中字節或字符 arrays 的出現通常是由於代碼使用的字符串。 您應該能夠通過查看 MAT 中的 memory 支配者來查看它們是否被 String 對象引用。
int arrays 的使用在 JDK 中的一般代碼中遠不常見,因此您需要找到它們被支配的位置才能找到。
但是請注意,在這兩種情況下,您在代碼中直接使用的內容並不相關; 用法很可能來自您的依賴關系。 無論是 JVM 類還是其他一些緩存機制,都可能取決於引用對象的位置,因此下一階段是使用工具來找出答案。
感謝@AlBlue 和@JurajMartinka。 我分析了 byte[] 數組和 int[] 數組,找到了部分答案。 int[] 數組有 166921 個實例,使用 2.6GB 內存(57.3%)。 他們中的大多數沒有參考: 其中一些被kafka使用:
同時 spring 引導加載程序:
另一方面,byte[] 數組有 39400 個實例,使用 1.3GB 內存(28.8%)。 其中大部分是kafka數據: 一些是其他引用的依賴項:
活體使用的真正的memory並不大。 MAT(Eclipse Memory Analyzer工具)顯示只有43.6M被占用。
然而,仍有許多問題需要弄清楚。 比如什么時候GC,netty用在哪里等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.