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 动态性的一个重要体现。

双亲委派模型

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

相关推荐
.Hypocritical.17 小时前
Maven笔记——2
java·笔记·maven
乐橙开放平台17 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频
huohuopro17 小时前
手写 Tomcat 步骤教程
java·网络
snow@li17 小时前
Java:Lombok 完整讲解
java
Shadow(⊙o⊙)17 小时前
高并发内存池:Part-1——定长内存池
java·前端·javascript
国服第二切图仔17 小时前
17-config命令 - 配置管理系统
java·前端·javascript
love530love1 天前
【笔记】AutoClaw NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的
人工智能·windows·笔记·agent
架构源启1 天前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
谙弆悕博士1 天前
系统集成项目管理工程师教程(第3版)笔记——第2章:信息技术发展
笔记·计算机网络·信息安全·学习方法·业界资讯·软考·系统分析师
吃着火锅x唱着歌1 天前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习