Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM如何将变量名映射到其内存地址?_Java_Memory_Jvm - Fatal编程技术网

Java JVM如何将变量名映射到其内存地址?

Java JVM如何将变量名映射到其内存地址?,java,memory,jvm,Java,Memory,Jvm,我上面有这些代码。我知道我的问题听起来很傻,但是JVM如何查找变量“height”和“name”的地址来存储值呢 在JVM的“方法区域”上,总是有一个映射所有类字段的变量名和地址的表,它只是在那里搜索。这个解释正确吗 一般来说,我甚至不明白计算机如何通过查看代码上的变量名来识别我所说的内存地址 有人能帮我理解吗?提前感谢。当程序运行时,除了调试外,没有变量名程序如何运行的细节取决于JVM设计但是对于OpenJDK/OracleJVM,它将字节码编译为本机代码,在这种情况下,真正运行代码的是机器代

我上面有这些代码。我知道我的问题听起来很傻,但是JVM如何查找变量“height”和“name”的地址来存储值呢

在JVM的“方法区域”上,总是有一个映射所有类字段的变量名和地址的表,它只是在那里搜索。这个解释正确吗

一般来说,我甚至不明白计算机如何通过查看代码上的变量名来识别我所说的内存地址


有人能帮我理解吗?提前感谢。

当程序运行时,除了调试外,没有变量名程序如何运行的细节取决于JVM设计但是对于OpenJDK/OracleJVM,它将字节码编译为本机代码,在这种情况下,真正运行代码的是机器代码。变量“name”在对象中指定了一个偏移量,例如从起点开始+16

JVM如何查找变量“height”和“name”的地址来存储值

对象+16处的内存作为地址或压缩的Oops进行读取(或写入)。e、 g.假设您有一个32位JVM来保持简单,在对象开始后的16字节处有一个4字节的值,这是用作字符串的对象的地址

Cat cat = new Cat();
cat.height = 100;
cat.name = "Tom"; 
这将通过在堆上分配足够的内存来创建一个新对象。假设它有24字节长。首先,数据中充满了零(例如,除了将类型记录为指针的头)

调用该类的构造函数来初始化刚刚分配的内存

Cat cat = new Cat();
假设高度指定为距对象起点的偏移+12。在这种情况下,
cat
的地址是一个数字,它被添加到12,并且该位置的存储器被分配值100作为4字节存储器

cat.height = 100;
假设name被指定为从对象开始的偏移量+16(我们使用的是32位引用),在这种情况下,
cat
的地址是一个数字,被添加到16,该位置的内存被指定为引用值,该引用值指向一个字符串“Tom”,作为一个4字节的存储

cat.height = 100;
在JVM的“方法区域”上,总是有一个映射所有类字段的变量名和地址的表,它只是在那里搜索。这个解释正确吗

每次查桌子都很贵。相反,每个字段的偏移量被写入机器代码(一旦编译),并且对大多数CPU来说,添加偏移量不需要额外的时间

一般来说,我甚至不明白计算机如何通过查看代码上的变量名来识别我所说的内存地址


名称被转换为一个数字,该数字是字段从对象开始的偏移量。

对不起,StackOverflow不是这样工作的。请参加,访问并阅读,以了解如何有效地使用此网站。你要求接受基础课程的全面教育,包括计算机体系结构、编译器、语言翻译、虚拟机等。StackOverflow不是教程或讨论站点。至于您的问题,当JVM看到代码时,它看起来与您键入的Java完全不同,它已被编译成字节码,所有这些都已以内部一致的方式处理。@user2864740抱歉,甚至还没有结束。这是一个与OP一样广泛的问题。StackOverflow不是一个教程网站。第一:你直接访问类的字段,这是一个糟糕的做法。第二:我们可以找到答案。JDK附带了一个名为
javap
的工具;它是一个类文件反汇编程序,可以向您显示程序使用的字节码。第三:我看到一个包含
Fieldref
(s)的常量池。四:注释。@ElliottFrisch注意字节码没有指定对象在运行时的布局方式。非常感谢!似乎在加载.class文件之后,JVM将所有符号引用解析为直接引用(因为代码是字节码形式的),以逐个执行它。我现在更了解这个机制了。@Bonsaisteak它必须从一开始就以最佳/最终的方式布局对象,因为在JIT优化代码后更改数据结构太昂贵了。