【JVM —— 03 类的生命周期】

article/2025/8/11 5:55:30

Java 类的生命周期指的是一个类从加载到内存到卸载出内存的整个过程。这一过程主要包括以下几个阶段:

  1. 加载(Loading)
  2. 连接(Linking)
    • 验证(Verification)
    • 准备(Preparation)
    • 解析(Resolution)
  3. 初始化(Initialization)
  4. 使用(Usage)
  5. 卸载(Unloading)

1. 加载(Loading)

类加载器(Class Loader)将字节码文件(.class 文件)读取到内存中,生成一个 java.lang.Class 对象。类加载器分为以下几种:

  • Bootstrap ClassLoader:引导类加载器,加载 JDK 核心类库(rt.jar)。
  • Extension ClassLoader:扩展类加载器,加载 JDK 扩展类库(lib/ext 目录)。
  • Application ClassLoader:应用类加载器,加载应用程序的类路径(classpath)上的类。
双亲委派机制

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,

再由顶向下进行加载。

打破双亲委派机制

打破双亲委派机制历史上有三种方式,但本质上只有第一种算是真正的打破了双亲委派机制:

  • 自定义类加载器并且重写loadClass方法。Tomcat通过这种方式实现应用之间类隔离。为每一个应用创建一个类加载器。

  • 在同一个Java虚拟机中,只有相同类加载器+相同的类限定名才会被认为是同一个类。

 

 

2. 连接(Linking)

连接阶段包括验证准备解析三个子阶段。

验证(Verification)

确保类的字节码符合 JVM 的规范,不会危害 JVM 的安全。验证过程包括:

  • 文件格式验证:检查字节码文件格式是否符合规范。
  • 元数据验证:检查类的元数据(如类、字段、方法的描述)是否符合规范。
  • 字节码验证:分析数据流和控制流,确保字节码指令不会危害 JVM 的安全。
  • 符号引用验证:确保类、字段、方法的符号引用是合法的。
准备(Preparation)

为类的静态变量分配内存,并将其初始化为默认值。注意,这里只是分配内存并初始化默认值,不会执行任何用户定义的初始化代码。

解析(Resolution)

将常量池中的符号引用(如类名、方法名、字段名)替换为直接引用(指向实际内存地址的指针)。

3. 初始化(Initialization)

初始化阶段执行类的初始化代码,包括:

  • 静态变量的初始化:按顺序执行静态变量的初始化表达式。
  • 静态代码块的执行:按顺序执行静态代码块。

初始化过程是线程安全的,JVM 保证同一个类的初始化代码只会被执行一次。

4. 使用(Usage)

在初始化完成后,类进入使用阶段。在使用阶段,可以创建类的实例、访问静态变量、调用静态方法等。

5. 卸载(Unloading)

当某个类不再被使用,并且对应的 ClassLoader 被垃圾收集器回收时,该类会被卸载出内存。类的卸载是由 JVM 自动进行的,开发者不能显式地卸载类。


http://www.hkcw.cn/article/sGVUicviSc.shtml

相关文章

Arthas简介及示例

一、什么是Arthas? Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方…

JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道

"此刻正是奇点编译的第3.1415926秒!伏羲的算筹正在撕裂冯诺依曼架构的次元壁!诸君请看——这JVM堆内存中正在孕育盘古的元神!" 目录(终极扩展) 第一章:太极二进——内存模型的阴阳交缠 第二章&a…

JVM的组成

JVM 运行在操作系统之上 java二进制字节码文件的运行环境 JVM的组成部分 java代码在编写完成后编译成字节码文件通过类加载器 来到运行数据区,主要作用是加载字节码到内存 包含 方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等 随后来到执行引擎,主要作用是翻译字…

【java面试题】二进制(详解,一看就会)

二进制 1.什么是二进制 二进制是一种数值表示系统,它使用两个符号表示数字:0和1。它是计算机系统的基础,因为计算机使用二进制数来进行数据存储和处理。在二进制中,每一位代表一个2的幂次方,比如: 0 020…

Java 2.4 - JVM

一、Java 内存区域详解(重点) 本篇讨论的是 HotSpot 虚拟机 相比于 C 而言,程序员不需要对每个 new 操作都写对应的 delete / free 操作,这些操作我们会交给虚拟机去做。因此,如果不了解虚拟机的原理,一旦…

java面试-- 必问之jvm与性能优化(一)

问题一、 描述一下 JVM 加载 Class 文件的原理机制? JVM(Java虚拟机)加载Class文件的原理机制是Java程序运行的关键组成部分。这一过程涉及到多个阶段,确保Java程序能够跨平台运行,并动态地加载、解析和执行Java Class文件。以下…

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。 栈是运行…

