1. JDK7 的PermGen 永久代java
永久代一直存在於jdk7和它的迭代版本中, 一直被gc使用。 在jdk7中, 開始移除永久代,在永久代中的一部分數據被移到java 堆或者原始native heap(本地堆??)。 在jdk7中, 永久代並無被徹底移除, 他仍然存在。jdk7中要移出永久代的數據類型:優化
Symbols 被移到native heapspa
Interned String 被移到 java heapserver
Class statis 被移到 java heap內存
2. JDK7: G1 與 PermGenssl
在使用G1 GC時, PermGen僅僅在Full GC 時, 纔會被收集。若是G1 GC 優化運行, 那麼他就不須要Full GC. 僅僅在PermGen滿了或者應用分配內存的速度比G1 並行GC回收的更快, G1纔會調用Full GC作回收。 在使用CMS GC 的時候, 可使用 -XX:+CMSClassUnloadingEnabled 回收處於CMS 並行週期中的PermGen空間。 CMS GC 沒有與G1 GC相同的選項,好比剛纔提到CMS的 -XX:+CMSClassUnloadingEnabled。 只有在Full (讓世界停轉) GC的時候, G1 GC纔會執行。 用PermSize 和 MaxPermSize 按需調節PermGen size 。it
3. JDK8: PermGenio
永久代已經徹底從JDK8中移除了。 class
4. JDK: Metaspace cli
GC (Metadata GC Threshold) 因Metaspace分配失敗,而觸發GC操做。能夠用如下命令調節關於Metaspace的大小。
在JDK8中, classes metadata 存儲於native heap中, 而且native heap已經改名爲Metaspace了。有一些關於Metaspace的新標記被添加到JDK8中:
-XX:MetaspaceSize=<NNN> <NNN>是class metadata佔用的初始內存空間大小(以字節爲單位計量),而class metadata數據可能會觸發GC,卸載加載的類信息。 <NNN>是近似值。在第一次達到Metaspace的高水位線後, 下一次高水位線會被garbage collector管理。
-XX:MaxMetaspaceSize=<NNN> <NNN>是class metadata所佔用的最大的內存空間(以字節爲單位計量)。這個標記能夠被用於限制Metaspace佔用內存大小。<NNN>是近似值。默認沒有限制。
-XX:MinMetaspaceFreeRatio=<NNN> <NNN>是在GC後, 空閒的class metadata區域內存容量佔總的Metadata的最小的百分比,
即(free Metaspace / Total Metaspace = <NNN>)這是爲了不class metadata 佔用Metaspace內存量的增加而引發GC。
-XX:MaxMetaspaceFreeRatio=<NNN> 含義同MinMetaspaceFreeRatio, 惟一的區別是MinMetaspaceFreeRatio設置最小的比例, 而MaxMetaspaceFreeRatio是設置最小的比例。
5. 默認地, class metadata 佔用內存量僅僅是受native heap memory大小的限制。可使用一個新的參數 MaxMetaspaceSize限制供class metadata使用的native memory的大小。MaxMetaspaceSize 相似於MaxPermSize。當class metadata 佔用內存大小達到MetaspaceSize(MetaspaceSize 大小默認設置:在32-bit client VM上是12MB, 在32-bit server VM上或者64-bit VM上是16MB)的時候,GC會回收那些再也不被使用的classloader 和 class。將MaxMetaspaceSize設置到一個比默認值更高的數值是爲了延遲GC操做(或者說減小GC操做)。在觸發GC操做以後, 觸發下一輪GC操做可能會增長。。。