JVM內存模型之方法區

方法區 又稱非堆區(Non-Heap)

屬於 線程共有

內容 主要用來存放已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。JDK8之前又被稱爲永久帶 (Permanent Generation),JDK8永久帶已被元空間 (MetaSpace)替代,雖然JDK1.7仍然保留永久帶,但存儲在永久代的部分數據就已經轉移到了Java Heap或者是 Native Heap。譬如符號引用(Symbols)轉移到了native heap;字面量(interned strings)轉移到了java heap;類的靜態變量(class statics)轉移到了java heap。

錯誤及代碼 會報OutOfMemoryError: Metaspace

//-XX:MetaspaceSize=4m  -XX:MaxMetaspaceSize=4m
public class TestMethodArea {
    public static void main(String[] args) {
        while (true){
            new TestMethodArea();
        }
    }
}

常用參數 -XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值。   -XX:MaxMetaspaceSize,最大空間,默認是沒有限制的。

  除了上面兩個指定大小的選項以外,還有兩個與 GC 相關的屬性:   -XX:MinMetaspaceFreeRatio,在GC之後,最小的Metaspace剩餘空間容量的百分比,減少爲分配空間所導致的垃圾收集   -XX:MaxMetaspaceFreeRatio,在GC之後,最大的Metaspace剩餘空間容量的百分比,減少爲釋放空間所導致的垃圾收集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章