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

我们一起聊聊 JVM 是如何执行Java程序的

来源: 责编: 时间:2024-09-10 09:42:15 221观看
导读前言如果你对JVM一知半解,如果你想了解JVM的工作流程,如果你知道一些JVM面试题却无法将知识点串联起来,那么这篇文章非常适合你。从面试题说起这些面试题Javaer们应该都很熟悉,但是你知道这些面试题的背后吗?你知道类加载

前言

如果你对JVM一知半解,如果你想了解JVM的工作流程,如果你知道一些JVM面试题却无法将知识点串联起来,那么这篇文章非常适合你。aFq28资讯网——每日最新资讯28at.com

从面试题说起

这些面试题Javaer们应该都很熟悉,但是你知道这些面试题的背后吗?aFq28资讯网——每日最新资讯28at.com

  • 你知道类加载机制吗?
  • 什么是双亲委派机制?
  • 介绍一下JVM内存区域划分
  • 堆为什么要分代设计?
  • 什么是内存的担保机制?
  • 为什么Eden:S0:S1 比例是8:1:1?
  • 描述一下对象内存分配过程
  • 如何判断对象已死?
  • 讲一讲内存模型?
  • 常用的JVM调优参数有哪些?
  • 常用的垃圾回收算法有哪些?
  • 常用的垃圾收集器有哪些?
  • ......

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

如果你总是背了又忘,忘了又背,归根结底,还是对JVM没有一个系统的认识。aFq28资讯网——每日最新资讯28at.com

那么希望通过这篇文章,可以为你构建一个连贯的JVM框架。aFq28资讯网——每日最新资讯28at.com

JVM做了哪些事?

众所周知,高级编程语言编写的程序,最终要转化为机器码,才可以在计算机上运行。aFq28资讯网——每日最新资讯28at.com

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

“翻译”的工作

我们在编写完一段Java代码后,如果想要运行它,需要通过Java编译器,将其编译为JVM认识的字节码文件。aFq28资讯网——每日最新资讯28at.com

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

然后执行Java命令,这段代码就会通过JVM运行。aFq28资讯网——每日最新资讯28at.com

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

不仅仅“翻译”

在这个过程中,JVM就充当了转换的角色,负责将字节码,翻译成对应平台上的机器指令。这样的话,Java程序就可以在任何安装了JVM的平台上运行。这就是Java语言一次编写到处运行的跨平台特性。aFq28资讯网——每日最新资讯28at.com

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

翻译字节码的工作,是由JVM的执行引擎完成。aFq28资讯网——每日最新资讯28at.com

在将字节码翻译为机器指令之前,JVM还有一个非常重要的工作,那就是将字节码文件中的二进制数据准确的加载到JVM中。这个工作是由JVM的类加载系统完成,aFq28资讯网——每日最新资讯28at.com

另外,为了在运行时方便管理内存,JVM定义了一个专门的区域,也就是大名鼎鼎的运行时数据区。aFq28资讯网——每日最新资讯28at.com

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

所以,类加载系统、运行时数据区、执行引擎,就构成了JVM平台。aFq28资讯网——每日最新资讯28at.com

接下来,看一下它们是如何工作的。aFq28资讯网——每日最新资讯28at.com

在这之前,要对字节码现有一个认识,毕竟它贯穿了Java代码运行的整个流程。aFq28资讯网——每日最新资讯28at.com

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

Java虚拟机对Java编程语言一无所知,只知道一种特定的二进制格式,即类文件格式。类文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。aFq28资讯网——每日最新资讯28at.com

JVM 各部件如何协同工作?

类加载器先工作

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

类加载系统目的很明确,就是将字节码文件中的二进制数据准确地加载到JVM,从Class文件加载到内存 & 对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java使用类型aFq28资讯网——每日最新资讯28at.com

执行Java命令后,Java虚拟机启动,类加载系统就开始工作了。aFq28资讯网——每日最新资讯28at.com

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

类加载系统首先会读取指定的类文件,并遵循双亲委派机制进行加载。aFq28资讯网——每日最新资讯28at.com

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

然后将文件中的常量池、字段、方法和指令等数据加载到JVM内存的共享区域方法区中。aFq28资讯网——每日最新资讯28at.com

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

然后对其进行验证,目的是为了确保类的正确性。比如版本号为52或更高时,不应该存在这个版本不支持的指令。aFq28资讯网——每日最新资讯28at.com

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

