簡體   English   中英

visualvm 配置文件 jvm 堆發現 int 數組占用巨大 memory

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM