【问题标题】:Where is information about methods of Java objects kept? [duplicate]Java 对象的方法信息保存在哪里? [复制]
【发布时间】:2014-02-04 14:19:35
【问题描述】:

我的同事刚刚问了我一个非常有趣的问题,我无法给他答案。

假设我们有以下类:

public class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println("xxx");
    }
}

现在,我们正在创建对象:

Person p1 = new Person("a");
Person p2 = new Person("b");
Person p3 = new Person("c");
Person p4 = new Person("d");
Person p5 = new Person("e");
Person p6 = new Person("f");
Person p7 = new Person("g");
Person p8 = new Person("h");

问题是:

我们是否在每个对象中保留有关可用方法的信息?如果我们创建一个新对象p9,JVM 会创建仅包含有关字段的信息的对象,还是会在此对象中添加有关方法的信息?

另一个问题:

如果我调用p1.print() 会发生什么? p1 是否必须要求 Person 类提供此方法,还是已经保存在 p1 对象中?

【问题讨论】:

  • @Vallentin 你会建议他用什么词谷歌?
  • @KevinWorkman 这个问题怎么样?
  • @Vallentin 实际上我觉得这个问题很有趣。请记住,Google 经常会找到 StackOverflow 问题作为答案。这个问题只需要问。但是,在那种情况下,SO 上有类似的问题,但关键是它是 QA 站点。

标签: java class object memory jvm


【解决方案1】:

方法的代码并非针对所有实例都重复,这完全没有必要。代码位于内存中的一个特殊区域,并由所有实例共享。另一方面,实例变量所需的内存自然由每个实例拥有。

至于如何调用方法,对象并不需要每次调用方法时都询问类,它有一个指向方法代码的指针,直接调用即可。

有关 JVM 内部工作原理的更多信息,请参阅此处:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

【讨论】:

  • 那个特殊的内存区域叫做堆对吧? :-)
  • 不是堆。 Method area.
【解决方案2】:

一般来说,无论有多少对象,代码都会被表示一次。对象“拥有”方法的 OO 概念只是一种抽象。因此,从本质上讲,无论您的方法是实例化的还是静态的,在幕后它仍然“属于”类。

对于 final 方法,调用使用静态绑定(已根据表达式的类型预先确定将调用哪个方法)。

对于虚拟方法,会发生一些更有趣的事情。根据实现,对象包含正确方法的地址(同样不是方法本身),或者运行时反映该对象以确定其实际类并在层次结构中找到适当的方法.

【讨论】:

    【解决方案3】:

    我不知道 Oracle JVM 是如何做到的,但是在一般的面向对象编程系统中,一个对象有一个隐藏的实例变量指向它的类。所有的实例都指向同一个类对象,指向实例方法的指针是类的一部分。

    【讨论】:

      【解决方案4】:

      JVM 通过不将对象和方法绑定在一起做了出色的工作。要清楚地了解它的功能,您需要了解它的底层架构。

      JVM 有一个类加载器系统,它由以下资源组成:

      1. 方法区
      2. Java 堆栈
      3. 电脑注册
      4. 本机方法堆栈。

      当我们创建一个对象时,类被加载(延迟加载)并获得所有需要的资源。在方法区域中,所有方法都驻留在堆中,对象驻留在堆中,并且在所有线程之间共享。 JVM 将执行程序所需的所有内存分配/组织到几个运行时内存区域。

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多