11|对象创建 :JVM中的对象是怎么生产出来的?
康杨
你好,我是康杨。
上节课我们聊了 Java 对象在 JVM 中是以怎样的形式存在的,这节课让我们来继续探讨,一个 Java 对象在 JVM 中是如何被生产出来的。通过这节课的内容你可以看到 JVM 在演进过程中是如何优化对象创建的,掌握这节课的内容,对你写出高性能的 Java 程序大有裨益。
对象创建的标准流水线
如果我们把 JVM 比作是创建对象的工厂,那么首先让我们来参观下 JVM 工厂中日常创建对象的标准流水线。之所以称之为标准,是因为这并不是 JVM 内部创建对象的唯一一条流水线,另一条流水线我会在后面为你介绍。现在让我们先把目光聚焦在这条标准的流水线上。
我们可以把上面这行代码看作是流水线收到的一笔订单。当 JVM 收到这笔订单时,它知道客户需要定制一个 Book 对象,这时候流水线开始启动。
类加载
流水线上的第一个节点就是类加载节点。如果以盖房举例,待生产的对象比作待修建的房子,而类正是盖房子需要用到的图纸。不管我们要盖的是别墅还是塔楼,首先我们需要拿到盖房用的图纸,所以第一步要做的就是准备好图纸。
类似的,当 JVM 读到 new 指令,知道需要创建一个对象的时候,它首先需要明确这个对象的图纸也就是对相应的类,是否已经准备好,或者说类是否已经加载好。当它发现这个类还没加载好,或者这个类还没有经历完完整的加载、链接、初始化流程。那么它会先启动完整的类加载流程,或者继续执行之前未完成的类加载步骤。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
JVM对象创建是Java程序性能优化的关键环节。本文深入解析了JVM中对象创建的内部流程,从JVM工厂中对象创建的标准流水线到JDK 1.8中启动的快捷流水线,详细介绍了类加载、空间分配等流程。文章强调了内存回收方式和线程对对象创建内存分配的影响,以及在设计对象创建和回收方式时需要综合考虑多个因素。另外,文章还介绍了TLAB(Thread Local Allocation Buffer)的机制,以及JVM在JDK 1.8中启动的另一条对象创建快捷流水线,通过对象逃逸分析和标量替换来优化对象创建过程。总的来说,本文为读者提供了重要的Java程序性能优化参考,让读者了解了JVM的GC机制是如何影响到Java对象的创建的,同时了解到如何通过代码优化,引导JVM采用第二条流水线进行Java对象的创建,从而避免了对象的内存分配、垃圾回收和同步竞争。文章还指出了快捷流水线适合生命周期短且不会跨线程访问的小对象,而对于生命周期长,需要跨线程访问等的对象,我们依然需要依赖标准流水线。通过这节课的学习,读者可以了解JVM对象创建的基本原理,并思考如何在实际编程中更高效地创建对象。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- edward请教老师,jvm开启了逃逸分析的情况下,逃逸分析是什么条件下触发的?
作者回复: 逃逸分析通常是在编译阶段进行的,特别是在即时编译阶段,也就是JVM的JIT编译阶段。在编译期通过判断对象的动态作用域从而决定是否对其进行内存的分配策略优化
2023-09-13归属地:湖南31 - peter请教老师两个问题: Q1:既然内存是规整的,为什么还需要“碰撞”吗? “指针碰撞”具体指什么? Q2:两种方法是同时存在吗?还是只选择一种?
作者回复: 这种情况在内存管理中是很常见的,因为并发的内存请求在不同线程之间是无法协调的。一般只会选择一种
2023-09-13归属地:北京 - 浩仔是程序员指针碰撞这个词感觉不是很好理解,看图示其实就是指针移动2023-09-27归属地:广东
收起评论