【Linux探索学习】第三十二弹——生产消费模型:基于阻塞队列和基于环形队列的两种主要的实现方法

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面我们已经学习了关于线程的主要知识,包括线程的基础知识以及线程的同步与互斥等内容,今天我们来学几个线程知…

复现FAST_LIVO2【Ubuntu 20.04.6 LTS】

目录 准备1 Ubuntu 和 ROS2 其他库2.1 PCL2.2 Eigen2.3 OpenCV 3 Sophus3.1 安装3.2 make报错 4 Vikit5 livox_ros_driver5.1 Livox-SDK5.2 livox_ros_driver FAST-LIVO2运行参考 准备 1 Ubuntu 和 ROS 依据开源介绍,Ubuntu 16.04~20.04。 复现版本为:…

【基于Ubuntu下Yolov5的目标识别】保姆级教程 | 虚拟机安装 - Ubuntu安装 - 环境配置(Anaconda/Pytorch/Vscode/Yolov5) |全过程图文by.Akaxi

目录 一.【YOLOV5算法原理】 1.输入端 2.Backbone 3.Neck 4.输出端 二.【系统环境】 1.虚拟机的安装与创建 2.安装Ubuntu操作系统 3.环境的配置 3.1.Ubuntu下Anacoda安装以及虚拟环境配置 3.2.Pytorch安装 3.3.Vscode安装 3.4.Yolov5源码及环境获取安装…

[已解决] 本地两台 win电脑 (以太网) 网线传输文件 - 局域网连接 (解决windows无法访问共享文件问题 - Windows 安全中心输入网络凭据 用户名/密码 不正确问题)

背景 由于要本地传输的数据比较大,大几百GB网盘传输慢,正好有网线,试着本地网线高速传输(实测113MB/s)踩了很多坑,想把亲测成功的经验分享出来帮助更多同学 目录 1 网线接入 2 设置两台电脑的IP地址 3 …

Docker(三):DockerFile

一、DockerFile介绍 1、DockerFile 介绍 DockerFile 是一种能够被Docker 程序解释的文件(一般为了方便理解称之为“剧本”)。 DockerFile 由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器 镜像中指定自己额外的需…

【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…

Ubuntu24安装Docker详细教程

目录 Ubuntu 安装 Docker 详细教程 一、安装环境说明 二、卸载旧版 Docker(若存在) 三、安装必要的依赖 四、添加 Docker 的 GPG 密钥 五、配置 Docker 的软件源 六、安装 Docker docker-compose离线安装 七、验证 Docker 是否安装成功 八、配置…

2024第八届御网杯信息安全网络大赛线上WP详解(misc+cryoto)(详解-思路-脚本)

芜湖~ 首届御网杯线上和ISCC分开进行 但还是用的ISCC的页面差评 嘻嘻 又是玄乎的一天 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 目录 附件 # Misc ##Notice ##编码转换 Brainfuck编码 jsfuck编码 Ook! 编码 ##bluetooth 导出压缩包 第一…

在Linux中安装、配置和挂载NFS的完整指南

一、NFS简介 NFS(Network File System) 是一种分布式文件系统协议,允许用户通过网络在不同主机间共享文件和目录。它适用于局域网环境,常用于服务器集群、数据共享等场景。本文详细介绍NFS服务端与客户端的安装、配置及挂载流程。…

Linux-Ubuntu下的git安装与配置

一、安装git 1.打开终端,运行以下命令(需要联网) sudo apt-get update sudo apt-get install git 2.验证安装 安装完成之后,通过运行以下命令验证git是否已经正确安装: git --version 二、配置git 2.1.配置用户名…

亲测可用:wsl2安装ubuntu22.04的GNOME桌面

本文主要介绍wsl安装的ubuntu如何配置图形化桌面,主要使用与windows操作系统环境,方便搭建Linux环境下的可视化开发环境,网上流传的很多教程都不能正确安装,以下是本人亲自验证可用的操作方法。 1、开始安装 1.1 配置源 sudo v…

个人健康中枢的多元化AI网络革新与精准健康路径探析

引言 随着数字化转型的深入推进,个人健康中枢作为集成化健康管理系统,正在从传统的单一功能向多元化的AI驱动方向快速发展。在这一背景下,新兴网络硬件技术,特别是DPU(数据处理单元)和全光网络的出现,为个人健康中枢的革新提供了前所未有的机遇。本研究将深入探讨这些技…

Linux《进程控制》

在之前的Linux《进程概念》当中我们已经了解了进程基本的概念,那么接下来在本篇当中我们将开始进程控制的学习;在本篇当中我们先会对之前的学习的创建子进程的系统调用fork再进行补充了解,并且再之后会重点的学习进程的终止、进程等待以及进程…