前不久在JVM羣裏阿飛和泉子在討論metaspace的兩個參數的含義,我看了下阿飛的文章——JVM參數MetaspaceSize的誤解,問題主要是對這兩個參數的理解有點誤解。
今天下午發現在沒有設置MetaspaceSize的情況下,從Mxbean獲取的max值是-1,因此就連帶這個問題也一塊搞了搞,總結如下:
- MaxMetaspaceSize用於設置metaspace區域的最大值,這個值可以通過mxbean中的MemoryPoolBean獲取到,如果這個參數沒有設置,那麼就是通過mxbean拿到的最大值是-1,表示無窮大。
- MetaspaceSize表示metaspace首次使用不夠而觸發FGC的閾值,只對觸發起作用,原因是:垃圾蒐集器內部是根據變量
_capacity_until_GC
來判斷metaspace區域是否達到閾值的,初始化代碼如下所示: void MetaspaceGC::initialize() { // Set the high-water mark to MaxMetapaceSize during VM initializaton since // we can't do a GC during initialization. _capacity_until_GC = MaxMetaspaceSize; } GC收集器會在發生對metaspace的回收會,會計算新的_capacity_until_GC值,以後發生FGC就跟MetaspaceSize沒有關係了
屏幕快照 2018-10-16 下午6.39.08.png
- 如果不設置MetaspaceSize,則默認的_capacity_until_GC爲20M左右,具體代碼如下:
屏幕快照 2018-10-16 下午6.46.27.png