java 对象创建

Java虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。

内存是规整的使用“指针碰撞”,内存是散乱的使用“空闲列表”分配对象使用内存。

为减小竞争,每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲TLAB,只有TLAB用完并分配新的TLAB时,才需要同步锁定。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。

对象分配完成后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例,如何才能找到类的元数据信息,对象的哈希码、对象的GC分代年龄等信息。这些信息放在对象头中。

执行完new指令之后会接着执行<init>方法,把对象按照程序员的意愿进行初始化。

2.2对象的内存布局

对象的内存布局可以分为3块区域:对象头,实例数据,对齐填充。

对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间等。对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

Java虚拟机栈上的reference访问堆上的对象有两种方式:句柄和直接指针,如果使用句柄的话,那么java堆中将会划分出一块内存来作为句柄池。

参考《深入java虚拟机》

posted @ 2015-03-29 21:12  青书  阅读(159)  评论(0)    收藏  举报