Hotspot虚拟机在Java堆中对象分配、布局和访问的全过程。
对象的创建(普通Java对象,不包括数组和Class对象)
1、当Java虚拟机遇到一个字节码new时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号的引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,必须先执行相应类加载的过程。
2、加载检查过后,虚拟机为新生对象分配内存(把一块确定大小的内存从堆划中分出来)。
分配内存有两种方式:
注意:创建对象是非常频繁的行为,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的。可能在给对象A分配内存时,指针还没来得及修改,对象B又同时使用了原来的指针处理。解决方案:
3、内存分配完成之后,虚拟机必须将分配的内存空间(不包括对象头)都初始化为零值,如果使用了TLAB,这项工作提前至TLAB分配时顺便进行。
保证了对象的实例字段在Java代码中可以不赋初值就直接使用,使程序能访问到这些字段的数据类型多对应的零值。
对象的内存布局
存储布局分为:
对象的访问定位
创建对象之后为了使用对象,Java程序会通过栈上的reference数据来操作堆上的具体对象。reference是一个指向对象的引用。reference未定义访问到堆中对象的具体位置,所以对象的访问方式是由虚拟机定义的。
访问方式主要是两类:
原文:https://www.cnblogs.com/codercql/p/13436952.html