【Java对象的创建过程】

1.1类加载

虚拟机遇到new指令,首先检查指令的参数能否在元空间的常量池中定位到一个类的符号引用,并且看这个符号引用的类是否已经被加载,解析和初始化。如果没有,则在双亲委派模式下,查找对应的class文件。
【双亲委派模式——Java加载类的机制】
Bootstrap ClassLoader(启动类加载器): 负责将%JAVA_HOME%/lib目录中或-Xbootclasspath中参数指定的路径中的,并且是虚拟机识别的(按名称)类库加载到JVM中
Extension ClassLoader(扩展类加载器): 负责加载%JAVA_HOME%/lib/ext中的所有类库
Application ClassLoader(应用程序加载器): 负责ClassPath中的类库
是什么?
如果一个类加载器收到了类加载请求,并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
好处
1.采用双亲委派模型的好处是Java类随着它的类加载器一起具备了一种带有优先级的层级关系,通过这种层级关系可以避免类的重复加载.当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次
2.其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

1.2分配内存

对象所需内存大小根据加载的类来确定,为对象分配内存也就是在堆内存中分配一块确定大小的内存。

1.3初始化分配到的空间

内存分配结束,虚拟机将分配到的内存空间都初始化为零值,这一步保证了对象的实例字段在java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型对应的零值。

1.4 设置对象头

为对象设置对象头信息。对象头包含两部分信息。第一部分是用于存储对象自身的运行时数据,如hashcode、GC分代年龄、锁状态标志、线程持有的锁等;第二部分是类型指针,指向它对应的类元数据,VM用这个确定其属于哪个类的实例。

1.5 执行init方法

在java程序的视角看来,初始化才正式开始,初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

posted @   tootooquan  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示