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