JVM 的生命周期是怎么样的

JVM——类的生命周期 方法区中的instanceKlass使用c++编译的,java不太好操作,所以在堆中创建了堆区中通过java语言包装后的对象(再从方法区中拷贝的过程中会将一些内容剔除掉,只包含我们需要的。当我定义数据时使用了final关键字,这就代表了在以后这个数据的值不再会发生变化了,所以就会在准备阶段直接将代码中的值进行赋值。连接阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。3、类加载器在加载完类之后,java虚拟机会将字节码中的信息保存到内存的方法区中。 阅读详情

JVM 的生命周期是指 JVM 实例从启动到终止的整个过程。一个 Java 应用程序通常对应一个 JVM 实例(除非使用 JNI 等技术在同一进程中创建多个 JVM 实例,但这并不常见)。

JVM 的生命周期阶段:

  1. 启动 (Startup):

    • 创建 JVM 实例: 当你使用 java 命令运行 Java 程序时,操作系统会创建一个新的进程,并在该进程中启动一个 JVM 实例。
    • 加载和初始化:
      • 查找并加载 JDK: 找到 JRE (Java Runtime Environment) 的位置.
      • 创建引导类加载器 (Bootstrap Class Loader): 加载核心类库(rt.jar 等)。
      • 创建扩展类加载器 (Extension Class Loader) 和应用程序类加载器 (Application Class Loader): 分别加载扩展类库和应用程序的类。
      • 加载 main 方法所在的类: 使用应用程序类加载器加载包含 main 方法的类。
      • 初始化类: 执行类的静态初始化块和静态变量赋值。
    • 命令行参数: 解析传入java命令的参数.
  2. 运行 (Execution):

    • 执行 main 方法: JVM 调用 main 方法,开始执行 Java 程序。
    • 类加载: 在程序运行过程中,根据需要动态加载类。
    • 字节码执行: JVM 的执行引擎解释或编译执行字节码。
    • 内存管理: JVM 分配和管理内存,进行垃圾回收。
    • 线程管理: JVM 创建和管理线程。
    • 异常处理: JVM 处理程序中发生的异常。
  3. 终止 (Termination):

    • 正常终止:
      • 当程序执行完 main 方法,并且所有非守护线程(non-daemon threads)都已结束时,JVM 正常终止。
      • 可以通过调用 System.exit(status) 方法显式终止 JVM。status 是退出状态码(0 表示正常退出,非 0 表示异常退出)。
    • 异常终止:
      • 如果程序中发生了未捕获的异常,并且没有设置默认的未捕获异常处理器,JVM 会异常终止。
      • 可以通过 Thread.setDefaultUncaughtExceptionHandler() 设置默认的未捕获异常处理器。
    • 外部终止:
      • 用户可以通过操作系统命令(例如,在 Linux 中使用 kill 命令)强制终止 JVM 进程。
      • JVM 可能会收到操作系统发送的终止信号(例如,SIGTERM)。
    • 钩子 (Shutdown Hooks):
      • 在 JVM 终止之前,可以注册一些钩子函数(shutdown hooks),用于执行一些清理操作(例如,关闭数据库连接、释放资源等)。
      • 可以使用 Runtime.getRuntime().addShutdownHook(Thread hook) 方法注册钩子函数。
      • 钩子函数会在以下情况下执行:
        • 程序正常退出。
        • 调用 System.exit()。
        • 用户中断程序(例如,按下 Ctrl+C)。
        • 系统关闭。
      • 钩子函数执行的顺序是不确定的。

总结流程图:

+----------------+
|    启动 JVM     |  (java 命令)
+----------------+
        |
        V
+----------------+
|  加载和初始化    |
|  - 查找并加载 JDK |
|  - 创建类加载器   |
|  - 加载 main 类   |
|  - 初始化类      |
+----------------+
        |
        V
+----------------+
|    运行程序     |
|  - 执行 main 方法|
|  - 类加载       |
|  - 字节码执行    |
|  - 内存管理     |
|  - 线程管理     |
|  - 异常处理     |
+----------------+
        |
        V
+----------------+
|    终止 JVM     |
|  - 正常终止      |
|  - 异常终止      |
|  - 外部终止      |
|  - 执行钩子函数   |
+----------------+

代码示例 (演示钩子函数):

public class JVMLifecycle {

    public static void main(String[] args) {

        // 注册钩子函数
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("JVM 即将终止,执行清理操作...");
            // 在这里执行清理操作 (例如,关闭数据库连接、释放资源等)
        }));

        System.out.println("程序开始执行...");

        // 模拟程序运行一段时间
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("程序执行完毕...");

        // 可以选择显式退出 (也可以不调用 exit,让程序自然结束)
        // System.exit(0);
    }
}

