网站首页 > java教程 正文
Java对象创建的过程
Java中对象的创建就是在堆上分配内存空间的过程,此处说的对象创建仅限于new关键字创建的普通Java对象,不包括数组对象的创建
对象的创建大概分为以下几步:
1:检查类是否已经被加载;
2:为对象分配内存空间;
3:为分配的内存空间初始化零值(为对象字段设置零值);
4:对对象进行其他设置(设置对象头);
5:执行构造方法。
流程:
1.当虚拟机执行到new 关键字时,首先会去运行时常量池中查找该引用所指向的类有没有被虚拟机加载,如果没有被加载,那么会进行类的加载过程,如果已经被加载,那么进行下一步。
2.当类元信息被加载之后,我们就可以从常量池找到对应的类元信息,通过类元信息来确定类型和后面需要申请的内存大小。
3.对象的内存分配完成后,还需要将对象的内存空间都初始化为零值,这样能保证对象即使没有赋初值,也可以直接使用。(分配完内存后,需要对对象的字段进行零值初始化,对象头除外,零值初始化意思就是对对象的字段赋0值,或者null值,这也就解释了为什么这些字段在不需要进程初始化时候就能直接使用)
4.分配完内存空间,初始化零值之后,虚拟机还需要对对象进行其他必要的设置,设置的地方都在对象头中,包括这个对象所属的类,类的元数据信息,对象的hashcode,GC分代年龄等信息
5.然后执行对象内部生成的init方法,初始化成员变量值,同时执行搜集到的{}代码块逻辑,最后执行对象构造方法。执行对象的构造方法,这里做的操作才是程序员真正想做的操作,例如初始化其他对象啊等等操作,至此,对象创建成功。
以下引用自:
链接:
https://zhuanlan.zhihu.com/p/142614439
对象在内存的布局:
对象创建完成后在内存中保存了保存的信息包括对象头、实例数据及对齐填充三类信息。
对象头:对象头里主要包括几类信息,分别是锁状态标志、持有锁的线程ID、,GC分代年龄、对象HashCode,类元信息地址、数组长度,这里并没有对对象头里的每个信息都列出而是进行大致的分类,下面是对其中几类信息进行说明。
锁状态标志:对象的加锁状态分为无锁、偏向锁、轻量级锁、重量级锁几种标记。
持有锁的线程: 持有当前对象锁定的线程ID。
GC分代年龄: 对象每经过一次GC还存活下来了,GC年龄就加1。
类元信息地址: 可通过对象找到类元信息,用于定位对象类型。
数组长度: 当对象是数组类型的时候会记录数组的长度。
实例数据
对象实例数据才是对象的自身真正的数据,主要包括自身的成员变量信息,同时还包括实现的接口、父类的成员变量信息。
对齐填充
根据JVM规范对象申请的内存地址必须是8的倍数,换句话说对象在申请内存大小时候8字节的倍数,如果对象自身的信息大小没有达到申请的内存大小,那么这部分是对剩余部分进行填充。
JVM对象内存分配过程
java中创建一个对象时,对象到底是在哪里创建的?什么时候在堆上创建,什么时候在栈上创建?
这些问题,可以参考如下流程图。
原文章地址:
https://zhuanlan.zhihu.com/p/143743569
https://www.jianshu.com/p/bf5d20d8be19
猜你喜欢
- 2025-07-09 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- 2025-07-09 JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 2025-07-09 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- 2025-07-09 JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 2025-07-09 三石说:java基础 类与对象(java第十一章类和对象)
- 2025-07-09 每天一篇Java面试之框架热门面试答案汇总
- 2025-07-09 普通java对象的实例化过程(java实例化对象new)
- 2025-07-09 详解JVM中的Java对象(jvm的xmn)
- 2025-07-09 JOL:Java 对象内存布局(java对象内存空间分配安排)
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)