我正在調查 OutOfMemoryError:壓縮類空間問題。我認為,我找到了根本原因和解決方案(Hibernate Validator 方法調用 JAXBContext.newInstance():用戶每次提交操作后的 buildValidatorFactory),但在我的研究過程中,我注意到一件令人困惑的事情。我嘗試運行 jcmd VM.native_memory 和 jstat -gc 來跟蹤類提交大小和 CCSU(壓縮類空間使用情況):d:\experiments>jcmd 59692 VM.native_memory summaryNative Memory Tracking:Total: reserved=10039335KB, committed=889895KB- Java Heap (reserved=8353792KB, committed=522240KB) (mmap: reserved=8353792KB, committed=522240KB)- Class (reserved=1072460KB, **committed=24268KB**) (classes #2518) (malloc=9548KB #2393) (mmap: reserved=1062912KB, committed=14720KB)和d:\experiments>jstat -gc 59692 2s S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT21504,0 21504,0 0,0 0,0 131072,0 56218,7 139264,0 7755,5 14976,0 14318,5 1920,0 1721,7 2 0,012 1 0,036 - - 0,048我預計 NMT 中的“類提交”指標和 jstat 中的 CCSU 指標之間沒有重大差異,但 jstat 顯示大約僅 1,72 MB 的已用內存,而類提交的已使用內存超過 24 MB。因此,我生成了 GC.class_stats 統計數據,它顯示 KlassBytes 約為 1738616 B -> 1,739 MB - 因此它與 CCSU 中 jstat 顯示的值大致相同。我還發現其余的元數據(如方法、常量等)占用了大約 14,44 MB(這與 mmap 中的值大致相同:commited=14720KB - 但我不知道這個數字是多少)。那么剩下的部分在哪里呢?NMT給出的數字到底是多少?
1 回答

MMMHUHU
TA貢獻1834條經驗 獲得超8個贊
Class
本機內存跟蹤報告中的部分顯示了元空間和壓縮類空間的聚合數量。
Java 進程的內存占用演示文稿中的幻燈片
jstat 指標MC
,?MU
,CCSC
和CCSU
代表
元空間容量
使用的元空間
壓縮類空間容量
已使用的壓縮類空間
因此,本機內存跟蹤顯示的提交類與 jstat 指標相關,具有以下不等式:
Class?Committed?>=?MC?+?CCSC?>=?MU?+?CCSU
然而,它們之間的差異可以是任意大的。
從 JDK 10 開始,本機內存跟蹤報告顯示了以下部分的詳細細分Class
:
-?????Class?(reserved=1073841KB,?committed=28593KB) ????????????(classes?#3967) ????????????(??instance?classes?#3694,?array?classes?#273) ????????????(malloc=689KB?#9228)? ????????????(mmap:?reserved=1073152KB,?committed=27904KB)? ????????????(??Metadata:???) ????????????(????reserved=24576KB,?committed=24576KB) ????????????(????used=24131KB) ????????????(????free=445KB) ????????????(????waste=0KB?=0.00%) ????????????(??Class?space:) ????????????(????reserved=1048576KB,?committed=3328KB) ????????????(????used=3003KB) ????????????(????free=325KB) ????????????(????waste=0KB?=0.00%)
添加回答
舉報
0/150
提交
取消