sun/oracle jdk的hotspot vm中,直到jdk7都有「持久代」(permanent generation,簡稱permgen)。也稱為方法區。
oracle jdk8的hotspot vm去掉「持久代」,以「元資料區」(metaspace)替代之。
方法區(邏輯上):
是邏輯上的東西,是jvm的規範,所有虛擬機器必須遵循的
方法區是所有執行緒共享的,用於儲存類的資訊、常量池、方法資料、方法**等。
永久代:(屬於實現方法區的乙個方案,在jdk7以及之前的版本存在,jdk8移除永久代)
就是:permgen space
。
元空間:(jdk8之後)
元空間與永久代之間最大的區別在於:元空間並不在虛擬機器中,而是使用本地記憶體。
是為了避免oom異常。
因為通常使用 -xx:permsize 和 -xx:maxpermsize設定永久代的初始大小和設定永久代的最大值,但是不是總能知道應該設定為多大合適, 如果使用預設值很容易遇到oom(即outofmemory)錯誤。
jdk8 的方法區是元空間,其引數設定是-xx:metaspacesize=n 設定原始元空間大小 -xx:maxmetaspacesize=n
設定最大元空間大小,但預設是沒有限制的。
當使用元空間時,可以載入多少類的元資料就不再由maxpermsize控制, 而由系統的實際可用空間來控制。
元空間在jdk8中不再與堆是連續的物理記憶體,而是改為使用本地記憶體(native memory)。元空間使用本地記憶體也就意味著只要本地記憶體足夠,就不會出現oom的錯誤。預設情況下元空間大小是無限的。
不同的jdk版本,常量池的位置也是不同的
永久代,方法區 和 元空間之間的關係
jvm記憶體結構分為 堆,方法區,棧,程式計數器,本地方法區。這些都是邏輯記憶體區域劃分,實際上不同的 虛擬機器的實現方式是不同的,我們常用的也是普及率最高 的虛擬機器hotspot,只有他有永久代這個概念。為什麼會移除永久代 表面上看是為了避免oom異常。因為通常使用permsize和maxper...
JVM的方法區和永久帶的區別和關係
原文這這裡 什麼是方法區?方法區 method area 是jvm規範裡面的執行時資料區的乙個組成部分,jvm規範中的執行時資料區還包含了 pc暫存器 虛擬機器棧 堆 方法區 執行時常量池 本地方法棧。方法區儲存東西?主要用來儲存class 執行時常量池 字段 方法 jit 等。注意 1 執行時資料...
JVM的方法區和永久帶的關係
原文這這裡 什麼是方法區?方法區 method area 是jvm規範裡面的執行時資料區的乙個組成部分,jvm規範中的執行時資料區還包含了 pc暫存器 虛擬機器棧 堆 方法區 執行時常量池 本地方法棧。方法區儲存東西?主要用來儲存class 執行時常量池 字段 方法 jit 等。注意 1 執行時資料...