PermGen(永久代)
与方法区的区别
方法区是JVM规范,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
PermGen则是一种具体实现。并且只有HotSpot 才有PermGen。
由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。
不停的动态生成类,就会导致PermGen溢出。
在JDK 1.8中,永久代这个区间就没有了,取而代之的是元空间。
设置参数
-XX:PermSize and -XX:MaxPermSize
java -XX:PermSize=128m -XX:MaxPermSize=256m MyApp
Metaspace(元空间)
移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。
字符串常量由永久代转移到堆中,并且 JDK 1.8 中已经不存在永久代的结论
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
设置参数
-XX:MetaspaceSize and -XX:MaxMetaspaceSize
java -XX:MetaspaceSize =128m -XX:MaxMetaspaceSize=256m MyApp