Java对象创建的过程and类加载的过程

Java对象创建的过程and类加载的过程,第1张

Java对象创建的过程and类加载的过程

学会本篇,还怕没对象吗?

对象创建的流程 1、检查

类加载检查,主要是此对象是否被加载过,检查对象是否有符号引用

2、分配内存

在堆中给对象分配内存。分配内存有两种方式:指针碰撞和空闲列表。使用哪种方式主要取决于Java内存是否规整。指针碰撞适用于内存规整,空闲列表适用于内存不规整。

出个问题考考你:Java内存是否规整和什么有关

答案:垃圾回收算法,不清楚的可以去回顾一下jvm垃圾回收相关知识。

3、设置零值

保证对象实例字段在不初始化时就可以直接使用可以得到字段的类型。

4、设置对象头

详细可以查看对象头的作用。如:对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。我们都知道在锁升级时,对象头的状态也都是不一样的,这就很关键。

5、初始化

从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始。对象根据我们写的程序进行init

类加载的流程 加载 类加载时主要完成这三件事
  • 通过全类名获取定义此类的二进制字节流
  • 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  • 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
类加载器
  • 启动类加载器(bootstrap class loader)加载Java核心类
  • 扩展类加载器(extensions class loader)加载JRE的扩展目录
  • 系统类加载器(system class loader)加载当前应用 classpath下的类
双亲委派机制

原理:首先会把该请求委派给父类加载器处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。

简单来说,比如我们新建Object这个类,但我们在加载的时候只用到启动类加载器加载的Object,而不是系统类加载器加载的Object。

好处:防止核心API库被随意篡改;避免类的重复加载

链接 验证

 以上图片引用自javaGuide

准备

在方法区准备类变量(被static修饰)的内存以及设置变量的初始值。

解析

虚拟机将常量池内的符号引用替换为直接引用的过程

初始化

执行clinit方法

类被GC的条件

需同时满足:

  • 无此类的实例
  • 无此类的引用
  • 此类的类加载器实例被回收

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5692510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存