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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

2 回答

?
慕慕森

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊

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


Java 中的每個(gè)對(duì)象都有兩個(gè)標(biāo)頭,它們的大小取決于平臺(tái)或 jvm 以 ( UseCompressedOops) 開頭的配置。


然后是字段和對(duì)象本身之間的填充和對(duì)齊(8 字節(jié)對(duì)齊)。然后,存在 JVM 根本不顯示的空間,因?yàn)樗荒芑虼_實(shí)需要。


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


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)建一個(gè)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());


查看完整回答
反對(duì) 回復(fù) 2022-11-30
?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

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

  1. 創(chuàng)建一個(gè)后臺(tái)線程(不是前臺(tái))。

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

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

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

  5. 使用 Logger 記錄大小。

其他選項(xiàng)是使用像 JProfiler 這樣的探查器來查看對(duì)象圖及其大小。


查看完整回答
反對(duì) 回復(fù) 2022-11-30
  • 2 回答
  • 0 關(guān)注
  • 167 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)