或者标识类文件的魔术数字是不是cafebabe,这些完整性的检查和约束都是非常有必要,就像我们自己开发的应用,也不可能随便让别人访问一样。aFq28资讯网——每日最新资讯28at.com

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

验证完成后,在方法区为类的静态变量分配内存并设置默认值。aFq28资讯网——每日最新资讯28at.com

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

紧接着,将常量池中表示对象的符号引用,指向到实际的内存地址,也就是直接引用。aFq28资讯网——每日最新资讯28at.com

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

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

什么是符号引用呢?aFq28资讯网——每日最新资讯28at.com

符号引用是常量池中的类、方法、字段等指向的目标在字节码文件中的静态表示,当JVM运行时,需要将目标的静态表示转换成实际的内存指针,也就是直接引用。在这个例子中,如果JVM需要加载Object这个类,它会查找常量池中的#3(Class类型,指向#27),然后解析#27中的字符串java/lang/Object/为实际的类文件路径,并加载这个类。aFq28资讯网——每日最新资讯28at.com

最后执行静态代码块,为静态变量设置初始值,类加载工作就算完成了。aFq28资讯网——每日最新资讯28at.com

整个加载过程就是面试被经常问到的类加载机制。aFq28资讯网——每日最新资讯28at.com

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

那么问题来了:静态变量为什么要先设置默认值,再设置初始值,知道的评论区留言。aFq28资讯网——每日最新资讯28at.com

执行引擎开始工作

执行引擎工作模式

静态代码块被执行时,执行引擎就会处理这些指令。执行引擎有两种工作模式:aFq28资讯网——每日最新资讯28at.com

  • 解释执行
  • 即时编译

解释执行就是每次执行都会逐行解释字节码指令aFq28资讯网——每日最新资讯28at.com

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

即时编译是将热点代码,编译成当前平台的机器码,并缓存下次就可以直接执行机器码,这样就可以提高执行效率。aFq28资讯网——每日最新资讯28at.com

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

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

JVM通常采用解释器与即时编译器并存的混合模式。在程序启动时,解释器可以立即发挥作用,省去编译时间;随着程序运行时间的推移,JIT编译器逐渐发挥作用,将越来越多的热点代码编译为本地机器码,以提高执行效率。aFq28资讯网——每日最新资讯28at.com

Main方法什么时候被执行?

静态代码块执行完成后,JVM会继续调用main方法。如果执行Java命令的字节码文件中没有main方法,JVM就会报错,这个是JVM规范。aFq28资讯网——每日最新资讯28at.com

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

运行时数据区域开始工作

执行引擎工作期间,会和运行时数据区域有大量的交互。aFq28资讯网——每日最新资讯28at.com

线程私有的空间

调用main方法时,会创建一个线程并在运行时数据区中分配线程私有的空间:栈帧以及程序计数器。aFq28资讯网——每日最新资讯28at.com

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

程序计数器初始时会指向第一条指令, 然后随着指令的执行而递增。aFq28资讯网——每日最新资讯28at.com

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

执行静态变量赋值的指令时,会把整数推送到栈帧中的操作数栈,随后赋值给静态变量。aFq28资讯网——每日最新资讯28at.com

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

在执行创建一个Object实例的指令时,如果Object Class未被加载,类加载器会启动加载过程。然后在堆中分配一块内存并初始化实例。aFq28资讯网——每日最新资讯28at.com

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

大名鼎鼎的堆内存

分配内存这个过程,就涉及到“堆内存分代设计”、“对象内存分配过程”、“内存分配方式”等知识点了。aFq28资讯网——每日最新资讯28at.com

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

如果对象过多导致空间不足,JVM就会通过垃圾回收来释放一些空间。“如何确定对象是垃圾”、“使用哪个垃圾回收器”、“用了什么回收算法”就需要我们去了解。aFq28资讯网——每日最新资讯28at.com

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

实例初始化后,会将对象的引用存储到局部变量表中。这样的话,线程就可以通过引用访问到该对象。aFq28资讯网——每日最新资讯28at.com

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

就这么一直工作

后续的代码会延续这个流程,该加载类的加载类、该翻译指令的翻译、该分配内存的分配、该回收垃圾的回收,直到Java虚拟机停止工作。aFq28资讯网——每日最新资讯28at.com

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

本文链接:http://www.28at.com/showinfo-26-112701-0.html我们一起聊聊 JVM 是如何执行Java程序的

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

上一篇: 三年Golang码农,竟然不知道New和Make有什么区别?

下一篇: Asp.Net Core实战-Swagger接口文文档

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top