代码都在代码段, 每个对象实例里面只有数据,没有代码,这个跟 C++ 一样的。回刚才那个说 java 的方法都是放在栈内存里的, Java 虚拟机的实力里面内存分 代码段和数据段,数据段分堆和栈, 对象实例都在堆里面,对象实例里面只有对象的数据,也就是 field, 每个线程有自己的栈,栈里放的是局部变量,可以是 primitive 也可以是 reference代码段里面放的是方法,常量之类的,对象方法调用的时候第一个参数是对象的 index,类似 C++ 的 this 指针,但是 Java 只用 index 不用指针,因为内存的垃圾回收,对象中内存里的位置会变。静态方法不用传对象的 index,Java 里面所有的方法调用和数据调用是用字符串查找的,这点与直接使用内存地址找函数入口的 C++ 不一样。你可以理解为所有的Java class 都是 DLL。Java 的 class 文件里面有一个 constant pool (记不太清楚了), 用来放这些字符串常量。这也是导致 Java 速度慢的一个很大的原因。喜欢这方面的东西的话,就去下 Java 的 vm spec 来看。
其实一个类的非静态方法 也相当于一个静态方法一样 跟Class对象捆绑在一起的 只不过它的方法会有所变化 如 class A{ String name=""; public void setString(String name){ this.name=name; } } 其实它应该是这样的 public void setString(A target,String name){ target.name=name; }
比如sun jvm中的对象布局如下:
对象头(保存hash,锁,垃圾回收标记等信息)
指向类信息的指针(找到该对象对应类的Class)
【如果是数组对象,保存长度】
后面是实际的数据成员
每个对象实例里面只有数据,没有代码,这个跟 C++ 一样的。回刚才那个说 java 的方法都是放在栈内存里的,
Java 虚拟机的实力里面内存分 代码段和数据段,数据段分堆和栈,
对象实例都在堆里面,对象实例里面只有对象的数据,也就是 field,
每个线程有自己的栈,栈里放的是局部变量,可以是 primitive 也可以是 reference代码段里面放的是方法,常量之类的,对象方法调用的时候第一个参数是对象的 index,类似 C++ 的 this 指针,但是 Java 只用 index 不用指针,因为内存的垃圾回收,对象中内存里的位置会变。静态方法不用传对象的 index,Java 里面所有的方法调用和数据调用是用字符串查找的,这点与直接使用内存地址找函数入口的 C++ 不一样。你可以理解为所有的Java class 都是 DLL。Java 的 class 文件里面有一个 constant pool (记不太清楚了), 用来放这些字符串常量。这也是导致 Java 速度慢的一个很大的原因。喜欢这方面的东西的话,就去下 Java 的 vm spec 来看。
也相当于一个静态方法一样
跟Class对象捆绑在一起的
只不过它的方法会有所变化
如
class A{
String name="";
public void setString(String name){
this.name=name;
}
}
其实它应该是这样的
public void setString(A target,String name){
target.name=name;
}