Cat cat = new Cat();
cat.height = 100;
cat.name = "Tom";
我上面有这些代码。我知道我的问题听起来很愚蠢,但JVM如何查找变量“height”和“name”的地址来存储值?
总是有一个表映射所有类字段的变量名和地址,在JVM的“方法区”上,它只是在那里搜索。这个解释是否正确?
通常,我甚至不了解计算机如何通过查看代码中的变量名来识别我所说的内存地址。
有人能帮我理解吗?提前谢谢。
答案 0 :(得分:1)
程序运行时,除了调试目的外,没有变量名。 程序运行的详细信息取决于JVM设计但是对于OpenJDK / OracleJVM,将字节代码编译为本机代码,在这种情况下,它是真正运行代码的机器代码。变量" name"在对象中分配一个偏移,例如从头到尾+16。
JVM如何查找变量的地址" height"和"名称"存储值?
对象+ 16的内存被读取(或写入)为地址或压缩的哎呀。例如假设你有一个32位的JVM来保持简单,在对象启动后有16字节的4字节值,这是用作String的Object的地址。
Cat cat = new Cat();
这通过在堆上分配足够的内存来创建新对象。假设它长24个字节。首先,数据满零(除了将类型记录为指针的标题之外)
调用类的构造函数来初始化刚刚分配的内存。
cat.height = 100;
假设高度从对象的开头指定偏移量+12。在这种情况下,作为数字的cat
的地址被添加到12,并且该位置的存储器被赋值为100作为4字节存储。
cat.name = "Tom";
假设名称从对象的开头分配了偏移+16(我们使用的是32位引用)在这种情况下,cat
的地址是一个数字加到16,并且内存在这个位置分配了一个指向String" Tom"作为一个4字节的商店。
总是有一个表映射所有类字段的变量名称和地址,在"方法区域" JVM,它只是在那里搜索。这个解释是否正确?
每次查表都非常昂贵。而是将每个字段的偏移量写入机器代码(一旦编译完成),并且为大多数CPU添加偏移量不会占用额外的时间。
一般来说,我甚至不了解计算机如何通过查看代码中的变量名来识别我所说的内存地址。
该名称将变为一个数字,该数字是该字段与对象开头的偏移量。