Java虛擬機規(guī)范中只定義了方法區(qū)用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量和即時編譯后的代碼等數(shù)據(jù)。
1、jdk1.7開始符號引用存儲在native heap中,字符串常量和靜態(tài)類型變量存儲在普通的堆區(qū)中,但分離的并不徹底,此時永久代中還保存另一些與類的元數(shù)據(jù)無關(guān)的雜項;
2、jdk8后HotSpot 原永久代中存儲的類的元數(shù)據(jù)將存儲在metaspace中,而類的靜態(tài)變量和字符串常量將放在Java堆中,metaspace是方法區(qū)的一種實現(xiàn),只不過它使用的不是虛擬機內(nèi)的內(nèi)存,而是本地內(nèi)存。在元空間中保存的數(shù)據(jù)比永久代中純粹很多,就只是類的元數(shù)據(jù),這些信息只對編譯期或JVM的運行時有用;
3、永久代有一個JVM本身設(shè)置固定大小上線,無法進行調(diào)整,而元空間使用的是直接內(nèi)存,受本機可用內(nèi)存的限制,并且永遠(yuǎn)不會得到j(luò)ava.lang.OutOfMemoryError;
4、符號引用沒有存在元空間中,而是存在native heap中,這是兩個方式和位置,不過都可以算作是本地內(nèi)存,在虛擬機之外進行劃分,沒有設(shè)置限制參數(shù)時只受物理內(nèi)存大小限制,即只有占滿了操作系統(tǒng)可用內(nèi)存后才OOM。