ruh*_*gry 5 java memory jvm class object
我的同事刚问我一个非常有趣的问题,我不能给他一个答案.
我们假设我们有以下课程:
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public void print() {
System.out.println("xxx");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们正在创建对象:
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");
Run Code Online (Sandbox Code Playgroud)
问题是:
我们是否保留每个单个对象中可用方法的信息?如果我们创建一个新对象p9,JVM是否会创建仅包含字段信息的对象,还是会向该对象添加有关方法的信息?
另一个问题:
如果我调用会发生什么p1.print()?是否p1必须要求Person类提供此方法,还是已经保存在p1对象中?
对于所有实例,方法的代码不会重复,这是完全没有必要的.代码位于内存中的特殊区域,并由所有实例共享.另一方面,实例变量所需的内存自然归每个实例所有.
至于如何调用方法,对象实际上并不需要在每次调用方法时都要求类,它有一个指向方法代码的指针,并且可以立即调用它.
有关JVM内部工作方式的更多信息,请参阅此处:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html