JVM執行時資料區 方法區

2021-08-31 14:00:18 字數 754 閱讀 7220

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

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

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

JVM執行時資料區

根據 jvm 規範,jvm 記憶體共分為虛擬機器棧 堆 方法區 程式計數器 本地方法棧五個部分。記憶體空間 runtime data area 中可以按照是否執行緒共享分為兩塊,執行緒共享的是方法區 method area 和堆 heap 執行緒獨享的是虛擬機器棧 vm stack 本地方法棧 na...

JVM 執行時資料區

jdk版本 8 class檔案 class content class物件 物件 的含義 class檔案 儲存在磁碟上的.class檔案 十六進製制位元組碼檔案 class content 類載入器子系統載入class檔案,儲存到記憶體中的位元組流,解析前這塊記憶體區域叫class content ...

JVM執行時資料區

1.1.hotspot vm 是之前使用最廣泛的j a虛擬機器,1.2.jrockit vm 是bea 開發的一款虛擬機器是 號稱 執行最快的j a虛擬機器 1.3.j9 vm 是ibm開發的一款虛擬機器 1.4.dalvik vm 是google 開發的一款移動端虛擬機器 1.5 taobaovm...