【问题标题】:How are instance methods stored [duplicate]实例方法如何存储[重复]
【发布时间】:2011-12-04 17:02:50
【问题描述】:

可能重复:
Java/C# method representation in memory

我想知道我是否在 java 中有一个对象,它的实例方法是如何存储的?对象是否有指向其实例方法的指针?

例子:

public class MyObject {
 private int x;
 private int y;
 [..]
}

如果我计划在内存中保留很多(例如一大棵对象树)MyObjects,如果除了 x 和 y 的 getter 之外我定义了一个实例方法,它是否会在内存方面产生显着差异计算总和?

我正在尝试解决我应该添加更多实例方法还是使用 getter 和 setter 在另一个类中进行计算。

【问题讨论】:

    标签: java memory


    【解决方案1】:

    对象的实例方法存储在它的类对象中(应该只存在一个副本),它们不会与每个新实例一起“复制”,相反,每个实例都包含对驻留在其中的方法实现的引用类对象。

    有关技术说明,请查看“Java 虚拟机内部”一书中的this chapter,特别是“对象表示”部分;它详细说明了对象的每个实例如何引用其在相应类中的方法。请注意,JVM 规范中 提供了实现细节,它们对实现者开放 - 链接的文档提供了几种策略。

    【讨论】:

      【解决方案2】:

      对象的属性需要内存(注意:对于对象,存储的属性是指向真实对象的指针,它位于内存中的其他位置)。方法(代码)不需要额外的内存,因为它们与类一起存储。

      IE:

      public class MyClass1 {
        private int myNumber;
      }
      

      public class MyClass2 {
        private int myNumber;
        public int MyMethod1() {
        }
        public int MyMethod2() {
        }
        public int MyMethod3() {
        }
        ....
        public int MyMethod1000() {
        }
      }
      

      每个实例使用相同的内存。

      【讨论】:

      • “相同的内存”是指“不仅相同的内存大小,而且实际上相同的内存地址”吗??
      • @SarathChandra 相同的内存大小。如果它是相同的内存地址,则所有实例都将读取/写入相同的 myNumber 变量。
      • 对不起,我(弄糊涂了)。我的意思是“类的所有方法和该类的所有实例的方法都将引用相同的内存位置,因为每个实例没有方法的'副本'”。是这样吗?
      • 对。 X 类的方法是 Class<X> 实例的一部分,其字节码是方法 docs.oracle.com/javase/specs/jvms/se8/html/… 定义的一部分
      【解决方案3】:

      它们存储在类中。详情在JVM specification

      【讨论】:

        【解决方案4】:

        不,这不会产生重大影响。该方法实际上存储在类定义文件MyObject.class中。该方法只有一个实例。它为每个实例执行,但只定义一次。

        【讨论】:

          【解决方案5】:

          每个实例都与一个类相关联。

          类定义所有实例的方法。

          因此,不需要为每个实例提供指向方法的指针。

          一个实例只存储非静态属性的值

          如果你想知道一个实例的类,你只需使用 instance.getClass()。

          通过使用 getClass(),您可以在运行时访问所有方法的列表。

          【讨论】:

            猜你喜欢
            • 2017-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-24
            • 1970-01-01
            • 1970-01-01
            • 2018-05-31
            • 1970-01-01
            相关资源
            最近更新 更多