我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java是怎么运行起来的?深入理解Java虚拟机

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java是怎么运行起来的?深入理解Java虚拟机

但是,了解JVM是如何支持Java语言和其他相关语言的,对于程序员来说是很有裨益的!

本文分享一下Java的工作原理和JVM的内部结构。

1. Java虚拟机

Java虚拟机(JVM)是一个抽象的机器,用来执行一种代码,即bytecode。你可以把它看作是我们的代码和计算机硬件之间的桥梁,它把我们的代码作为输入,转换成字节码并在计算机硬件上运行它,从而实现开发者预期的结果。

2. 字节码 (bytecode)

字节码是一种JVM能够理解的文件类型。它是通过compilingJava代码(使用javac)生成的一种Java程序的中间表示形式。它之所以叫字节码,是因为每个操作码(operation)都是单字节大小的。字节码可以再次编译成机器码并在计算机上运行。

3. 编译

运行Java程序的第一步是编译。如果你有一个单独的Java文件,你可以使用提供的命令行工具javac来触发编译。

javac HelloWorld.java

上面代码会把一个给定的Java文件编译成.class文件,其中包含bytecode。如果源代码有错误,编译会失败并报出编译错误。

你可以使用提供的工具javap来查看已创建的类文件,以了解类文件的内部情况。

javap HelloWorld.class

4. 执行

在通过编译创建了.class文件之后,可以使用java语法来启动一个JVM的实例,它会触发一个包含多个复杂步骤的执行路径,最终执行我们提供的代码。

java HelloWorld

首先JVM需要获取.class文件,并将它加载到JVM的内存区域中。这个初始过程是通过JVM类加载器来实现的。

5. 什么是类加载?

抽象地说,类加载就是扫描并遍历提供的.class文件,并将类文件中的内容加载到JVM的内存区域中。然后,执行引擎就可以引用这些存储的数据,继续执行我们的代码。

JVM中有三种类型的类加载器,分别是:

  • 引导类加载器
  • 扩展类加载器
  • 应用类加载器

引导类加载器的职责是加载基础/核心的Java类,这些类对于Java程序运行是必不可少的。在早期的Java版本中,这些核心类被包含在位于jre/lib目录下的rt.jar文件中,但在后来的Java版本中,rt.jar中的内容被分割成模块化的组件。

扩展类加载器的职责是加载lib/ext目录下的类,这些类可能包括我们在代码中使用的任何扩展。

应用类加载器是三种中最常用的一种,它负责加载用户定义的类。它会扫描我们程序的类路径,并加载其中的类。

6. 类加载过程

类加载过程有两个主要步骤:

  • 加载
  • 链接

7. 加载

在加载过程中,类加载器读取类文件的二进制表示形式,即.class文件,并在JVM的运行时内存中创建它的表示。这个表示称为Class Object,它位于JVM内存的方法区中。

8. 链接

在加载过程之后,开始链接。链接有三个步骤。

  • 验证 — 确保类文件的正确性。验证类是否符合Java规范。
  • 准备 — 为静态块/字段分配内存,并为静态变量赋予默认值(不是初始值!)。
  • 解析 — 解析类文件中的(符号)引用。

解析:

在链接的解析阶段,类加载器会解析常量池表,这是一个位于.class文件/类对象中的实体,类似于一个符号表,指定了类中的字段/方法/引用。在类文件中,对其他类的引用是以符号方式表示的,没有具体的内存地址来引用。解析会搜索JVM内存,并为那些符号引用分配具体的引用。如果在.class文件中发现了一个尚未加载的类,它会触发该类本身的加载/链接过程,这可能会导致一个递归的加载和链接过程。

在字节码加载和链接之后,类就成功地存储在JVM内存中(将在后面的部分讨论),并准备好初始化。

9. 初始化

当代码中第一次用new关键字或静态字段来引用一个类,或者当程序执行时遇到一个初始化类(比如Main类),则会触发类文件的初始化。

在初始化阶段,执行静态块,静态变量被分配初始值。

10. 运行时内存区域

在上面的段落中,多次提到了将类文件数据存储在JVM内存中。这些数据究竟存储在哪里,来作为加载/链接/初始化的结果?答案是运行时内存区域。

