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)的启动和执行过程分为以下几个步骤:

  1. 加载:JVM首先加载JDK的核心类库以及应用程序所需的其他类。加载过程中包括以下几种方式:

    • 类文件加载:将编译后的Java类文件加载到内存中。
    • 字节码校验:验证加载的字节码是否符合Java语法规范。
    • 字节码转换:将字节码转换成机器码,以便于执行。
  2. 链接:在加载完类文件后,JVM需要进行链接处理,包括以下三个阶段:

    • 验证:检查字节码是否符合JVM规范。
    • 准备:为类变量(静态变量)分配内存空间,并设置默认初始值。
    • 解析:将符号引用转换为直接引用。
  3. 初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。JVM保证类的初始化在多线程环境下的安全性。

  4. 执行:将字节码转换为机器码,逐行执行机器码指令。执行过程中需要注意以下几点:

    • 进行即时编译(Just-In-Time Compilation):将热点代码(被频繁调用的代码)编译成机器码,以提高执行效率。
    • 垃圾回收(Garbage Collection):在执行过程中,JVM会自动回收不再使用的内存空间,以确保内存的有效利用。
  5. 销毁:当Java程序执行完毕或者出现异常时,JVM会释放所有占用的资源,并终止执行。

JVM的启动和执行流程可以总结为:加载类文件、链接处理、初始化类、执行字节码。通过这一流程,JVM能够实现Java程序的跨平台运行,并提供内存管理和垃圾回收等功能,以确保程序的安全和性能。

JVM(Java Virtual Machine)的退出流程可以分为正常退出和非正常退出两种情况。

  1. 正常退出:

    • JVM收到终止请求,如通过调用System.exit()方法或者通过kill命令结束进程。
    • JVM开始执行退出过程,首先会执行已注册的关闭钩子(Shutdown Hook)。
    • 关闭钩子是一段在JVM正常退出之前执行的代码,可以通过Runtime.addShutdownHook方法注册。
    • JVM的关闭钩子可以用于释放资源、保存状态等操作。
    • 在关闭钩子执行完毕后,JVM执行一些清理操作,如垃圾回收、关闭网络连接等。
    • 最后,JVM完全终止运行,进程退出。
  2. 非正常退出:

    • 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会继续执行清理操作并退出。

需要注意的是,关闭钩子的执行顺序是不确定的,不同的钩子可能在不同的线程中执行。因此,如果有多个关闭钩子,它们之间应该是独立的,不依赖于其他钩子的执行顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法

液晶拼接屏成为目前比较热门的大屏显示系统,技术比较成熟,清晰度高、维护方便,性价比也还不错,市场需求量较大。但是液晶拼接屏安装方法很多人并不了解,下面小编就来简单介绍一下。以46寸液晶拼接屏指导安装为例&#…

cmd255command.executereader()打印连接错误_打印经常遇到的几个问题,轻松解决

在平常的工作中,我们经常会遇到一些打印问题,今天就分享下几个常见的故障问题解决。wps/office文档一点击打印就卡死这种一般默认打印机设置的是其它电脑共享的情况下出现的,当与主机的连接出现异常或者主机的打印设置有问题时,就…

如何制定客户留存策略_商客通:办理石家庄400电话如何留存客户

【办理石家庄400电话如何留存客户】在如今理性消费的市场,400电话能够为在消费者心中为企业营造一份信任感,彰显企业关怀及企业责任感;为消费者提供畅达的通信渠道、完善的企业服务保障。石家庄400电话搬家不换号石家庄企业在公司搬迁或者员工…

普中51控制火焰传感器_汽车爆震传感器的工作原理及的检测方法、处理

汽车爆震传感器的工作原理及的检测方法、处理黄永刚1 爆震传感器的工作原理按照结构的不同,可以将汽车爆震传感器分为压电式非共振型爆震传感器、压电式共振型爆震传感器和压电式火花塞座金属垫型爆震传感器,又可以分为压电式爆震传感器和电感式爆震传感…

java绘制流程图_如何才能更好地绘制计算机毕业设计中各种图表

“ 毕设论文中的各种图表是不可或缺的,如果只是单纯的文字,或者图表较少,达不到要求的话,最终是通过不了答辩审核的!”目前绘制图表的软件很多,比如VISIO等,切记尽量不要使用word软件进行绘制&a…

arcgis加载dwg显示一个点_Arcgis添加控制点配准校正影像,更新校正之后,其他软件打开之后,影像位置没有校正解决办法...

