关于java中方法区和常量池

方法区

方法区位置

在jdk1.8以前,方法区的位置在堆内存中的一部分叫做永久代,1.8后将堆中方法区移除改用本地内存中的元空间

jdk1.6

方法区在堆中,内部结构有运行时常量池,类信息,类加载信息

image-20220907200600585
jdk1.8之后

此时方法区已经不占用jvm内存而是直接占用本地内存,此时运行时常量池的位置移动到了

image-20220907200803536
元空间溢出

由于元空间是存放在本地内存中大小几乎可以看做是物理内存的大小,所以想要看到元空间溢出需要通过idea在编译设置设置元空间大小

 -XX:MaxMetaspaceSize=8m

image-20220907202343633

在vm区域粘贴

image-20220907202518938

如果元空间内存溢出的话报错为:

image-20220907202707459

永久代溢出

设置永久代大小

 -XX:MaxPermSize=8m

jdk1.6中永久代溢出报错为:

image-20220907203253835

查看常量池

.java文件通过第一次编译为字节码文件后,其中包含了类基本信息,常量池,类方法自定义,虚拟机指令

进入到class文件目录下并通过javap -v查看字节码反编译后的语句

image-20220907212244096

可以看到字节码中有关于main方法里面的执行指令和关于引用的常量池中指令的地址

image-20220907212652692

我们找到#2对应的常量池地址,发现其类型为Fieldref,说明其引用了其他的变量,后面的地址说明引用了#21,#22的地址(在常量池中应该是直接拼接出结果)

image-20220907212757776

在#21,#22又引用了#28,#29,#30的地址,类型为UTF8说明已经是最底层不需要再向下调用

image-20220907213033778
运行时常量池

常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值