JVM 内存模型之常量池区别

打扫房间ask拉法基案例
1.程序计数器:负责存储当前虚拟机执行的字节码指令地址,如果是本地方法(native),地址则为空(undefined)。
2.虚拟机栈:由一个个的栈帧组成,一个栈帧对应着一个方法,其中一个栈桢中有操作数栈、局部变量表、动态链接和方法出入口信息。
在这里,会出现两种异常;
第一种:stackOverFlowError(栈):当请求的栈的深度大于虚拟机栈的最大深度时,则抛出异常。
第二种:outOfMemoryError(内存溢出异常):当请求的栈内存不能再次获取,并且也不能再次扩展。则抛出异常。
3.本地方法栈:与虚拟机栈类似,但是对应的是本地方法(native)。
4.堆:堆是Java虚拟机所管理的最大的一部分内存,几乎所有的对象实例都在这里分配内存。堆是垃圾回收器主要管理的区域。
其中,详细的分,可以对堆分为新生代和老年代。在细致一点有Eden空间、fromSurvicor空间、toSurvivor空间等。这么细致的分是为了更好的进行垃圾回收(分代算法),更快的释放内存。堆可以物理上不连续,但是逻辑上连续,当堆中没有内存能够完成的内存分配并且堆已经不能在扩展时,就会抛出OutOfMemoryError异常。
5.方法区:用于存储已被虚拟机加载的类信息、常量、静态变量,在该区域执行的回收一般是类的卸载和常量池的垃圾回收,当方法区无法满足内存分配的需求时,将会抛出OutOfMemoryError异常。

问题一:什么是常量池?
在Class文件,有一类信息叫做常量池,用于存放编译期生成的字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
- 什么是字面量?
如文本字符串,声明为final的常量值等
- 什么是符号引用?
1.类和接口的全限定名
2.字段名称和描述符
3.方法名称和描述符
问题二:什么是运行时常量池?
运行时常量池存放的是Class文件中常量池中类加载后的数据(所以运行时常量池也是存放在方法区中)。运行时常量池相对于常量池来说,具有动态性,可以在程序运行时动态添加信息。这种特性被开发人员利用比较多的就是String类的intern()方法。
问题三:什么是字符串常量池
字符串常量池会用来存放字符串,也就是说常量池中的文本字符串会在类加载时进入字符串常量池。
那字符串常量池和运行时常量池是什么关系呢?上面我们说常量池中的字面量会在类加载后进入运行时常量池,其中字面量中有包括文本字符串,显然从这段文字我们可以知道字符串常量池存在于运行时常量池中。也就存在于方法区中。不过在周志明那本深入java虚拟机中有说到,到了JDK1.7时,字符串常量池就被移出了方法区,转移到了堆里了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值