class A{
   int i;
   static int j;
   void c(){//Body}
   static void d(){//Body} 
}
如果A a=new A();
1.静态变量是在类加载时才分配内存的,在内存中仅有一份,被所有实例共享,存储在方法区。
2.方法是编译后成为字节码指令,也是存储在方法区中。
3.对象a本身占用的内存空间是从堆中分配的,而堆和方法区是jvm中两个不同的存储空间。
问题1:  那么a对象实际在堆中占用的内存大小仅仅是i变量吗?
    2:  如果是这样那是不是意味着对象a和类A占用的内存大小是不同的?

解决方案 »

  1.   

    jvm规范没有规定用何种结构去表示一个java对象,这完全靠jvm的实现者自己去根据自己的需求去思考首先,你那个对象里“内存大小仅仅是i变量”是很可能不对的(说很可能是因为你可以那么去实现),还会有对象锁数据,有些垃圾收集器还要在对象里添加一些数据以帮助确定是否是垃圾,还可能需要一个标志确定对象的finalize方法是否执行过,另外编译器在编译java程序的时候还可以添加字段等等等等,都是由jvm设计者自己决定的
      

  2.   

    问题1: 那么a对象实际在堆中占用的内存大小仅仅是i变量吗?这个倒不是很确定,具体看下jls或者深入虚拟机之类,但我感觉如果方法是不直接包括在对象内的话,应该差不多了,可能还会包括一些其它较固定额外信息,比如对象名之类  2: 如果是这样那是不是意味着对象a和类A占用的内存大小是不同的?
    应该是不同的,因为明显是两个概念,类是模板,对象是实体
      

  3.   

    1: 那么a对象实际在堆中占用的内存大小仅仅是i变量吗?
        不止,至少有一个父类 Object 实例的引用2: 如果是这样那是不是意味着对象a和类A占用的内存大小是不同的
        对,不相同