[JVM]方法区、永久代、元空间的关系

方法区与永久代及元空间的关系:

《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的JVM上方法区的实现肯定是不同的了。

永久代和元空间是HotSpot虚拟机中对JVM规范中方法区的实现,而永久代和元空间的区别在JVM不同版本中对方法区的实现

JDK1.7之前永久代是方法区的实现,存放了运行时常量池,包含字符串常量池,静态变量等

JDK1.7永久代是方法区的实现,存放的字符串常量池、静态变量等移出至堆内存运行时常量池等剩下的东西还在永久代(方法区)。

  • 常用参数 JDK1.8之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小
-XX:PermSize=N//方法区(永久代)初始大小
-XX:MaxPermSize=N//方法区(永久代)最大大小,超过这个值将会抛出OutOfMemoryError异常:java.lang.OutOfMemoryError:PermGen

JDK1.8以后永久代元空间替代,相当于元空间实现了方法区,此时字符串常量池和静态变量还在堆运行时常量池还在方法区(元空间),元空间使用的是直接内存

  • 常用参数
-XX:MetaspaceSize=N//设置Metaspace的初始(和最小大小)
-XX:MaxMetaspaceSize=N//设置Metaspace的最大大小
与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。

 

为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?

整个永久代有一个JVM本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到java.lang.OutOfMemoryError。你可以使用-XX:MaxMetaspaceSize标志设置最大元空间大小,默认值为unlimited,这意味着它只受系统内存的限制。-XX:MetaspaceSize调整标志定义元空间的初始大小如果未指定此标志,则Metaspace将根据运行时的应用程序需求动态地重新调整大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值