这两种newInstance方法就是大家所说的反射。事实上Class的newInstance方法内部调用Constructor的newInstance方法。4. Clone方法无论何时我们调用一个对象的clone方法,JVM都会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。
在32位的HotSpot虚拟机中对象未被锁定的状态下,Mark Word的32个Bit空间中的25Bit用于存储对象哈希码(HashCode),4Bit用于存储对象分代年龄,2Bits用于存储锁标志位,1Bit固定为0。在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示:
long/double -> int/float -> short/char -> byte/boolean -> reference如果设置了-XX:FieldsAllocationStyle=0(默认是1),那么引用类型数据就会优先分配存储空间:
reference -> long/double -> int/float -> short/char -> byte/boolean结论:
分配策略总是按照字节大小由大到小的顺序排列,相同字节大小的放在一起。对齐填充HotSpot虚拟机要求每个对象的起始地址必须是8字节的整数倍,也就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(32位为1倍,64位为2倍),因此,当对象实例数据部分没有对齐的时候,就需要通过对齐填充来补全。
指针: 指向对象,代表一个对象在内存中的起始地址。句柄: 可以理解为指向指针的指针,维护着对象的指针。句柄不直接指向对象,而是指向对象的指针(句柄不发生变化,指向固定内存地址),再由对象的指针指向对象的真实内存地址。1. 句柄Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息,具体构造如下图所示:



| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |