关于常量池的理解

9344187 2013-12-28
请问字节码文件(.class)中的常量池(Constant pool),和运行时常量池(Runtime Constant pool)是什么关系。
每个字节码文件的常量都放置在运行时常量池吗?
如果两个字节码文件都有“abc”这个常量,那么在运行时常量池是否合并成一个?
jvm在执行指令的时候怎样找到运行时常量池中具体的对象呢?
runshine 2013-12-28
1.字节码文件中的常量池会在类被加载后存放到运行时常量池。
2.这个不了解...应该分虚拟机而情况不同吧,现在运行时优化手段那么多,搞不好就被做掉了,我倾向于“不一定”,还是等R大来解答吧
3.参见1就知道是可以的。
4.字节码文件中的常量池中对象都是通过符号引用的,这些引用会在类加载阶段或运行时转化为直接引用。
simpleman7210 2013-12-31
楼主若研究下class文件格式,就知道常量一般是放在常量池中的。至于常量是否合并,我认为有可能,但不合并肯定也是可以的,特别对于简单的虚拟机。若想弄清楚符号引用怎么转为直接引用,我觉得最好去研究一个现成的虚拟机实现,阅读源代码,调试和跟踪。如果你有兴趣,可以看看我用C++写的一个简单虚拟机,放在我的博客上,可以运行简单的Java程序。
RednaxelaFX 2014-01-02
楼主先看看之前一帖,然后细化问题我再看要不要码新的字…
http://hllvm.group.iteye.com/group/topic/26412#post-187861
9344187 2014-01-09
谢谢各位大大的回答。原来各个JVM的运行时常量池的组织方式是不一样的!
特别是R大的帖子,完全切中要害啊!了解了HotSpot VM的组织方式。
simpleman7210大的虚拟机一定拜读!
Global site tag (gtag.js) - Google Analytics