永生代
永生代默認的最大內存大小是在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: