不同的虚拟机中对象的具体分布是不同的,目前Hotspot虚拟机使用的较为广泛,以该虚拟机为例,撰写一下Java堆中对象分配、布局和访问的全过程
Java对象的创建
首先需要提的是,Java的对象创建只能通过new指令
Java作为一种“安全”的语言,检查是家常便饭,new操作就存在了检查
new指令的过程:
类加载检查
- 检查该指令的参数能否在常量池中定位到
- 检查该类是否已经被加载
- 若为加载,则执行相应的类加载过程
虚拟机为新生对象分配内存
在这里开始描述前,有必要提前说明:对象在内存中占用的空间的确定的
逻辑很简单,从堆中分配内存。
但是因为Java垃圾回收、高并发的原因,存在以下几个问题:
划分内存的方法
-
堆中内存是规整的,“指针碰撞”
使用过的内存放一边,未使用过的放在另一侧,中间使用一个指针作为分界点指示。
这种情况只需要移动指针即可,称为“指针碰撞”
-
堆中内存不规整,“空闲列表”
使用过的内存与空闲内存相互交错,虚拟机需要维护一个记录表,记录可用的内存块,分配时寻找合适的内存块进行分配,称为“空闲列表”
分配空间时,由于多线程操作导致的问题
假设有三个线程ÿ