第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

測量和監(jiān)控大型 HashMap 的大小

測量和監(jiān)控大型 HashMap 的大小

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

2 回答

?
慕慕森

TA貢獻1856條經(jīng)驗 獲得超17個贊

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


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


然后是字段和對象本身之間的填充和對齊(8 字節(jié)對齊)。然后,存在 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;

    }

}

然后你創(chuàng)建一個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條經(jīng)驗 獲得超3個贊

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

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

  2. 使用 ByteArrayOutputStream 序列化并發(fā) HashMap。

  3. 使用 toByteArray() 獲取字節(jié)數(shù)組。

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

  5. 使用 Logger 記錄大小。

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


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號