JAVA对象的生命周期(二)-对象的创建

对象创建的几种方式

  • new
  • clone
  • newInstance
  • 反序列化
  • String s = "abc"(这个是比较特殊的)

背景:接下来看下JAVA对象创建的整个过程,要理解每一步的意义,平时对基础知识还是要查缺补漏呀。先来看下整过过程的步骤。

创建对象

类加载检查。

  • 常量池定位new指令参数的符号引用
  • 检查这个符号引用是否被类加载,解析和初始化过,如果没有先进行类加载过程

内存分配

  • 类加载过后对象所需的内存大小就能确定
  • 分配方式分为以下两种,基本原则是依据垃圾收集器是否压缩整理功能决定。
    • 指针碰撞,规整的内存区域沿一个方向移动指针分配即可
    • 空闲列表:JVM中记录一个已使用的列表,分配后再更新列表。
  • 内存分配的并发问题的两种方案
    • CAS+失败重试,CAS是一种乐观锁,每次不加锁而假设没有冲突的去完成某项操作,如果冲突则重试,直至成功,来保证原子性,缺点就是会出现频繁重试以至于浪费内存
    • TLAB:为每个线程先分配一段内存,JVM再给线程中的对象分配内存是现在TLAB中分配,当对象需要的内存大于TLAB时,再采用上述的CAS机制分配对象内存

初始化零值

  • 内存分配完成后,虚拟机需要将分配的内存空间都初始化零值(不包括对象头)

设置对象头

  • 初始化零值之后,虚拟机要对对象进行必要的设置,例如设置这个对象是哪个类的实例,如何找到类的元数据信息,对象的hash码,对象的GC分代年龄等,这些信息都是存放在对象头中。

执行init方法

  • 上面工作做完后,在虚拟机角度这个对象实例已经创建完成,但是从java程序看来对象的生命周期才刚刚开始。
  • 执行INIT方法来按照程序员的意愿来初始化对象中变量的初值

至此一个对象实例已经创建完成

posted @ 2020-04-29 10:46  好奇成传奇  阅读(421)  评论(0编辑  收藏  举报