运行结果:

程序开始执行...
程序执行完毕...
JVM 即将终止,执行清理操作...

注意:

  • 如果程序中存在死循环或无限等待,JVM 可能永远不会终止。
  • 守护线程 (daemon thread) 不会阻止 JVM 终止。当所有非守护线程都结束后,JVM 会强制终止所有守护线程。
  • 钩子函数应该尽量简短,避免执行耗时的操作,否则可能会导致 JVM 无法正常终止。
  • 不要在钩子函数中调用 System.exit(),否则会导致死循环。
JVM的生命周期 在启动阶段,JVM进行一系列的初始化操作,并调用Java应用程序的入口方法。需要注意的是,JVM的具体实现可能有所不同,上述源码示例是基于OpenJDK HotSpot VM的部分代码片段。JVM的实现涉及多个组件和模块,如类加载器、字节码解释器、垃圾回收器等,每个组件都有相应的源码实现。JVM的生命周期包含启动、运行和终止三个阶段,下面将详细讲解每个阶段的原理并给出相应的源码。了解JVM的生命周期可以帮助我们更好地理解Java程序的运行机制,并提供一定的参考和思路,用于分析和解决与JVM相关的问题。 阅读详情

相关推荐

STM32最小系统硬件组成详解

STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 启动 1、电源 : 一般3.3V LDO供电 加多个0.01uf去耦电容 2、复位:有三种复位方式:上电复位、手动复位、程序自动复位 通常低电平复位:(51单片机高电平复位,电容电阻位置调换) 上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,计...

alala120的博客 12万+

JVM生命周期

JVM(Java Virtual Machine):Java虚拟机是Java的核心和基础,用来加载字节码(.class)文件、管理并分配内存、执行垃圾收集。JVM的生命周期分为七个阶段。一、创建阶段(Creation)1.为对象分配内存空间。2.开始构造对象。3.递归调用其父类的构造函数。4.进行对象实例初始化与变量初始化。二、应用阶段(Using)1.强引用(Strong Reference)基...

demo_gsl的博客 2079

YOLOv8验证的命令以及计算coco指标

好久不看代码,都不知道怎么验证的了,来记录一下。1、计算coco指标。

毕竟是Shy哥 1481

JVM生命周期过程

一、java虚拟机的生命周期:   Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。 Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。

weixin_57763462的博客 1215

FreeRTOS任务调度实战:如何让STM32同时处理温湿度采集、OLED显示和云端通信

本文通过一个基于STM32的物联网终端项目,详细讲解了如何利用FreeRTOS实现多任务调度,同时处理温湿度采集、OLED显示和云端通信。文章深入探讨了任务规划、堆栈分配、信号量与消息队列等核心机制,并重点优化了ESP8266通信任务的非阻塞设计与稳定性,为构建响应迅速、运行可靠的嵌入式系统提供了实战指南。

weixin_29188043的博客 331

【学长笔记】关于车牌识别的CCPD数据集按比例划分

本文介绍了一个用于CCPD车牌数据集划分的Python脚本,主要功能包括:1) 将数据集按比例划分为训练集、验证集和测试集;2) 支持图像与标签文件校验;3) 可自定义划分比例和样本数量限制;4) 自动生成标准目录结构。脚本使用随机种子确保可重复性,并通过tqdm显示进度条。处理后数据可直接用于YOLO等目标检测模型的训练与评估,建议在预处理完成后立即执行划分以避免数据泄露。文章还提供了相关技术博客的参考链接。

apple_53308981的博客 1478

JVM系列(四)JVM的类生命周期七步曲

0.前言 在上文中我们给大家介绍了Class字节码长啥样,而这样的字节码毕竟还是我们人为规定的一整个的数据结构,这样的字节码是无法直接在CPU上执行的,那JVM是如何将这样的字节码转换成CPU能认识的字节码并完成执行的呢?今天的这篇文章就给大家分享下JVM是如何加载&解析Class字节码的。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始

weixin_38814265的博客 408

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 686

jvm的生命周期

