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

方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存1、此区域是线程共享的。储存已加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;2、常量池:编译器生成的各种字面量和符号引用;3、关于字符串常量池和运行时常量池的位置说明:jdk1.6存在永久代,字符串常量池、运行时常量池都是在永久代中;jdk1.7存在永久代,字符串常量池被移动到了堆当中,运行时常量池还是在永久代中;jdk1.8不存在永久代,实现形式是元空间,字符串常量池仍然在堆当中,运行.

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

方法区(落地实现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.net/142658.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月23日 上午10:20
下一篇 2022年5月23日 上午10:20


相关推荐

  • HTTP 协议入门

    HTTP 协议入门

    2021年11月4日
    43
  • burpsuite简单抓包教程[通俗易懂]

    burpsuite简单抓包教程[通俗易懂]一.配置浏览器(以火狐为例)1.打开菜单,找到选项,点击翻到最下面点击设置,将配置的代理服务器改为手动代理配置,HTTP代理设为127.0.0.1,端口设置为8080(为了burpsuite能截到浏览器发送出来的请求),点击确定。二.burpsuite的设置点击proxy选择Options观察图中的IP地址及端口,如果不是127.0.0.1:8080,则点击add,添加端口和IP地…

    2022年6月14日
    129
  • 修复Domino数据库视图索引的两种方法

    修复Domino数据库视图索引的两种方法环境 产品:LotusNotes/Domino 平台:跨平台 版本:ALL 问题描述 修复Domino数据库视图索引的两种方法 解答 第一种方法: 1。在控制台上运行命令:loadfixup数据库名 2。在控制台上运行命令:loadupdall

    2022年7月22日
    24
  • 联邦学习(Federated Learning)

    联邦学习(Federated Learning)联邦学习简介联邦学习 FederatedLea 是一种新兴的人工智能基础技术 在 2016 年由谷歌最先提出 原本用于解决安卓手机终端用户在本地更新模型的问题 其设计目标是在保障大数据交换时的信息安全 保护终端数据和个人数据隐私 保证合法合规的前提下 在多参与方或多计算结点之间开展高效率的机器学习 其中 联邦学习可使用的机器学习算法不局限于神经网络 还包括随机森林等

    2026年3月26日
    2
  • Java e.printStackTrace()异常信息怎么打印到log日志中

    Java e.printStackTrace()异常信息怎么打印到log日志中Java e.printStackTrace()异常信息怎么打印到log日志中

    2022年4月24日
    54
  • python 连接MySQL数据库的简单方法

    python 连接MySQL数据库的简单方法进行 Python 连接 mysql 数据库之前 需要先安装一下 pymysql 直接在终端执行下面的命令即可 2 测试是否能连接成功以下代码实现了连接到一个 database 并选择了其中一个表查询所有数据 3 参考资料正向资料 用上的 如何快速用 python 连接 mysql 数据库 看完你就明白了 baidu com Python 连接 MySQL 数据库的多种方式 kristin n 博客园 cnblogs com Python 如何连接 Mysql 及基本操作 骑着乌龟赶猪 博客园 cnblo

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号