内存分堆内存和栈内存,用new操作符创建的复杂对象属性,和简单类型的属性存放的位置不一样,
String是个比较特殊的类型,看看这里吧
http://xiebh.javaeye.com/blog/132748

解决方案 »

  1.   


    还是不明白为什么要把int放后面?
      

  2.   

    为什么我先声明的age属性在内存布局中保存到了最后,而name和birthday 属性跑到了前面?
    你用什么工具查看的?
      

  3.   

                System.out.println(unsafe.getObject(p, 8L));
        System.out.println(unsafe.getObject(p,12L));
        System.out.println(unsafe.getInt(p,16L));用unsafe直接去取,age成员变量的偏移量是16
      

  4.   

    Java的内存布局没有意义啊,你又不是学C++的。除非你用Java的Unsafe,ASM等工具,才需要简单了解,而且通常你不知道布局,也可以使用它们。
    这种所谓的布局,什么用都没有的。
      

  5.   

    我现在就是要用Unsafe操作内存
      

  6.   

    前8个字节:
    字段和Klass指针
    前者是标记信息,比如锁信息,垃圾回收信息,hashcode等等
    Klass指针,找Class对象的
      

  7.   

    lz的第3个问题,我想可能是和c语言中的结构体字段一样,为了性能的需要而进行的对齐操作
      

  8.   


    当然不是,如果age我使用的是Integer类型,那么age就在最前面了
      

  9.   

    因为int是基本数据类型,比如说int age = 5,在new出来的对象内存区就存了一个int的5;而String,data是引用数据类型,new出来的对象内存区只是存了一个引用。
      

  10.   

      java是面向对象的语言,我想java把所有的都看作对象处理的,那么基本类型在jvm中的优先级没对象的高吧,呵呵!这应该是jvm实现的时候,定义的把,把基本类型存储在后面,恶哈哈!