GC日志中,Metaspace的這幾個(gè)參數(shù)你知道嗎?

Metaspace這一行里面的 used ,capacity ,committed ,reserved 具體都代表什么意思?

Heap
  PSYoungGen      total 10752K, used 4419K
    [0xffffffff6ac00000, 0xffffffff6b800000, 0xffffffff6b800000)
    eden space 9216K, 47% used
      [0xffffffff6ac00000,0xffffffff6b050d68,0xffffffff6b500000)
    from space 1536K, 0% used
      [0xffffffff6b680000,0xffffffff6b680000,0xffffffff6b800000)
    to   space 1536K, 0% used
      [0xffffffff6b500000,0xffffffff6b500000,0xffffffff6b680000)
  ParOldGen       total 20480K, used 20011K
      [0xffffffff69800000, 0xffffffff6ac00000, 0xffffffff6ac00000)
    object space 20480K, 97% used 
      [0xffffffff69800000,0xffffffff6ab8add8,0xffffffff6ac00000)
  Metaspace       used 2425K, capacity 4498K, committed 4864K, reserved 1056768K
    class space   used 262K, capacity 386K, committed 512K, reserved 1048576K

有點(diǎn)懵?

上網(wǎng)搜了下,找到官方文檔 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html
其中有這么一段描述:
Java Hotspot VM explicitly manages the space used for metadata. Space is requested from the OS and then divided into chunks. A class loader allocates space for metadata from its chunks (a chunk is bound to a specific class loader). When classes are unloaded for a class loader, its chunks are recycled for reuse or returned to the OS. Metadata uses space allocated by mmap, not by malloc.

In the line beginning with Metaspace, the used value is the amount of space used for loaded classes. The capacity value is the space available for metadata in currently allocated chunks. The committed value is the amount of space available for chunks. The reserved value is the amount of space reserved (but not necessarily committed) for metadata. The line beginning with class space line contains the corresponding values for the metadata for compressed class pointers.

英語描述看完還是懵,繼續(xù)搜,在Stack Overflow找到一張圖

image.png
  • used:加載的類的空間量。
  • capacity: 當(dāng)前分配塊的元數(shù)據(jù)的空間。
  • committed: 空間塊的數(shù)量。
  • reserved:元數(shù)據(jù)的空間保留(但不一定提交)的量。

提交,什么意思?

Metaspace由一個(gè)或多個(gè)虛擬空間組成,虛擬空間的分配單元是Chunk,其中Chunk使用列表進(jìn)行維護(hù)。

當(dāng)使用一個(gè)classLoader加載一個(gè)類時(shí),過程如下:
1、當(dāng)前classLoader是否有對應(yīng)的Chunk且有足夠的空間。
2、查找空閑列表中的有沒有空閑的Chunk。
3、如果沒有,就從當(dāng)前虛擬空間中分配一個(gè)新的Chunk,這個(gè)時(shí)候會(huì)把對應(yīng)的內(nèi)存進(jìn)行Commit,這個(gè)動(dòng)作就是提交。
4、如果當(dāng)前虛擬空間不足,則預(yù)留(reserves)一個(gè)新的虛擬空間。

reserved是jvm啟動(dòng)時(shí)根據(jù)參數(shù)和操作系統(tǒng)預(yù)留的內(nèi)存大小。
committed是指那些被commit的Chunk大小之和;
capacity是指那些被實(shí)際分配的Chunk大小之和;

因?yàn)橛蠫C的存在,有些Chunk的數(shù)據(jù)可能會(huì)被回收,那么這些Chunk屬于committe的一部分,但不屬于capacity

另外,這些被分配的Chunk,基本很難被100%用完,存在碎片內(nèi)存的情況,這些Chunk實(shí)際被使用的內(nèi)存之和即used的大??;

所以,如何一個(gè)服務(wù)中被代理的方法特別特別多,就可能存在創(chuàng)建特別特別多的classLoader對象,一個(gè)classLoader對象至少需要一個(gè)Chunk,這個(gè)Chunk可能只放一個(gè)class信息,那么就存在特別特別嚴(yán)重的內(nèi)存碎片,繼而就存在一個(gè)隱患,可能發(fā)生特別頻繁的FGC,而且是由Metaspace不足引起的。

還懵嗎?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容