JAVA基础(1)JAVA方法区和运行时常量池

这个系列的文章来自于《JAVA成神之路》,以下是学习笔记,原文章地址
https://www.hollischuang.com/archives/tag/java工程师成神之路
另外推荐几个JAVA的公众号:JAVA团长,Hollis星球等
一些博客:萌小Q的博客园(通俗易懂哦)、
以及一些互联网上的资料,

1、方法区特征
• 同 Java 堆一样,方法区也是全局共享的一块内存区域
• 方法区的作用是存储 Java 类的结构信息,当我们创建对象实例后,对象的类型信息存储在方法堆之中,实例数据存放在堆中;实例数据指的是在 Java 中创建的各种实例对象以及它们的值,类型信息指的是定义在 Java 代码中的常量、静态变量、以及在类中声明的各种方法、方法字段等等;同时可能包括即时编译器编译后产生的代码数据。
• JVM 不要求该区域实现自动的内存管理,但是商用 JVM 一般都已实现该区域的自动内存管理。
• 方法区分配内存可以不连续,可以动态扩展。
• 该区域并非像 JMM 规范描述的那样数据一旦放进去就属于 “永久代”;在该区域进行内存回收的主要目的是对常量池的回收和对内存数据的卸载;一般来说这个区域的内存回收效率比起 Java 堆要低得多。
• 当方法区无法满足内存需求时,将抛出 OutOfMemoryError 异常。
2、运行时常量池的特征
• 运行时常量池是方法区的一部分,所以也是全局共享的。
• 其作用是存储 Java 类文件常量池中的符号信息。
• class 文件中存在常量池(非运行时常量池),其在编译阶段就已经确定;JVM 规范对 class 文件结构有着严格的规范,必须符合此规范的 class 文件才会被 JVM 认可和装载。
• 运行时常量池 中保存着一些 class 文件中描述的符号引用,同时还会将这些符号引用所翻译出来的直接引用存储在 运行时常量池 中。
• 运行时常量池相对于 class 常量池一大特征就是其具有动态性,Java 规范并不要求常量只能在运行时才产生,也就是说运行时常量池中的内容并不全部来自 class 常量池,class 常量池并非运行时常量池的唯一数据输入口;在运行时可以通过代码生成常量并将其放入运行时常量池中。
• 同方法区一样,当运行时常量池无法申请到新的内存时,将抛出 OutOfMemoryError 异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值