实际开发中我们创建一个对象一般是通过New关键字来创建的~那么在虚拟机中是如何创建对象的呢?当遇到一条new指令后,会检查这个指令的参数在常量池中是否对应一个类的符号引用,并检查这个引用是否被虚拟机加载,解析和初始化过,若没有,先执行这个类的类加载过程。
在类加载完成后,将为这个对象进行初始化工作,就是在堆中为此类开辟一块内存空间,如何开辟呢?
指针碰撞:如果堆是整齐划分的,用过的放在一边,空闲的放在一边,那么中间有个指针作为分界的指示器,分配内存及时把指针忘空闲空间挪出对象需要的空间即可
空闲列表:内存空间是不规整的,会把空闲块记录在一个列表上,在列表上找到空间大于等于对象所需的空间,并标记那块空间被占用。
在多线程情况下,无法保证操作的原子性,有可能出现正在给A对象分配空间,指正还没修改,B对象又使用原来的指针来分配空间。要解决这个问题,可以通过(1):采用CAS和失败重试方式保证更新操作的原子性,(2):给每个线程单独在堆中分配一块独立的空间TLAB
JAVA虚拟机之创建对象
最新推荐文章于 2024-06-05 21:00:00 发布