JAVA内存模型(二) 永久代和元空间

2018-07-13  本文已影响0人  Minstrel_a7ca

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

上一篇下一篇

猜你喜欢

热点阅读