JDK1.8去除永久代引入元空间的原因您知道吗

JDK1.8去除永久代引入元空间的原因您知道吗_第1张图片

之前写了一篇文章 JVM中的堆和栈到底存储了什么 重点介绍了Java虚拟机运行时数据区中堆、栈以及方法区存储数据的相关知识很受大家欢迎,今天来介绍一下jdk 1.8开始引入的元空间,元空间的引入也是与Java虚拟机运行时存储数据有关。

元空间

JDK8之后就没有永久代(Permanent Generation,简称PermGen),取而代之的是元空间(meta space)。元空间放置于本地的内存中。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。所以元空间的最大可利用内存空间就是系统的内存空间,这就不会再出现像永久代的内存溢出错误了。我们可以为通过参数–XX:MetaspaceSize 为元空间设置一个可用空间最大值。下图对PermGen和meta space进行了对比

JDK1.8去除永久代引入元空间的原因您知道吗_第2张图片

JDK 1.7到1.8,JVM的变化

其实JVM 1.7到1.8的变化,主要是方法区的变化,方法区在JDK1.7的时候叫做永久代,JDK1.8之后废弃了永久代改为元空间。方法区用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等,回收目标主要是常量池的回收和类型的卸载,各线程共享,具体如下图所示:

JDK1.8去除永久代引入元空间的原因您知道吗_第3张图片

JDK1.8去除永久代引入元空间的原因

主要基于以下两点原因:
1、由于Permanent Generation内存经常不够用或发生内存泄露,引发恼人的java.lang.OutOfMemoryError: PermGen (在Java Web开发中非常常见)。

2、移除Permanent Generation可以促进HotSpot JVM与JRockit VM的融合,因为JRockit没有永久代。

你可能感兴趣的:(Java,jvm,java,开发语言)