前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?

方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?

作者头像
全栈程序员站长
发布2022-08-31 19:05:28
4960
发布2022-08-31 19:05:28
举报

大家好,又见面了,我是你们的朋友全栈君。

方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存,它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆。

1、此区域是线程共享的。储存已加载的类型信息、常量、静态变量、即时编译器编译后的代码等数据;

2、常量池:编译器生成的各种字面量和符号引用;

3、关于字符串常量池和运行时常量池的位置说明:

JDK版本

方法区实现

变化

jdk1.6

永久代

字符串常量池、运行时常量池、静态变量都是在永久代中

jdk1.7

永久代

字符串常量池和静态变量被移动到了堆当中,运行时常量池还是在永久代中

jdk1.8

元空间

字符串常量池和静态变量仍然在堆当中;运行时常量池、类型信息、常量、字段、方法被移动都了元空间中

4、元空间的好处:

① 减少报OOM的可能:元空间与永久代类似,本质区别是元空间并不占用虚拟机内存了,而是使用本地内存,由于本地内存一般是比较大的,所以方法区就没有那么容易报OOM(OutOfMemoryError)。 ② 提高JVM性能:元空间的垃圾回收很少,一定程度上减少了GC扫描及压缩的时间。 ③类及相关的元数据的生命周期与类加载器的一致; ④ 每个加载器有专门的存储空间。 元空间的对象被垃圾回收的概率相对堆空间的对象是要小很多的,所有将两者分开,就减少了很多去扫描元空间对象带来的开销。

5、字符串常量池为什么要移动到堆空间中? 个人的理解:对于字符串常量这种创建完成用几次就不被使用的对象,是很容易被回收的。而要进行频繁垃圾回收的地方是堆空间, 这样在JDK7就把字符串常量池移动到堆空间中就是很明智和有必要的选择了。这样就避免了放到不频繁进行垃圾回收的元空间中应该被垃圾回收的对象而不能及时进行垃圾回收的浪费空间的现象出现。

思考:那么静态变量为什么也要在JDK7和字符串常量池一起移动到堆空间中呢?静态变量是不是和类一样的生命周期吗?

尚硅谷深解Java虚拟机(JVM)内存结构各部分总结【三层划分】https://blog.csdn.net/qq_43012792/article/details/107358550

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142658.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档