使用有偏移的两景影像srcImg.tif 和 refImg.tif举例,用refImg.tif为参考,把待校正影像srcImg.tif,与refImg.tif配准一致。原始影像如下所示:这里就不演示如何采集控制点了,大家可以搜索arcgis配准详细步骤;…

空投坐标怎么看6_嗦粉不咯?桂林米粉店将分三四五星级,你怎么看? 旅行 6 月 4 日热点速递...

吃货们请听好,以下内容可能与你有关~来看今日好问广西无疑是嗦粉星人的圣地,桂林米粉、柳州螺蛳粉、南宁老友粉 ...... 用手指都不够数。这不,桂林发布「米粉新政」,从 7 月起桂林米粉店划分为三星级、四星级、五星级三个等级。如…

java list应用_java中list集合的应用

java中list集合的应用 1.数组列数据的添加与删除: List list new LinkedList(); list new ArrayList(); 产生一个数组列对象并建立双向连表。 连表分为单向连表和双向连表;单向连表就像:a 只能到 b,b 不能到 c;双向连…

ubuntu 自动加载ko_开屏广告太烦人?用这个只有 2M 的 App,助你自动跳过 5 秒等待...

手机上的什么按钮会让你不假思索点击?除了抢红包,恐怕就是应用启动页的「跳过广告」了。「跳过广告」会这么容易被叉掉吗?显然,如果不够快准狠,连戳几次没反应不说,还有可能在戳偏后继续忍受广告跳转……掐…

怎样查看cudnn版本_tensorflowGPU版本踩坑记录

终于安装完成了tensorflow,写一下过程开心的记录一下之前按照网上的教程,装了半天,下对应的cuda和cudnn,搞了半天,结果is_gpu_avaliable()函数通不过,查了半天,只找到cuda和cudnn版本不对应&…

java继承调用先后_「继承顺序」JAVA继承顺序 - seo实验室

继承顺序当使用继承这个特性时,程序是如何执行的;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性,再执行构造方法中的初始化当使用继承这个特性时,程序是如何执行的呢,也就是说我们需要关注继承的初…

手机连接蓝牙扫码枪_宝马车与手机无法蓝牙连接的技术通报

点击↑上方蓝字关注置顶,懂车,更懂宝马!故障现象:手机电话与车辆无法连接,故障信息显示“设备无法连接”,诊断时输出故障代码:B7F8BB - “无法启动蓝牙”。涉及车型:F40G02 G05 G06 …

gdb tui 安装_GDB 单步调试汇编

之前在看汇编的时候一直是肉眼看GCC -S的结果,缺点是很不直观,无法实时的看到寄存器的值,所以研究了下如何用GDB调试汇编。当然,写这篇文章更重要的一个目的是半年没有写博客了,博客要长草了。^_^调试汇编的需求有几点…

java中的异常处理语句_Java中实现异常处理的基础知识

Java中实现异常处理的基础知识异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况。许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象。例如:数组越界和被0除。源代码示例:packageyanzheng;//…

改变numpy的大小_Numpy入门详细教程

序言:python数据科学基础库主要是三剑客:numpy,pandas以及matplotlib,每个库都集成了大量的方法接口,配合使用功能强大。平时虽然一直在用,也看过很多教程,但纸上得来终觉浅,还是需要…

九年级数学解方程50道_初中数学公式中考知识点总结,初三数学上册,九年级数学上册...

初中数学公式中考知识点总结,初三数学上册,九年级数学上册第二十一章 一元二次方程知识点:一元二次方程的解法1、直接开平方法利用平方根的定义直接开平方求一元二次方程的解的方法叫做直接开平方法,2、配方法配方法是一种重要的数…

java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间

正文之前终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事&…

与40mhz信道不兼容设置_为什么面包板不适合高频电路

01为什么在面包板上玩射频?方便,当然还是方便。面包板是进行一些电子线路实验构建电路方便的平台。多用于普通数字电路和模拟电路。一旦涉及到高频电路,面面包就有很多方面不太适合了。那么到底哪方面不适合?对于高频信号在面包板…

加载gif_搞笑gif:这啥情况啊?笑容加载不出来了?

这无故的小眼神,我也很无奈呀。。。猫和狗对峙,气势上一定不能输几个菜呀,喝成这样!这啥情况啊?笑容加载不出来了?高手在民间!小青年瞬间变老头!丈母娘来家了,说下班就能…

排序千万级数据_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...

千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议。从一开始脑海里开始也是火光四现&…