亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

測量和監控大型 HashMap 的大小

測量和監控大型 HashMap 的大小

慕妹3146593 2022-11-30 14:40:47
測量或至少在一定程度上準確估計包含自定義對象的哈希映射的總內存消耗的最佳選擇是什么?背景:我們的系統有多個內存存儲(ConcurrentHashMap 的),其中包含 1K-200K 不同類型的對象。我們想定期監控這些的內存占用。限制/期望:我們無法承受頻繁的 GC 或這些哈希映射的完整迭代,因為這會對延遲產生負面影響。據我所知,java中沒有sizeof(),所以我們可以估計。考慮這些選項:有一個線程通過以下方式報告每個 hashmap 的內存使用情況:使用 classmexer 之類的工具測量 X 類型對象的大小,并將其乘以哈希圖的大小。這忽略了 hashmap 本身使用的內存,假設它與其內容相比相對較小。創建另一個 hashmap,然后添加 N 個該類型的對象,測量其大小,然后推斷該數字以接近完整大小。外部測量,然后將其提供給地圖。考慮 jmap 或類似的東西,但這不會是非常繁重的操作,因為它會測量 jvm 中的所有內容嗎?當我們將對象添加到 hashmap 時,獲取堆大小的增量。不確定這是否可行,因為它是多線程的還有其他很棒的選擇嗎?
查看完整描述

2 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

首先,Alexey Shipilev(Oracle 的前 JVM 工程師,現在在 Redhat)發表了一篇很棒的文章,解釋說這不是那么容易。


Java 中的每個對象都有兩個標頭,它們的大小取決于平臺或 jvm 以 ( UseCompressedOops) 開頭的配置。


然后是字段和對象本身之間的填充和對齊(8 字節對齊)。然后,存在 JVM 根本不顯示的空間,因為它不能或確實需要。


所有這些使得計算某個對象在堆中有多少大小變得有些困難;幸運的是JOL存在。它甚至還有很多樣本......這是一個小例子,假設你有這樣一個類:


static class MyValue {


    private final int left;

    private final String right;


    public MyValue(int left, String right) {

        this.left = left;

        this.right = right;

    }

}

然后你創建一個HashMap:


    Map<String, MyValue> map = new HashMap<>();

    System.out.println("empty map = " + GraphLayout.parseInstance(map).totalSize());


    MyValue one = new MyValue(1, "one");

    System.out.println("one = " + GraphLayout.parseInstance(one).totalSize());


    map.put("one", one);

    System.out.println("map after one = " + GraphLayout.parseInstance(map).totalSize());


    MyValue two = new MyValue(1, "two");

    map.put("two", two);

    System.out.println("map after two = " + 

    GraphLayout.parseInstance(map).totalSize());


查看完整回答
反對 回復 2022-11-30
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

如果我的理解是正確的,你想知道并發HashMap的大小。我認為,以下步驟可能會有所幫助。

  1. 創建一個后臺線程(不是前臺)。

  2. 使用 ByteArrayOutputStream 序列化并發 HashMap。

  3. 使用 toByteArray() 獲取字節數組。

  4. 最后以 kb/mb 為單位計算大小。

  5. 使用 Logger 記錄大小。

其他選項是使用像 JProfiler 這樣的探查器來查看對象圖及其大小。


查看完整回答
反對 回復 2022-11-30
  • 2 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號