JDK8從永生代到元數據區


永生代

永生代默認的最大內存大小是在32位JVM上為64MB, 在64位JVM上為82MB。可以通過-XX:PermSize=[size]-XX:MaxPermSize=[size]來調整。

永生代包含類和方法的元數據信息, 一般情況下它需要的空間不是很大, 但是由於熱部署等一些特性會導致類信息越來越多, 從而發生內存溢出(OutOfMemoryError)。

永生代的大小是在啟動時指定的(通過-XX:MaxPermSize=xxm), 並且不能在運行時重新動態調整。

 

元數據區

雖然元數據區替代了永生代, 但是它還是可能發生內存溢出的, 默認情況下元數據區的大小上限即為剩余物理內存的大小, 但是也可以指定最大元數據區大小。指定元數據區大小的參數為: -XX:MaxMetaspaceSize.

元數據區會在達到指定大小時發生垃圾回收, 設置的參數是:-XX:MetaspaceSize

在元數據區也沒有了klasses, 這是用來存儲初始加載的類的描述信息, 意味着元數據區只存儲原始類的信息。

另外還有兩個參數:

-XX:MinMetaspaceFreeRatio: 當內存剩余比例小於這個值時垃圾回收會頻繁一些, 默認40%。

-XX:MaxMetaspaceFreeRatio: 當內存剩余比例大於這個值時垃圾回收頻率會低一點,默認70%。

 

常量池

常量池的實現為一個固定大小的hash字典, 每個桶里包含一個具有相同hash值的字符串數組。

jdk7之前常量池是在永生代中, 從jdk7開始常量池從永生代移除, 放到了堆中。

jdk6中常量池默認大小為1009,jdk6早期這個不可配置, jdk6u30到jdk6u41可配置。而在jdk7中從jdk7u02開始可以配置。從jdk7u40開始, 常量池的默認大小為60013。

參數:

-XX:PrintStringTableStatistics: JVM進程退出時會打印StringTable統計信息

-XX:StringTableSize=N指定常量池大小

 

Refer:

https://www.baeldung.com/java-permgen-metaspace

http://java-performance.info/string-intern-in-java-6-7-8/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM