方法区与常量池(静态常量池与运行时常量池)

方法区是线程共享的内存区域,存储类型信息、常量、静态变量等。在JVM中,从JDK8开始,永久代被元空间取代。运行时常量池是方法区的一部分,包含编译期的字面量和符号引用,运行时还能动态添加常量。如果方法区或运行时常量池内存不足,会抛出OutOfMemoryError异常。
摘要由CSDN通过智能技术生成

方法区

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

他也有一个别名为"非堆",目的是与Java堆区分开来。

方法区和永久代

在JDK8以前,很多把方法区和永久代混为一谈,本质上这两者并不是等价的,仅仅是因为当时的HotSpot虚拟机设计团队选择吧收集器的分代设计扩展至方法区,或者说使用永久代来实现方法区而已,这样使得HotSpot的垃圾收集器能够像管理Java堆一样管理方法区的内存,省去专门为方法区编写内存管理的工作。

但是对于其他的虚拟机是不存在永久代的概率的。

缺陷以及改变

缺陷
使用永久代来实现方法区的使得Java应用更容易遇到内存溢出的问题(永久代有-XX:MaxPermSize的上限,几时不设置也有默认大小,而J9和JRockit只要没有触碰到进程可用内存的上限,例如32位系统中的4GB限制,就不会出现问题)

而极少数的方法(例如:String::intern())会因为永久代的原因导致在不同虚拟机下有不同的表现

改变

  • 在JDK6的时候HotSpot开发团队就有放弃永久代,逐步改为采用本地内存来实现方法区的计划了
  • 到了JDK7,已经把原本放入永久代的字符串常量池、静态变量等移出
  • 到了JDK8,终于完全废弃了永久代的概念了,该用与JRockit、J9一样在本地内存中实现的元空间来代替,并将在JDk7中永久代还剩余的内容全部移到元空间中
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值