JVM运行时内存区域是指定的内存空间,它被划分为多个部分,用于存储执行相关/类文件相关的数据。

运行时内存区的主要区域如下:

(1) 方法区

方法区是运行时内存的一部分,用于存储与类文件相关的数据。运行时常量池、字段元数据、类元数据、方法元数据和字节码本身等都存储在方法区中。

(2) 程序计数器(PC)

程序计数器是一个小的内存区域,用于存储当前正在执行的操作的地址,这是Java程序执行的必要信息。每个线程都有自己的PC。

(3) 堆

存储所有的类/数组实例,是所有线程共享的一块内存。

(4) JVM栈

保存局部变量和部分结果。包含栈帧。每个线程都有自己的JVM栈。

11. 栈帧

当一个方法被调用时,在栈中创建一个新的帧。它会存储与该方法相关的局部变量和部分结果。如果在该方法内部调用了另一个方法,就会为新调用的方法创建一个新的栈帧。在给定线程中,一次只有一个帧是活动的。

12. 执行

在上面的部分中,简要地介绍了Java源代码是如何编译并加载到JVM运行时内存区域中的。

接下来看看这些数据是如何执行的。

这部分过程是通过JVM的执行引擎来实现的,它由两个主要部分组成:(执行引擎还包括许多其他组件,但在本文中不会提及。)

  • 解释器
  • JIT(即时)编译器

“Java作为一种编程语言,是一种混合的解释和编译语言,也就是说Java代码既要经过编译,又要经过解释。简单来说,当类文件开始运行时,JVM会先用解释器直接执行字节码,不需要编译。这样做的主要好处是可以提高启动速度和执行速度(不用等待编译过程)。

在解释的过程中,JVM会发现代码中的热点和热区,也就是经常执行或者可以优化的代码段。这些代码段会被JIT编译器编译成本地代码,然后执行引擎会从解释模式切换到执行模式。”

这个编译过程有多个层次,称为分层编译。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java是怎么运行起来的?深入理解Java虚拟机

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java是怎么运行起来的?深入理解Java虚拟机

了解JVM是如何支持Java语言和其他相关语言的,对于程序员来说是很有裨益的。本文分享一下Java的工作原理和JVM的内部结构。
Java虚拟机2024-11-30

java虚拟主机运行的原理是什么

Java虚拟主机(JVM)是一个虚拟的计算机,它运行在真实计算机上。JVM可以执行Java字节码文件,将其转换为可执行代码并在操作系统上运行。Java虚拟主机运行的原理如下:1. 通过Java编译器将Java源代码编译成Java字节码文件。
2023-06-12

Java虚拟机的Heap怎么理解

本篇内容介绍了“Java虚拟机的Heap怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java虚拟机中,我是一个位高权重的大管家,
2023-06-02

Java语言的运行机制怎么理解

这篇文章主要介绍“Java语言的运行机制怎么理解”,在日常操作中,相信很多人在Java语言的运行机制怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java语言的运行机制怎么理解”的疑惑有所帮助!接下来
2023-06-02

Java虚拟机中的双亲委派机制怎么理解

Java虚拟机中的双亲委派机制怎么理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类
2023-06-22

常见JAVA虚拟机命令行参数用法是怎么样的

这篇文章将为大家详细讲解有关常见JAVA虚拟机命令行参数用法是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JAVA虚拟机几个命令行参数说明一、运行class文件执行带main方法的
2023-06-17

Java中的JVM是如何实现内存管理的?(请解释Java虚拟机(JVM)如何进行内存分配与回收?)

Java虚拟机(JVM)通过自动内存管理机制,在Java程序运行时管理内存分配和回收。新创建的对象分配到堆内存的年轻代,称为伊甸园,存活时间增长后晋升到幸存者区域,再晋升到年老代。JVM使用不同的垃圾回收器,如标记-清除、复制和标记-整理,清除垃圾对象。此外,JVM还提供其他内存管理机制,如本地内存、栈内存和方法区,确保程序稳定运行。
Java中的JVM是如何实现内存管理的?(请解释Java虚拟机(JVM)如何进行内存分配与回收?)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录