问九:元空间(MetaSpace)与永久代(PermGen)的区别是什么?

两者介绍:

在JDK1.8之后,开始将类的元数据Meta信息放到本地堆内存中,这部分内存就称为元空间,这在JDK1.7及以前是属于永久代的,但是在JDK1.8之后,元空间就取代了永久代

它们两个都是用来存储class的相关信息的,比如class的method和field等

它们两个都是方法区的实现,只是实现不同,所以说方法区只是JVM的一种规范

元空间(MetaSpace)没有了字符串常量池,在JDK1.7的时候已经移动到了堆中

 

JDK8的变化:

* 移除了永久代(PermGen),替换为元空间(Metaspace);

* 永久代中的 class metadata 转移到了 native memory(本地内存,而不是虚拟机);

* 永久代中的 interned Strings 和 class static variables 转移到了 Java heap;

* 永久代参数 (PermSize MaxPermSize) -> 元空间参数(MetaspaceSize MaxMetaspaceSize)

 

两者区别:

元空间使用本地内存(native mermory),而永久代使用的是JVM的内存(好处是:java.lang.OutOfMemoryError:PermGen spce将不会存在)

 

元空间(MetaSpace)相比永久代(PermGen)的优势:

字符串常量池存在永久代(永久代在JDK7是方法区的一种实现)中,容易出现性能问题和内存溢出

类和方法的信息大小难以确定,给永久代的大小指定带来困难(太小,容易导致永久代溢出   太大,容易导致老年代溢出)

永久代会为GC带来不必要的复杂性

方便HotSpot与其他JVM如JRockit的集成

 

java的方法区在堆中吗?

三种情况:

java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;

java7中,static变量从永久代移到堆中;

java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中

 

全部评论

相关推荐

06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 20:15
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务