Java JVM的基本概念、结构、生命周期详解

 更新时间:2025年05月16日 08:55:51   作者:刘Java  
这篇文章主要介绍了Java JVM的基本概念、结构、生命周期使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1 JVM简介

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机JVM后,Java语言在不同平台上运行时不需要重新编译。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行,因此屏蔽了与具体平台(win、mac)相关的信息,使得只需要一份字节码文件,就可以在多种平台上不加修改地运行。

不仅如此,现在的JVM还实现了语言的无关性,Scala、Kotlin、Groovy等语言都可以使用JVM运行。

编译后被Java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统)的二进制格式来表示, 并且经常(但并非绝对)以文件的形式存储, 因此这种格式称为class 文件格式。 实际上JVM的平台、语言无关性的上层原因也是因为.class文件格式的平台、语言无关性。

2 JVM的生命周期

2.1 启动

JVM实例对应了一个独立运行的java程序,它是进程级别。

启动一个Java程序时,会首先建立一个JVM实例,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点

2.2 运行

main()作为该程序初始线程的起点,任何其他线程均由该线程启动。

JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程(Thread的setDaemon(true)方法)。

2.3 消亡

  1. 当程序中的所有非守护线程都终止时,JVM退出;
  2. 若安全管理器允许,程序也可以使用System.exit(0)或 Runtime.getRuntime().exit()来退出。
  3. 程序所在平台强制结束JVM进程

3 JVM的体系结构

3.1 JVM组成

主要分成三块:

  • 类装载器(ClassLoader)(用来装载.class文件)
  • 执行引擎(执行字节码,或者执行本地方法)
  • 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

注意:

java编译器把java源文件(.java文件)编译成字节码文件(.class文件),然后JVM对字节码文件进行加载、解释执行。

java的源代码是无法直接在JVM上运行的,Java编译器在JDK中,可以使用javac命令对Java源文件进行编译。

3.1 JVM各模块简介

我们的后续学习主要学习的内容是JVM的类加载机制、运行时数据区域、GC机制、执行引擎机制、以及一些JVM优化

对于源文件的编译,并不属于JVM的范畴,编译原理的内容比较复杂,但是我们可以了解一下,Java源代码编译大概步骤为:

生成的字节码文件中包含结构信息、元数据、方法信息等,具体的字节码结构在类文件结构部分。深入了解编译器可以看《自己动手实现jvm》、《编译原理》等书。

JVM对Java字节码进行加载、执行,JVM的类加载是通过ClassLoader及其子类来完成的,执行的过程抽象如下:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 教你如何使用idea管理docker

    教你如何使用idea管理docker

    其实idea也提供了docker的管理功能,比如查看容器列表,启动容器,停止容器等,本文来看下如何管理本地的docker daemon和远程的dockers daemon,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java中的日期和时间类以及Calendar类用法详解

    Java中的日期和时间类以及Calendar类用法详解

    这篇文章主要介绍了Java中的日期和时间类以及Calendar类用法详解,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Spring @Cacheable自定义缓存过期时间的实现示例

    Spring @Cacheable自定义缓存过期时间的实现示例

    本文主要介绍了Spring @Cacheable自定义缓存过期时间的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • SpringBoot 之启动流程详解

    SpringBoot 之启动流程详解

    SpringBoot 是一个基于 Spring 框架的快速开发框架,旨在简化 Spring 应用程序的开发和部署。在本文中,我们将深入分析 SpringBoot 启动过程的源代码,并提供必要的解释和说明
    2023-04-04
  • Java序列化(Serialization) 机制

    Java序列化(Serialization) 机制

    本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下
    2016-07-07
  • Java使用RedisTemplate操作Redis遇到的坑

    Java使用RedisTemplate操作Redis遇到的坑

    这篇文章主要介绍了Java使用RedisTemplate操作Redis遇到的坑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MyBatis Map结果的Key转为驼峰式

    MyBatis Map结果的Key转为驼峰式

    今天小编就为大家分享一篇关于MyBatis Map结果的Key转为驼峰式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 使用JPA自定义VO类型转换(EntityUtils工具类)

    使用JPA自定义VO类型转换(EntityUtils工具类)

    这篇文章主要介绍了使用JPA自定义VO类型转换(EntityUtils工具类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 基于java构造方法Vector删除元素源码分析

    基于java构造方法Vector删除元素源码分析

    这篇文章主要介绍了基于java构造方法中对Vector删除元素的源码分析,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家早日升职加薪
    2021-09-09
  • Spring为IOC容器注入Bean的五种方式详解

    Spring为IOC容器注入Bean的五种方式详解

    这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论