在JavaVM中,对象引用是如何处理的

在JavaVM中,对象引用是如何处理的,java,object,jvm,vm-implementation,Java,Object,Jvm,Vm Implementation,在Java应用程序的执行过程中,对象引用是由运行时使用还是在编译时剥离 我想我可以反编译类文件,看看它们如何被用作局部变量和成员变量 在不需要创建对象引用的情况下创建对象引用是浪费还是编译器会删除不需要的引用 例如 最终字符串abc=“abc”; 方法(abc) 与之相反: 方法(“abc”) 方法存储在对象数据区域中(如类定义所示),但块本地引用存储在JVM堆栈框架的特殊区域中。当帧从执行线程的帧堆栈中弹出时,所有块本地引用都将丢失,因为它们实际上没有存储在对象的数据结构中 请注意,如果您不熟

在Java应用程序的执行过程中,对象引用是由运行时使用还是在编译时剥离

我想我可以反编译类文件,看看它们如何被用作局部变量和成员变量

在不需要创建对象引用的情况下创建对象引用是浪费还是编译器会删除不需要的引用

例如

最终字符串abc=“abc”; 方法(abc)

与之相反:


方法(“abc”)

方法存储在对象数据区域中(如类定义所示),但块本地引用存储在JVM堆栈框架的特殊区域中。当帧从执行线程的帧堆栈中弹出时,所有块本地引用都将丢失,因为它们实际上没有存储在对象的数据结构中

请注意,如果您不熟悉JVM堆栈帧,则会为每个方法的条目获取一个新的堆栈帧,并在从方法返回时从线程堆栈中弹出。堆栈框架包含许多元素,包括指向当前指令(位于类的指令页中)的指针、“this”对象的指针,以及用于保存当前方法计算中的中间对象的小堆栈。有时变量引用不需要任何存储,许多优化编译器随后会编译出代码以使用本地堆栈而不是“对象引用存储”,这意味着代码的反转将导致根本没有发现用户使用了变量


“this”指针始终占据对象引用存储区域的第一个条目,并且所有这些概念都是概念性的。实际实现只需要符合操作标准,而不需要符合特定的内存布局

方法存储在对象数据区域中(如类定义所示),但块本地引用存储在JVM堆栈框架的特殊区域中。当帧从执行线程的帧堆栈中弹出时,所有块本地引用都将丢失,因为它们实际上没有存储在对象的数据结构中

请注意,如果您不熟悉JVM堆栈帧,则会为每个方法的条目获取一个新的堆栈帧,并在从方法返回时从线程堆栈中弹出。堆栈框架包含许多元素,包括指向当前指令(位于类的指令页中)的指针、“this”对象的指针,以及用于保存当前方法计算中的中间对象的小堆栈。有时变量引用不需要任何存储,许多优化编译器随后会编译出代码以使用本地堆栈而不是“对象引用存储”,这意味着代码的反转将导致根本没有发现用户使用了变量


“this”指针始终占据对象引用存储区域的第一个条目,并且所有这些概念都是概念性的。实际实现只需要符合操作标准,而不需要符合特定的内存布局

在字节码级别,像这样的“不必要”引用不会被删除;您可以在字节码中看到上面的赋值。但是JIT(即热点)通常要聪明得多,因此对运行时的影响基本上为零。

在字节码级别,像这样的“不必要的”引用不会被删除;您可以在字节码中看到上面的赋值。但是JIT(即热点)通常要聪明得多,因此对运行时的影响基本上为零。

在您提到的特定情况下,将局部变量命名为“abc”这一事实对您作为程序员来说基本上是一种方便。不管您是否这样做,或者只是将其作为一个未命名的参数,字节码的最终结果基本相同

一般来说,你不需要担心细节的程度。您可以信任字节码编译器和JIT编译器来做明智的事情。如果你不得不担心到这种程度的细节,那么编写任何中等复杂度的应用程序实际上是不可能的


[p.S.如果你有时间和兴趣,我也建议你把反编译相应的类作为一个教育练习。但是你会发现这应该是非常令人放心的:编译器正在做一般明智的事情,没有必要偏执。]

在你提到的特定情况下,将局部变量命名并称之为“abc”这一事实本质上为程序员带来了方便。不管您是否这样做,或者只是将其作为一个未命名的参数,字节码的最终结果基本相同

一般来说,你不需要担心细节的程度。您可以信任字节码编译器和JIT编译器来做明智的事情。如果你不得不担心到这种程度的细节,那么编写任何中等复杂度的应用程序实际上是不可能的

[p.S.如果您有时间和兴趣,我也建议您将相应的类进行反编译,这只是一个教育练习。但您会发现,这应该是非常令人放心的:编译器正在做一般明智的事情,没有必要偏执。]