虚拟机在java堆中对象分配、布局和访问的过程 1、对象创建 从java程序开始,new指令开始类加载 类加载通过后,进行内存分配
如果java堆中的内存是绝对规则的,将所有已用内存和空闲内存分成两部分,中间放置一个指针作为分界点的指示符,那么分配的内存
如果java堆中的内存不规则,已用内存和空间内存是交错的,所以虚拟机必须维护一个列表来记录哪些内存块可用,
分配方式的选择取决于:java堆是否规则; Java堆是否规则取决于:所使用的垃圾收集器是否具有压缩和排序的功能。
例子
对象创建的线程安全问题
事实上,虚拟机采用带有失败重试的CAS来保证更新操作的原子性;
内存分配的动作按照线程划分到不同的空间,即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲区(Tlab)。
对象内存分配完成后,虚拟机初始化内存空间来修改对象。 从虚拟机的角度来看,一个新的对象已经生成了。 从java程序的角度来看,对象创建刚刚开始,init方法还没有执行,所有字段都为零。2. 对象的内存布局 对象在内存中的布局和分配分为三部分: 1. 对象头 2. 实例数据 3. 对齐和填充 3. 访问有2种访问方式
指针访问
句柄指针的优缺点 Sun 使用第二种方法
参考:java虚拟机第二版