JVM 核心笔记:对象创建、生命周期与类加载器详解

目录

创建对象的过程

对象的生命周期

类加载器有哪些?

双亲委派模型

创建对象的过程

**1.类加载检查:**在一个对象被创建时,jvm会检查这个对象的类是否被加载加载过,如果没有被加载过则需要加载一次类之后,才能进行后面的步骤

2.分配内存: 进行类加载检查通过过后,jvm会为新对象分配一个从类加载过程中知道的合适的内存,把一块相应的内存从java堆里分出来

3.初始化零值: 在分配内存后,jvm会给内存空间初始化零值(不包括对象头),保证了对象的实例字段一开始不用赋值也能使用

**4.必要设置:**初始化过后虚拟机JVM会对对象进行必要设置,比如设置对象头,锁一类的属性

**5.执行init构造函数:**经过init构造函数后才能把对象从初始化的零值改成我们想要的内容

对象的生命周期

创建:在new之后,JVM为对象分配内存,初始化,设置对象头等操作,完成实例化

调用:对象被引用访问其属性,方法

销毁:当对象不再被引用,垃圾回收机制会自动回收对象所占空间,释放空间销毁对象

类加载器有哪些?

类加载器:把xxx.class加载进入JVM使其成为能被JVM识别的 java.lang.Class 对象

启动类加载器 (Bootstrap Class Loader):最顶层的加载器,负责加载Java的底层类如JVM中的java.util.*,由于Java层没有直接的ClassLoader 对象(通过 getClassLoader() 获取时返回 null)。

扩展类加载器/平台类加载器

扩展类加载器(Java8及以前) Extension Class Loader: 负责加载 jre/lib/ext 或由 java.ext.dirs 系统属性指定目录下的 jar 包和类库。

替换为平台类加载器(Java9及以后) Platform Class Loader: jre/lib/ext 目录和 java.ext.dirs 属性都已被移除。平台类加载器负责加载 JDK 中一些除核心模块外的平台类(如 java.sqljava.xml 等)。

在 Java 层面,它的 parent 字段实际为 null,但在委派逻辑上仍会先交给 Bootstrap ClassLoader 处理。

**应用程序类加载器(Application ClassLoader):**负责加载代码的类,可以通过ClassLoader.getSystemClassLoader()获取,其父加载器是Platform Class Loader (Java8后),之前是Extention Class Loader

自定义类加载器(Custom Class Loader):开发者可以根据需求定制类的加载方式,比如从网络加载 class 文件、数据库、甚至是加密的文件中加载类等。自定义类加载器可以用来扩展 Java 应用程序的灵活性和安全性,是 Java 动态性的一个重要体现。

双亲委派模型

有了上述这些加载器关系,就形成了双亲委派模型,核心思想就是当加载器收到一个类加载请求时,不会自己先去加载,而是先给父类加载器完成,只有当父类加载器完成不了时才会给本身加载每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。

相关推荐
weixin_704266052 小时前
Spring Cloud Gateway 完整版笔记
笔记
2201_761040592 小时前
Golang怎么安全关闭channel_Golang channel关闭教程【通俗】
jvm·数据库·python
m0_493934532 小时前
Redis怎样合并多天访客数据_通过PFMERGE指令聚合HyperLogLog记录
jvm·数据库·python
tjc199010052 小时前
bootstrap怎么实现响应式的文章瀑布流布局
jvm·数据库·python
one_love_zfl2 小时前
java面试-JVM篇
java·jvm·面试
skiy2 小时前
Spring之DataSource配置
java·后端·spring
qq_189807032 小时前
SQL嵌套查询与物化视图_提升读性能的组合策略
jvm·数据库·python
2401_832365522 小时前
如何用消息广播机制让 Shared Worker 通知所有连接的页面
jvm·数据库·python
u0109147602 小时前
如何用 bubbles 参数让自定义事件支持在 DOM 树中冒泡
jvm·数据库·python