1. 程式人生 > >JVM記憶體模型之方法區

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剩餘空間容量的百分比,減少為釋放空間所導致的垃圾收集