偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

警惕大量類加載器的創(chuàng)建導(dǎo)致詭異的Full GC

開發(fā) 開發(fā)工具
從JDK8開始,任何GC,都會(huì)默認(rèn)打印GC Cause,所以你看到上面的Full GC是因?yàn)镸etadata GC Threshold觸發(fā)的,也就是Metaspace committed的內(nèi)存加上這次要分配的內(nèi)存達(dá)到了MetaspaceSize的閾值。

[[193457]]

言歸正傳,今天有個(gè)同事找我,其實(shí)好像之前就找過我,一直因?yàn)樘Γ竺婢屯浰氖铝?,到今天還沒查出原因就又找了過來,現(xiàn)象是系統(tǒng)老是進(jìn)行Full GC,在啟動(dòng)沒過多久就會(huì)發(fā)生Full GC,這個(gè)現(xiàn)象相對(duì)比較少見的,于是找他要了GC日志,赫然看到如下日志:

 

這個(gè)很顯然就是達(dá)到了Metaspace的閾值觸發(fā)的Full GC了,但是看看Metaspace的size,使用了134M左右,于是我詢問他MetaspaceSize和MaxMetaspaceSize分別設(shè)置了多少,告知我設(shè)置的是256M,那就有幾個(gè)比較奇怪的地方了:

  • 為什么啟動(dòng)沒多久就因?yàn)镸etaspace觸發(fā)了Full GC
  • 從使用率來看并沒有達(dá)到閾值
  • 在Full GC之后立馬就能正常運(yùn)行一段時(shí)間,說明Metaspace確實(shí)回收了

先說個(gè)JVM的BUG

從上面的GC日志,我們看到了Full GC前后,Metaspace的使用變化是從137752K->71671K,其實(shí)你們?nèi)绻玫膐racle官方的JDK,看到的會(huì)是137752K->137752K,也就是并沒有發(fā)生變化,看起來好像Metaspace并沒有被回收,其實(shí)這是JVM的一個(gè)BUG,我們alijdk將這個(gè)問題進(jìn)行了修復(fù),能看到前后是有變化的,所以如果大家在排查Metaspace的問題時(shí)候,希望不要被這個(gè)信息騙到

再聊點(diǎn)GC日志

從JDK8開始,任何GC,都會(huì)默認(rèn)打印GC Cause,所以你看到上面的Full GC是因?yàn)镸etadata GC Threshold觸發(fā)的,也就是Metaspace committed的內(nèi)存加上這次要分配的內(nèi)存達(dá)到了MetaspaceSize的閾值。如果是JDK7(之前版本不支持),那可以通過加JVM參數(shù)-XX:+PrintGCCause來打印原因,可以通過下面的圖片小程序鏈接點(diǎn)進(jìn)去看看這個(gè)參數(shù)的具體用法及含義:

再提一點(diǎn),Metaspce觸發(fā)的GC都是Full GC。

另外大家??吹降念愃葡旅娴腁llocation Failure的GC Cause,其實(shí)是正常的,因?yàn)榇蟛糠諫C,尤其是YGC,都是因?yàn)榉峙鋬?nèi)存失敗才觸發(fā)的,所以不要認(rèn)為看到Failure就覺得有問題。

為何使用率這么低就觸發(fā)了Full GC

Metaspace觸發(fā)Full GC,是因?yàn)镸etaspace committed的內(nèi)存加上這次要分配的內(nèi)存之和超過了閾值才會(huì)觸發(fā),但是我們看使用了才134M,而閾值卻是256M,那可能懷疑下面兩種情況:

這次分配的內(nèi)存達(dá)到122M以上?

碎片化問題?

對(duì)于***種情況,基本不太可能,因?yàn)橐粋€(gè)類不可能要這么大內(nèi)存,所以暫時(shí)先排除這種可能。

對(duì)于第二種情況,有一個(gè)場景是能滿足的,類加載器創(chuàng)建非常多,但是每個(gè)類加載器加載的類又特別少,同時(shí)Full GC之后又能很快被回收掉

