1. 程式人生 > >JVM執行時資料區-方法區

JVM執行時資料區-方法區

基本概念

     在hotspot jvm實現當中,在jdk8以前,方法區的實現為PermGen,即永久代,主要存放類的資訊,方法的資訊,常量池,靜態變數,符號解析;而jdk8+,則去除了PermGen,使用元空間MetaSpace代替,元空間使用的是本地記憶體,理論上可以無限大,最大大小指受限於本地記憶體大小,所以不會在出現outOfMemoryError:PermGen的異常。同時在jdk8+,原在PermGen的字串常量移動到了堆,所以堆會有所變大。

JVM引數解析

     PermGen相關

jdk8以前,主要引數為MaxPermSize和PermSize,分別用於設定持久代的最大大小,預設為64M和初始大小。而jdk8+,設定這兩個引數則會提示警告。jdk8+做出去除PermGen,改用MetaSpace的原因是JVM啟動時,會根據分配PermSize大小的連續空間,如果程式用不上,則造成浪費;同時由於是固定的,無法確定多大合適,不方便調優。

    MetaSpace相關

初始預設大小為20.8M,與MetaspaceSize和MaxMetaspaceSize的設定無關;MetaspaceSize引數,即-XX:MetaspaceSize=xxM,用於設定當MetaSpace達到xxM時,則傳送FGC,且之後每次擴容都會發送FGC;MaxMetaspaceSize引數:設定元空間的最大大小,預設為無上限,不過如果無上限,則在發生記憶體洩露時,則可能會被OS kill掉。經驗上,MetaspaceSize和MaxMetaspaceSize可以設定為一樣,且對大多數專案256M足夠。同時,在程式執行一段時間穩定後,可以通過命令:jstat -gc pid,檢視實際大小。同時這兩個引數不能設定過小,否則會發生頻繁FGC,甚至OOM。