Java对象创建过程
2015-10-11 01:04
417 查看
Java中new()创建对象的时候有以下过程:
1. Java中,用new()创建一个对象的时候,Java虚拟机首先去检查new指令的参数是否能够在方法区的常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有,则必须执行相应的类加载过程。
2. 类加载过程为:Java解释器查找类路径,以定位.class文件。然后载入.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3. 在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。为新生对象分配内存即为在Java堆中划分出一块确定大小的内存。
4. 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值。如果使用TLAB(Thread Local Allocation Buffer, 本地线程分配缓冲),这一工作过程也可以提前到TLAB分配时进行。初始化为零值保证了对象的实例字段在Java代码中可以不赋初始值就可以直接使用,程序访问到这些字段的数据类型所对应的零值,引用被设置为null,基本数据类型被设置为0。
5. 接下来,虚拟机对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息,这些信息保存在对象的对象头中。
6. 执行所有出现在字段定义处的初始化操作。
7. 执行构造器。
1. Java中,用new()创建一个对象的时候,Java虚拟机首先去检查new指令的参数是否能够在方法区的常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有,则必须执行相应的类加载过程。
2. 类加载过程为:Java解释器查找类路径,以定位.class文件。然后载入.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3. 在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。为新生对象分配内存即为在Java堆中划分出一块确定大小的内存。
4. 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值。如果使用TLAB(Thread Local Allocation Buffer, 本地线程分配缓冲),这一工作过程也可以提前到TLAB分配时进行。初始化为零值保证了对象的实例字段在Java代码中可以不赋初始值就可以直接使用,程序访问到这些字段的数据类型所对应的零值,引用被设置为null,基本数据类型被设置为0。
5. 接下来,虚拟机对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息,这些信息保存在对象的对象头中。
6. 执行所有出现在字段定义处的初始化操作。
7. 执行构造器。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树