突发灵感想到jvm 的生命周期,就花了一点时间来整理了一下,特此分享,如果分享不对,欢迎各位指正,谢谢!废话不多说,走起! jvm实例的诞生: 当一个程序启动,伴随的就是一个jvm实例的诞生,当这个程序关闭退出,这个jvm实例就随之消亡。如果在同一台机器上运行多个程序,将诞生相应数量的jvm实例,每个程序都有一个与之对应的jvm实例供其运行。任何一个拥有公开的(public)、静态的(static)、没有返回值(void)并且接受一个字符串数组参数(String[] args) 的main...

qq_40860932的博客 1155

Allegro层叠中的介电常数如何填写指导说明

在用Allegro进行PCB设计的时候,需要在cross-section中设置好每个层的信息,包括层命名,每层的厚度等等信息。但是对于有仿真需求或者等长设计需要使用ps作为延时单位的设计的时候,需要额外在层叠中填写介电常数的值,如下图。按照经验值填写为2.8,因为外层和平面层不会被树脂填充,铜皮层还是完整的铜皮,如下图。对应层叠将每层介质的介电常数的数值填入到PCB中去,油墨的介电常数填4。层叠中只给出了每个介质的介电常数,铜皮的介电常数却没有给出。所以正确填写介电常数的结果如下图。需要按照下面的规则来。

weixin_54787054的博客 1394

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2109

简单的梳理JVM(一)——JVM生命周期、类的生命周期

文章目录前言一、简介二、JVM的介绍JVM生命周期JVM进程和线程三、类的生命周期1.类的概念2. 生命周期2.1 加载2.2 连接2.2.1 验证2.2.2 准备2.2.3 解析2.3 初始化2.4 使用2.4.1 主动使用2.4.2 被动使用2.5 卸载总结 前言 最近闲来无事,索性去学习了一下JVM的基础知识。虽然知识浅显的学习,但是收获还是非常大的,于是决定记录下来。 一、简介 简单来说,JVM就是java虚拟机。它是是由软件技术模拟出计算机运行的一个虚拟的计算机。 主要作用是把我们编写的ja

笑里笑外~ 1282

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 684

JVM中对象的生命周期

 JVM中对象的生命周期在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。上面的这7个阶段,构成了JVM中对象的完整的生命周期。下面分别介绍对象在处于这7个阶段时的不同情

dongliheng的专栏 1212

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【JVM】类的生命周期

加载(Loading)连接(Linking)验证准备解析初始化(Initialization)使用(Using)卸载(Unloading)加载:根据类的全限定名把字节码文件的内容加载并转换成合适的数据放入内存种种那个,存放在方法区和堆上。连接验证:魔数,版本号等验证,一般不需要程序员关注。准备:为静态变量分配内存并设置初始值。解析:将常量池中的符号引用(编号)替换为直接引用(内存地址)初始化:执行静态代码块和静态变量的赋值。使用卸载静态变量使用final。

Decade_Faiz的博客 1230

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jvm的生命周期和java类的生命周期

1.jvm的生命周期一个运行时的的java虚拟机实例的天职就是运行一个java程序。1.1.JVM实例的诞生        当一个程序启动,伴随的就是一个jvm实例的诞生,当这个程序关闭退出,这个jvm实例就随之消亡。如果在同一台机器上运行多个程序,将诞生相应数量的jvm实例,每个程序都有一个与之对应的jvm实例供其运行。任何一个拥有公开的(public)、静态的(static)、没有返回值(vo...

延陵缥缈的博客 6633

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM 生命周期

对象的生命周期阶段:不重载 原因 :

记录点点滴滴 1230

JVM对象生命周期详解

                                                          JVM对象生命周期详解  在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finaliz

LonelyTree的专栏 633

JVM——体系结构、生命周期简述

1. JVM 体系结构 如图所示,JVM包括类装载器子系统、运行时数据区、执行引擎。类装载器子系统根据给定的权限的名来装入类型(类或者接口)。执行引擎负责执行那些包含在被装载类的方法中的指令。运行时数据区包含方法区、堆、Java栈、PC寄存器、本地方法栈。 类装载器子系统:在JVM中负责查找并装载类型的那部分被称为类装载器子系统。JVM中有两种类装载器:启动类装载器和用户自定义

ZhangXL的专栏 1797
上一篇: IoC 容器是如何启动的?
下一篇: JVM 与操作系统之间的关系是什么?
冰糖心书房
博客等级 码龄15年 6017粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值