【发布时间】:2014-06-01 00:41:07
【问题描述】:
如果我在 Jasmin 程序集中创建一个新项目然后存储它,我会使用 aload 指令执行此操作,因为它是一个地址:
new Object
dup
invokespecial.....
astore_3 ; load the object reference into local variable 3
现在,如果我想从常量池中保存一个字符串...我会用 ldc 创建它,然后也用 aload 保存它:
ldc "Great string"
astore_3 ; save the reference to the actual string in the constant pool
现在...这些地址的格式和字节数是否相同?由于我使用相同的指令来加载和存储这些项目,JVM 必须能够区分属于常量池的地址和堆中的地址吗?
在检查字节码时,在我的例子中,常量池中的实际地址似乎只是一个 1 字节的索引(我猜对常量池的主要引用也保存在某个地方)......现在我知道了那是对常量池中 som UTF8 数据的引用,但是实际字符串所在的位置还是只是对其他地方的字节数组的引用?检查堆中“新对象”的地址我一直做不到......基本上,我需要弄清楚这两个内存区域如何使用相同形式的指令以及JVM如何管理判断地址是常量池中的偏移量还是堆中的对象?
【问题讨论】:
-
我相信您的意思是
astore,而不是aload。astore写入对变量的引用,aload将变量的引用加载到操作数堆栈。 -
是的,这是真的……我的鲁莽……谢谢! :)