JVM的生命周期
1.加载(Loading):
在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中。加载完成后,JVM内存中就存在了一个Class对象,它包含了该类的所有属性和方法的信息。
2.验证(Verification):
验证阶段是确保加载的字节码文件符合JVM规范的过程。在验证阶段,JVM会检查字节码的格式、语义以及符号引用的正确性,以防止安全漏洞和运行时错误。验证的目标包括:类文件结构的完整性、语义的正确性和符号引用的验证。
3.准备(Preparation):
在准备阶段,JVM会为类的静态变量分配内存并设置默认初始值。这些静态变量包括基本数据类型和引用类型,它们会被初始化为零值(零值是每种数据类型的默认值,如0、false、null等),而不是类中定义的初始值。此阶段会在方法区中为每个静态变量分配内存空间。
4.解析(Resolution):
解析阶段是将符号引用转换为直接引用的过程。在Java中,类的方法和字段访问采用的是符号引用,而不是直接引用。解析阶段会将这些符号引用转化为直接引用,以便能够正确访问和调用类的方法和字段。解析阶段包括类、字段和方法的解析。
5.初始化(Initialization):
初始化阶段是JVM执行类的初始化代码的过程。类的初始化代码包括静态变量的赋值和静态代码块的执行。在该阶段,JVM会按照类的加载顺序依次初始化每个类,确保所有的静态变量被正确初始化,并执行静态代码块中的代码。初始化阶段是类加载过程的最后一步。
6.使用(Usage):
使用阶段是指JVM执行Java程序的过程。在使用阶段,JVM会按照程序的流程执行相应的指令,并处理方法调用和对象创建等操作。JVM通过执行Java字节码来实际运行程序,包括调用方法、访问字段和创建对象等操作。
7.卸载(Unloading):
卸载阶段是指JVM从内存中卸载不再被使用的类和相关资源。当一个类不再被引用,并且没有正在执行的对象实例时,JVM会卸载该类,并释放其占用的内存空间。卸载过程由垃圾回收器完成,它会检测并回收不再被引用的类和对象。
JVM的生命周期是一个动态的过程,它负责加载、验证、准备、解析、初始化、使用和卸载Java字节码文件。每个阶段都有特定的任务和目标,保证程序能够正确运行并在不再需要时释放资源。
Java虚拟机(JVM)的启动和执行过程分为以下几个步骤:
-
加载:JVM首先加载JDK的核心类库以及应用程序所需的其他类。加载过程中包括以下几种方式:
- 类文件加载:将编译后的Java类文件加载到内存中。
- 字节码校验:验证加载的字节码是否符合Java语法规范。
- 字节码转换:将字节码转换成机器码,以便于执行。
-
链接:在加载完类文件后,JVM需要进行链接处理,包括以下三个阶段:
- 验证:检查字节码是否符合JVM规范。
- 准备:为类变量(静态变量)分配内存空间,并设置默认初始值。
- 解析:将符号引用转换为直接引用。
-
初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。JVM保证类的初始化在多线程环境下的安全性。
-
执行:将字节码转换为机器码,逐行执行机器码指令。执行过程中需要注意以下几点:
- 进行即时编译(Just-In-Time Compilation):将热点代码(被频繁调用的代码)编译成机器码,以提高执行效率。
- 垃圾回收(Garbage Collection):在执行过程中,JVM会自动回收不再使用的内存空间,以确保内存的有效利用。
-
销毁:当Java程序执行完毕或者出现异常时,JVM会释放所有占用的资源,并终止执行。
JVM的启动和执行流程可以总结为:加载类文件、链接处理、初始化类、执行字节码。通过这一流程,JVM能够实现Java程序的跨平台运行,并提供内存管理和垃圾回收等功能,以确保程序的安全和性能。
JVM(Java Virtual Machine)的退出流程可以分为正常退出和非正常退出两种情况。
-
正常退出:
- JVM收到终止请求,如通过调用System.exit()方法或者通过kill命令结束进程。
- JVM开始执行退出过程,首先会执行已注册的关闭钩子(Shutdown Hook)。
- 关闭钩子是一段在JVM正常退出之前执行的代码,可以通过Runtime.addShutdownHook方法注册。
- JVM的关闭钩子可以用于释放资源、保存状态等操作。
- 在关闭钩子执行完毕后,JVM执行一些清理操作,如垃圾回收、关闭网络连接等。
- 最后,JVM完全终止运行,进程退出。
-
非正常退出:
- JVM遇到致命错误,如OutOfMemoryError或StackOverflowError。
- JVM无法继续执行,并抛出一个异常。
- 异常的抛出会导致程序所在的线程被终止,然后整个JVM进程退出。
JVM的退出过程可以通过实现一个Shutdown Hook来观察,示例代码如下:
public class ShutdownHookExample {public static void main(String[] args) {// 注册一个关闭钩子Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {System.out.println("Shutting down...");}});// 模拟程序运行try {Thread.sleep(5000); // 程序休眠5秒钟} catch (InterruptedException e) {e.printStackTrace();}// 手动触发退出事件System.exit(0);}
}
该示例程序在运行时注册了一个关闭钩子,并在关闭钩子中打印一条消息。然后程序会休眠5秒钟,之后手动调用System.exit(0)方法触发JVM退出事件。在程序运行时,我们可以观察到在5秒后打印的"Shutting down..."消息,表示关闭钩子被执行。然后JVM会继续执行清理操作并退出。
需要注意的是,关闭钩子的执行顺序是不确定的,不同的钩子可能在不同的线程中执行。因此,如果有多个关闭钩子,它们之间应该是独立的,不依赖于其他钩子的执行顺序。
相关文章:

JVM的生命周期
1.加载(Loading): 在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中…...
ElasticSearch--基本操作
ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式:PUT 请求路径:/索引库名,可以自定义 请求参数:mapping映射 PUT /test {"mappings": {"propertie…...
大数据应用发展史:从搜索引擎时代到机器学习时代
文章目录 搜索引擎时代数据仓库时代数据挖掘时代机器学习时代小结 大数据技术的使用经历了一个发展过程 从最开始的Google在搜索引擎中开始使用大数据技术,到现在无处不在的各种人工智能应用,伴随着大数据技术的发展,大数据应用也从曲高和寡…...

java基础之String的不可变性
目录 概述 String是如何实现不可变的 String为何设计成不可变的 1.缓存和性能优化 2.安全性 3.线程安全性 4.API设计和预测性能 概述 String类的不可变性意味着一旦创建了一个字符串对象,它的值就不能被修改。 String是如何实现不可变的 查看源码 public …...
【JS】Promise详解
概述 在 JavaScript 中,Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象,你可以附加回调函数,而不是将回调传递给函数。 let promise new Promise((resolve, reject) > {let condition true; // 这可以是某…...

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法
一、最终效果 二、步骤 1、在初始化进入项目时,获取当前主题色 2、把主题色定义成全局变量(即在app.js中设置) 3、tabBar也需要定义全局变量,在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…...

Java关键字(1)
Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字: public:表示公共的,可以被任何类访问。 private:表示私有的,只能被定义该关键字的类访问。 cl…...

【机器学习合集】深度生成模型 ->(个人学习记录笔记)
深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下,学习一个映射函数F,使得F(X)Y 判别模型 Discriminative Model,即判别式模型,又称为条件模型,或条件概率模型 生…...
Java将PDF转换为文本
在Java中,你可以使用现有的库来将PDF文件转换为文本。下面是一个简单的示例,使用Apache PDFBox库来实现PDF到文本的转换。首先,确保在你的项目中添加了Apache PDFBox库的依赖。你可以在 Maven 项目中添加以下依赖: <!--Pdf--&g…...

Linux 运维工具之1Panel
一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器࿰…...

深入了解小红书笔记详情API:为内容创新提供动力
一、小红书笔记详情API简介 小红书笔记详情API是一种允许开发者访问小红书平台上的笔记详细数据的接口。通过这个API,我们可以获取笔记的标题、内容、标签、点赞数、评论数等详细信息。这些数据对于内容创作者和品牌来说至关重要,可以帮助他们了解用户喜…...

Animate 2024(Adobe an2024)
Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具,是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能,让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点: 强大的设计工…...

尽量避免删改List
作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…...

【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…...

计算机组成原理复习4
习题 练习题 下列不属于系统总线的为() a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是() a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…...
AutoSAR(基础入门篇)3.3-Autosar中RTE的数据一致性与Interface接口
目录 一、RTE的数据一致性 1、什么是数据一致性 2、数据一致性的实现机制 2.1、利用RTE管理<...

超维空间S2无人机使用说明书——52、初级版——使用PID算法进行基于yolo的目标跟踪
引言:在实际工程项目中,为了提高系统的响应速度和稳定性,往往需要采用一定的控制算法进行目标跟踪。这里抛砖引玉,仅采用简单的PID算法进行目标的跟随控制,目标的识别依然采用yolo。对系统要求更高的,可以对…...
<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传
目录 TCP的通信机制的核心特性 一、确认应答 1)什么是确认应答? 2)如何“确认”? 3)如何“应答”? 二、超时重传 1)丢包的概念 2)什么是超时重传? 3)…...

Spark任务调度与数据本地性
Apache Spark是一个分布式计算框架,用于处理大规模数据。了解Spark任务调度与数据本地性是构建高效分布式应用程序的关键。本文将深入探讨Spark任务调度的流程、数据本地性的重要性,并提供丰富的示例代码来帮助大家更好地理解这些概念。 Spark任务调度的…...
【论文阅读】Self-Paced Curriculum Learning
论文下载 代码 Supplementary Materials bib: INPROCEEDINGS{,title {Self-Paced Curriculum Learning},author {Lu Jiang and Deyu Meng and Qian Zhao and Shiguang Shan and Alexander Hauptmann},booktitle {AAAI},year {2015},pages {2694--2700} }1. 摘…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...