JVM內存結構

JVM內存結構

JVM將內存空間劃分爲:方法區本地訪法棧PC寄存器JVM方法棧

 

◆方法區

  • 一個JVM只存在一個方法區,所有線程共享;
  • 類的信息(類的完整有效名稱、父類的完整有效名稱<interface 與 Object除外>、修飾符等);
  • 類中的靜態變量;
  • 類中定義爲final的常量;
  • 類中的Field信息(域名、域類型和域修飾符等);
  • 類中的方法信息(方法名、方法返回類型、方法參數、方法的修飾符、方法的字節碼等);
  • 方法區也可以被GC;
  • 方法區的內存大小默認最小16MB,最大64MB,可通過-XX:PermSize及-XX:MaxPermSize來指定最小最大值;

◆堆

  • 一個JVM只存在一個堆,所有線程共享;
  • 類的實例和數組;
  • 堆的內存大小默認最小值爲物理內存的1/64(<1GB),最大值爲物理內存的1/4(<1GB),可通過-Xms和-Xmx來指定其最大最小值;
  • 當空餘堆內存小於40%時,JVM會增大Heap到-Xmx指定的大小,可通過-XX:MinHeapFreeRatio=來指定此比例;
  • 當空餘堆內存大於70%時,JVM會減小Heap到-Xms指定的大小,可通過-XX:MaxHeapFreeRatio=類指定此比例;
  • 爲了使內存回收更高效,從JDK1.2開始對堆採用分代管理;
    • 新生代(New Generation):一般來說,Java程序中新創建的對象都是從新生代分配內存,新生代由Eden Space和兩塊相同大小的Survisor Space(又稱爲S0和S1或From和To)構成,可通過-Xmn參數來指定新生代的內存大小,也可以通過-XX:SurvisorRatio來調整Eden Space和Survisor Space的大小;
    • 老生代(Old Generation):用於存放新生代中經過多次垃圾回收仍然存活的對象,例如緩存對象,新創建的對象也有可能在老生代上直接分配內存,主要有兩種情況(由不同的GC實現來決定):一種爲大對象,可通過-XX:PretenureSizeThreshold=1024(單位是字節,默認爲0)來代表當對象超過多大時就不在新生代中分配內存,而是直接在老生代中分配,此參數在新生代採用Parallel Scavenge GC時無效,Parallel Scavenge GC會根據運行狀況決定什麼對象直接在老生代中分配內存;另一種爲大的數組對象,且數組中無引用外部對象;
    • 老生代所佔用的內存大小爲-Xmx對應的值減去-Xmn對應的值;

◆本地方法棧

  • 用於支持native方法的執行,存儲每個native方法調用的狀態;
  • JDK中本地方法棧和JVM方法棧是同一個;

◆PC寄存器和JVM方法棧

  • 每個線程都會創建PC寄存器和JVM方法棧;
  • JVM方法棧只有“壓棧”和“出棧”操作,操作的單位是棧幀,其中棧幀由“局部變量區”,“操作數棧“,“棧幀數據區”三部分組成;
  • JVM方法爲線程私有;
  • 當JVM方法棧內存不足時,會拋出StackOverflowError錯誤,可通過-Xss來指定其大小

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