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操做可能会增长。。。