Java虚拟机相关知识(2)—对象的创建

对象的创建

当要new一个对象时,主要执行的步骤有以下几条;

  • 定位new后面的参数在常量池定位中是否能够找到该类的符号引用。若找不到,就进行相应的类加载过程。
  • 对要new的对象在堆中分配一定的空间。

在类加载过程中,对象的大小已经确定。

指针碰撞:假设堆中空间是连续的,未分配和已分配的中间用一个指针分隔表示。则将指针向未分配部分移动,则可为其划分空间空闲列表:堆中空间不是连续的,则维护一个空闲列表,记录哪些内存块可用。分配时找一个比较大的空间分配,然后更新列表。

采用哪种方式,主要看垃圾收集器是否实现了压缩功能。

为对象在堆中分配空间的方法主要有两种,指针碰撞和空闲列表法。

  • 考虑对象在虚拟机中是否安全
有可能造成线程不安全。一种是采用CAS+失败重试方法保证更新的原子性,另一种是将堆分成不同的空间上,每个线程在堆上预先分配一小块内存,称为本地线程缓冲(TLAB)。是否开启TLAB由-XX:+/-UseTLAB设定
  • 将分配到的内存空间初始化为零值
保证类中变量可以不赋初值直接使用
  • 对对象进行必要的设置,存放在对象的对象头
如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代信息等。
  • 执行<init>方法,如构造方法和代码块。
将对象初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值