java常量池的疑惑

1.Java类文件编译以后,会有class常量池
2.类加载运行过程中, class常量池会加载到运行时常量池中

那么这个运行时常量池是每个类都有一个,还是所有类共享一个呢?
在JAVA8中,这个运行时常量池到底是在堆区中,还是在元空间里面?
运行时常量池和全局字符串常量池是什么关系,全局字符串常量池又放在哪呢?

阅读 3.8k
3 个回答
  • 运行时常量池是全局共享的,class常量池是class文件编译时确定的;
  • 虚拟机加载Class之后会把class常量池中的数据放入到运行时常量池。
  • String常量池位置:

    • jdk1.6: 永久代(方法区)
    • jdk1.7: 堆内存
    • jdk1.8: 元空间

建议你看下《Java8虚拟机规范》,这本书中有你要的答案。网上有电子版书籍

运行时常量池存放各种字面量和符号引用(随着运行会把用到的符号引用变为直接引用),每个类都有一个,不是共享的
字符串常量池是一个StringTable(可以理解为weak HashMap),存放的是String的引用,是全局共享的
这两个池根本就不是一个东西!!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题