当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-09-25 10:39:30 429观看
导读Java虚拟机(JVM)是一个运行时环境,可以执行用Java编程语言编写的程序。Java语言是一种高级语言,它通过抽象和封装的机制,让开发者可以专注于业务逻辑和功能实现,而不用关心底层的细节。因此,运行/开发Java程序时,不必深入了解

Java虚拟机(JVM)是一个运行时环境,可以执行用Java编程语言编写的程序。Java语言是一种高级语言,它通过抽象和封装的机制,让开发者可以专注于业务逻辑和功能实现,而不用关心底层的细节。因此,运行/开发Java程序时,不必深入了解Java程序的执行过程或JVM的内部原理。对于大多数开发者来说,JVM就像一个神奇的盒子,能够帮助他们实现功能和完成任务。tWy28资讯网——每日最新资讯28at.com

但是,了解JVM是如何支持Java语言和其他相关语言的,对于程序员来说是很有裨益的!tWy28资讯网——每日最新资讯28at.com

图片tWy28资讯网——每日最新资讯28at.com

上面代码会把一个给定的Java文件编译成.class文件,其中包含bytecode。如果源代码有错误,编译会失败并报出编译错误。tWy28资讯网——每日最新资讯28at.com

你可以使用提供的工具javap来查看已创建的类文件,以了解类文件的内部情况。tWy28资讯网——每日最新资讯28at.com

javap HelloWorld.class

4. 执行

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

java HelloWorld

首先JVM需要获取.class文件,并将它加载到JVM的内存区域中。这个初始过程是通过JVM类加载器来实现的。tWy28资讯网——每日最新资讯28at.com

5. 什么是类加载?

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

JVM中有三种类型的类加载器,分别是:tWy28资讯网——每日最新资讯28at.com

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

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

扩展类加载器的职责是加载lib/ext目录下的类,这些类可能包括我们在代码中使用的任何扩展。tWy28资讯网——每日最新资讯28at.com

应用类加载器是三种中最常用的一种,它负责加载用户定义的类。它会扫描我们程序的类路径,并加载其中的类。tWy28资讯网——每日最新资讯28at.com

6. 类加载过程

类加载过程有两个主要步骤:tWy28资讯网——每日最新资讯28at.com

  • 加载
  • 链接

7. 加载

在加载过程中,类加载器读取类文件的二进制表示形式,即.class文件,并在JVM的运行时内存中创建它的表示。这个表示称为Class Object,它位于JVM内存的方法区中。tWy28资讯网——每日最新资讯28at.com

8. 链接

在加载过程之后,开始链接。链接有三个步骤。tWy28资讯网——每日最新资讯28at.com

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

tWy28资讯网——每日最新资讯28at.com

解析:tWy28资讯网——每日最新资讯28at.com

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

在字节码加载和链接之后,类就成功地存储在JVM内存中(将在后面的部分讨论),并准备好初始化。tWy28资讯网——每日最新资讯28at.com

9. 初始化

当代码中第一次用new关键字或静态字段来引用一个类,或者当程序执行时遇到一个初始化类(比如Main类),则会触发类文件的初始化。tWy28资讯网——每日最新资讯28at.com

在初始化阶段,执行静态块,静态变量被分配初始值。tWy28资讯网——每日最新资讯28at.com

10. 运行时内存区域

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

JVM运行时内存区域是指定的内存空间,它被划分为多个部分,用于存储执行相关/类文件相关的数据。tWy28资讯网——每日最新资讯28at.com

运行时内存区的主要区域如下:tWy28资讯网——每日最新资讯28at.com

(1) 方法区tWy28资讯网——每日最新资讯28at.com

方法区是运行时内存的一部分,用于存储与类文件相关的数据。运行时常量池、字段元数据、类元数据、方法元数据和字节码本身等都存储在方法区中。tWy28资讯网——每日最新资讯28at.com

(2) 程序计数器(PC)tWy28资讯网——每日最新资讯28at.com

程序计数器是一个小的内存区域,用于存储当前正在执行的操作的地址,这是Java程序执行的必要信息。每个线程都有自己的PC。tWy28资讯网——每日最新资讯28at.com

(3) 堆tWy28资讯网——每日最新资讯28at.com

存储所有的类/数组实例,是所有线程共享的一块内存。tWy28资讯网——每日最新资讯28at.com

(4) JVM栈tWy28资讯网——每日最新资讯28at.com

保存局部变量和部分结果。包含栈帧。每个线程都有自己的JVM栈。tWy28资讯网——每日最新资讯28at.com

11. 栈帧

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

12. 执行

在上面的部分中,简要地介绍了Java源代码是如何编译并加载到JVM运行时内存区域中的。tWy28资讯网——每日最新资讯28at.com

接下来看看这些数据是如何执行的。tWy28资讯网——每日最新资讯28at.com

这部分过程是通过JVM的执行引擎来实现的,它由两个主要部分组成:(执行引擎还包括许多其他组件,但在本文中不会提及。)tWy28资讯网——每日最新资讯28at.com

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

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

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

这个编译过程有多个层次,称为分层编译。tWy28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11280-0.htmlJava是怎么运行起来的?深入理解Java虚拟机

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 八个从Java 11到Java17中的功能提升

下一篇: Python中map函数的高级技巧:优化你的编程体验

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top