為了驗(yàn)證第二種情況,我嘗試加兩個(gè)參數(shù)-XX:+HeapDumpBeforeFullGC和-XX:+HeapDumpAfterFullGC,在Full GC前后分別對(duì)內(nèi)存做一個(gè)dump,這兩個(gè)參數(shù),可以通過下面的圖片小程序鏈接看到具體的使用情況

從兩個(gè)dump的分析結(jié)果來看,查了下類加載器的情況,果然在Full GC之前看到了31650個(gè)類加載器,而Full GC之后,類加載器個(gè)數(shù)變成了872個(gè),于是開始找究竟是哪些類加載器,最終發(fā)現(xiàn)某個(gè)特定類型的類加載器對(duì)象非常之多,咨詢了業(yè)務(wù)方確實(shí)存在這種情況,因?yàn)闆]有做好緩存,所以導(dǎo)致了無止境創(chuàng)建

類加載器過多為什么會(huì)導(dǎo)致Full GC

類加載器創(chuàng)建過多,帶來的一個(gè)問題是,在類加載器***次加載類的時(shí)候,會(huì)在Metaspace里會(huì)給它分配內(nèi)存塊,為了分配高效,每個(gè)類加載器用來存放類信息的內(nèi)存塊都是獨(dú)立的,所以哪怕你這個(gè)類加載器只加載一個(gè)類,也會(huì)為之分配一塊空的內(nèi)存給這個(gè)類加載器,其實(shí)是至少兩個(gè)內(nèi)存塊,于是你有可能會(huì)發(fā)現(xiàn)Metaspace的內(nèi)存使用率非常低,但是committed的內(nèi)存已經(jīng)達(dá)到了閾值,從而觸發(fā)了Full GC,如果這種只加載很少類的類加載器非常多,那造成的后果就是很多碎片化的內(nèi)存

JVMPocket介紹

JVMPocket是我最近搗鼓的一個(gè)微信小程序,大家可以通過搜索JVMPocket或者從我公眾號(hào)菜單里進(jìn)入,該小程序主要緣因JVM參數(shù)而誕生,有人問我相關(guān)的問題,告訴他們什么參數(shù)可以解決,但是苦于參數(shù)太長而無法記住,特尷尬,有了JVMPocket之后,直接找到對(duì)應(yīng)的參數(shù)發(fā)個(gè)鏈接過去就可以看到對(duì)應(yīng)參數(shù)的具體含義,用法,默認(rèn)值以及大家的使用建議等,希望該小程序也能幫到大家,大家如果自己的JVM參數(shù)經(jīng)驗(yàn),都可以到對(duì)應(yīng)的參數(shù)下面留言讓更多人知道它背后的故事。

JVMPocket

JVM參數(shù)錦囊

【本文是51CTO專欄作者李嘉鵬的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)(你假笨,id:lovestblog)聯(lián)系作者本人獲取授權(quán)】 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2012-02-09 10:31:17

Java

2025-04-24 09:01:37

2012-08-16 10:43:10

GC

2021-04-12 09:36:14

JVM生產(chǎn)問題JVM FULL GC

2017-07-05 14:14:33

MySQL表服務(wù)變慢

2020-03-03 17:35:09

Full GCMinor

2025-03-31 04:25:00

2024-03-12 07:44:53

JVM雙親委托機(jī)制類加載器

2009-08-25 11:30:47

瀏覽器間諜木馬病毒卡巴斯基

2010-03-16 14:58:15

Java類加載器

2021-07-05 06:51:43

Java機(jī)制類加載器

2024-06-24 14:52:50

Android類加載器

2024-06-03 10:10:01

2022-12-17 19:49:37

GCJVM故障

2025-06-26 03:33:00

2009-04-15 10:49:01

木馬釋放器卡巴斯基

2009-03-12 17:51:08

日志宕機(jī)SQL Server

2021-05-08 09:02:19

Java加載器

2024-03-08 08:26:25

類的加載Class文件Java

2024-12-04 09:01:55

引導(dǎo)類加載器C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)