欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > JVM对象创建过程

JVM对象创建过程

2025/1/7 19:41:32 来源:https://blog.csdn.net/GzlAndy/article/details/144857594  浏览:    关键词:JVM对象创建过程

1 类加载检查
  • jvm通过new指令开始创建对象
  • jvm执行new指令时首先通过指令参数从常量池取到需要创建
  • 检查是否加载解析初始化
  • 如果没有执行加载过程
  • new指令对应java语言具体操作
    • new 关键字创建对象
    • 对象克隆
    • 对象序列化
2 分配内存

加载接下来需要jvm对象分配内存有四个问题需要确定

  • 从哪里划分内存
  • 分配多大的内存?
  • 如何划分内存
  • 划分内存并发问题如何解决

从哪里分配内存?

  • 一般直接新生代伊甸分配内存
  • 如果伊甸无法所剩区域存放对象并且满足大对象设置老年内存
  • 如果通过逃逸分析满足栈上分配要求直接在虚拟机栈分配内存

分配多大的内存?

加载完成多少个属性以及每个属性什么类型的数据已经确认,便可以计算对象所需内存

如何划分内存?

  • 划分内存通常有两种方式,指针碰撞和空闲列表
  • 指针碰撞:堆内存绝对规整所有使用内存放在一边空闲内存放在另一边,有一个指针指向分界线分配内存方式仅仅是指向分界线指针移动对象大小相等距离

  • 空闲列表内存不是规整已使用内存空闲内存相互交错那么就需要额外开辟一块内存记录哪些内存可用分配时候列表找出足够大的空间划分对象

如何解决内存分配时的并发问题?

  • CAS采用CAS+失败重试机制保证更新操作原子性来对分配内存空间动作进行同步处理
  • TLABThread Local Allocation Buffer,提前每个线程划分自己私有空间(也是从伊甸区分配),通过参数-XX:+UseTLAB开启(默认开启)-XX:TLABSize指定分配空间大小

3 初始化
  • 内存分配完成后由于分配内存可能使用的;
  • jvm垃圾回收阶段只是标记垃圾对象从而确定哪些内存可以释放使用;
  • 使用需要分配内存空间初始为零
  • 如果使用的TLAB分配空间这一过程可以提前分配TLAB内存
4 设置对象头
  • 初始化jvm需要对象信息进行设置
  • Klass Pointer指针设置
  • Mark Work初始化
5 执行init()方法

执行init()方法执行构造方法编译阶段jvm每一个构造方法生成对应init()方法

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com