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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容