深入拆解 Java 虚拟机-打卡|01 | Java代码是怎么运行的?

news2024/12/23 11:04:17

文章目录

  • Java代码是怎么运行的?
    • 几个为什么
      • 为什么在虚拟机中运行?
      • Java 虚拟机具体又是怎样运行 Java 代码的呢?
      • Java虚拟机的运行效率怎么样?
    • 总结

Java代码是怎么运行的?

来来来,运行个"Hello word !“告诉我是怎么运行的?
看似这个很简单的问题,就像1+1=2一样,很是轻蔑,听老师讲当时陈景润研究了好长时间,也有说是罗素证明出来,还有说从来没有证明出来过,但不管怎么样这些由它去吧,运行"Hello word !” 就是麻雀虽小五脏俱全,一个简单流程,包括了所有的,我们继续回归Java是怎么运行的,我个人理解是这样的
编写代码–>JDK编译成字节码–>JVM解析字节码–>机器指令–>输出设备展示。
跟郑老师学习深入拆解JVM中,郑老师的开篇又是一个小故事,幽默但不偏离主题,说到海关问一个教授的问题,来引出对Java是什么运行的提问。
Java有很多种运行方式

  • 在工具中运行
  • 双击jar文件运行
  • 命令的方式运行
  • 甚至在网页中运行

均需满足有JRE的Java运行环境

再说说JRE
JRE(Java Runtime Environment)Java运行环境,包括Java程序的必须组件、Java虚拟机、以及核心类库等。JDK(Java Development Kit)Java开发工具和JRE的区别是,JDK包括JRE,JDK中还有开发、诊断工具,就是JDK包含JRE。

其中还提到的了C++的运行方式,C++是不需要额外的运行时,直接往往把代码直接编译成CPU所理解的代码,也就是机器码,所以C++没有很好的快平台性,Java就有跨平台性,因为JVM搞定了环境系统的差异。

几个为什么

  • 为什么 Java 要在虚拟机中运行呢?
  • Java 虚拟机具体又是怎样运行 Java 代码的呢?
  • 它的运行效率又如何呢?

Java是门高级语言,语法非常复杂,抽象程度很高,直接在机器上运行肯定是不可能的,运行起来是要过一番转换的。

语言的演变
二进制–>汇编语言–>高级语言

为什么在虚拟机中运行?

怎么转换呢?
Java源文件–>字节码–>在JVM上运行
因为字节码是底层的,是指令的操作码,被固定为一个字节,这也是字节码的由来。

JVM也可以由硬件实现,但更常见的是window、Linux、mac系统上提供软件实现的。这么做的好处是编译成字节码就直接在JVM上运行,也就是我们经常说的"一次编译,到处运行"。

JVM另外的一个好处是它带来了一个托管环境(Managed Runtime),能处理一些冗长容易出错的部分,其中最广为人知的就是内存管理和垃圾回收,这部分催生了一波垃圾回收调优的业务。嘿嘿,没有伤害就没有买卖。

托管环境还提供了诸如,数据越界、动态类型、安全权限等等的动态检测,使得我们免于书写这些无关的业务逻辑代码。都封装好了,我们只管用就好了,这让我想起来超市的模式,超市就是托管模式,商贩们提供卖东西的服务,就是正常的方法,其他的经营由超市管理人员来管理,商贩拿个摊位费。感觉就是编写代码的人,只管买卖东西,啥垃圾清扫啥的不需要顾客问,费用包含在商品里了,比喻虽然不恰当,但有相似之处 。

咱不熟悉X86咱也不明白这个如果你熟悉 X86 的话,你会发现这和段式内存管理中的代码段类似。而且,Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。
Java 虚拟机还将栈细分为面向Java方法的Java方法栈,面向本地方法的本地方法栈(用C++ 写的native方法),存放线程执行位置信息的地方是PC寄存器,寄存器是存放指令集的数据。
Java虚拟机结构
在运行过程中,每当调用进入一个Java方法,虚拟机会在当前线程的Java方法栈中生成一个栈帧,用于存局部变量以及字节码的操作数,这个栈帧的大小是提前分配好的,而且Java虚拟机不要求栈帧在内存空间连续分布。

Java 虚拟机具体又是怎样运行 Java 代码的呢?

退出执行方法
不论正常返回,还是异常返回,Java虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。
字节码执行
Java字节码是无法直接执行,Java虚拟机需要将字节码翻译成机器码。
怎么编译?
以HotSpot为例

  1. 解释执行,即逐条将字节码翻译成机器码并执行;
  2. 即时编译(Just-In-Time compilation ,JIT),将一个方法总包含字节码编译成机器码后再执行。
    解释和编译执行

两者的差别对比,前者的优势在于无需等待编译,而后者的优势在于速度更快。HotSpot默认采用的是混合编译的模式,综合了解释执行和即时编译两者的优点。先解释执行字节码,然后复制执行热点代码,以方法为单位进行即时编译。优点中西合璧的感觉,取其精华去其糟粕。

Java虚拟机的运行效率怎么样?

HotSpot采用多种技术来提升启动性能以及峰值性能,即时编译就是其中一种提升性能的方式。
二八定律也可以称为帕累托法则,事物的主要结果只取决于一小部分因素,这里也试用,20%的代码,占据了80%的计算资源。对大部分不常用的代码使用解释执行的方式进行,对于仅占据小部分热点的热点代码可以采用编译成机器码,以达到理想的运行速度。

理论上讲,即时编译后的 Java 程序的执行效率,是可能超过 C++ 程序的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。据说交易系统的实现和编写都是使用C++,相对的C++速度较快,但最近出现了GoLang,据说很多大厂都将Java代码的功能使用Go进行重构,作为Java程序员心里老慌了,但学好JVM进行优化,我们将代码优化,可能依然是Go取代不了的。

虚拟方法居然是面向对象语言多态性的,对于一个虚方法调用,尽管它有很多个目标方法,但在实际运行过程中它可能只调用其中一个,这个信息便可以被即时编译器所利用,来规避虚方法调用的开销,从而达到比静态编译的 C++ 程序更高的性能。这点是之前从来没有接触过的,听君一席话胜读十年书的感觉油然而生。

HotSpot内置编译器

  1. C1 Client编译器,面向的是对启动性能有要求的客户端GUI程序,采用的优化手段简单,编译时间较短
  2. C2 Server 编译器,面向的是对峰值性能有要求的服务器端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高
  3. Graal Java 10中正式引入的实验性即时编译器

从Java 7开始,HotSpot默认采用分层编译方式:热点方法首先会被C1编译,而后的热点方法中的热点会进一步的被C2编译。

这编译来编译去的,影响正常应用程序运行吗?HotSpot的即时编译是放在额外的编译线程中进行的,这当然不影响应用进程。HotSpot会根据CPU的数量设置编译线程的数目,并按照1:2的比例给到C1和C2编译器。
如果计算资源充足,字节码解释执行和即时编译同时进行,编译后的机器码会在下次调用该方法时启用,来替换原来的解释行。

总结

java的运行经过几个阶段,编译、运行,运行在虚拟机上的优点是"一次编译,导出运行",的便捷性,虚拟机不仅提供字节码的运行环境和提供代码托管的环境,处理一些冗长且容易报错的事务,内存管理等。
Java虚拟机分为5个区,方法区、堆、PC寄存器、Java方法栈、本地方法栈,class字节码文件首先加载到虚拟机的方法区,才能在JVM中运行。

为了执行效率,HotSpot采用的混合执行的策略,首先采用的解释执行的方式,后续热点代码将采用即时编译进行以方法为单位的。


此文章为 4 月 Day18 学习笔记,内容来源于极客时间链接: 《深入拆解 Java 虚拟机》如果想学Java虚拟机的强烈推荐该课程!

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

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

相关文章

免费的VR全景网站是什么?免费VR全景网站有什么用?

虚拟现实(VR)技术的应用日益广泛,尤其是在旅游、教育等领域。免费VR全景网站是一个新兴的平台,为用户提供了一个全新的探索未知世界的方式。 一、介绍免费VR全景网站的特点 1.全景视角 免费VR全景网站提供了360度全景视角&#…

Spring事务原理、隔离性

1、什么是事务 事务是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事务执行成功,则在该事物中进行的所有数据更改均会提交,成为数据库中的永久组成部分;如果事务执行时遇到错误且必须取消或回滚,则数据将…

Vue3页面内跳转锚点-scrollIntoView()

scrollIntoView() scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。 element.scrollIntoView(); // 等同于element.scrollIntoView(true)element.scrollIntoView(alignToTop); //布尔参…

数据结构-树与二叉树

文章目录5.1 树的基本概念5.1.1 树的定义5.1.2 基本术语5.1.3 树的性质5.2 二叉树的概念5.2.1 二叉树的定义及其主要特性5.2.2 二叉树的存储结构5.3 二叉树的遍历和线索二叉树5.3.3 二叉树的遍历5.3.2 线索二叉树5.4 树、森林5.4.1 树的存储结构5.4.2 树、森林、二叉树的转换5.…

Linux学习笔记——HTTP协议

文章目录前言HTTP协议的概念URLurlencode和urldecodeHTTP协议格式HTTP协议版本HTTP协议请求方法GET方法——获取资源POST方法——获取资源PUT方法——传输⽂件PUT方法——获得报文首部在这里插入图片描述DELETE方法——删除文件OPTIONS方法——询问支持的方法HTTP的状态码HTTP常…

050:cesium加载mapbox卫星地图、mapbox地形地图

第050个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载mapbox卫星地图、mapbox地形地图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共79行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设…

【CE】图形化作弊教程通关手册(超真实的游戏体验)

▒ 目录 ▒🛫 导读需求开发环境1️⃣ 第一关翻译操作总结2️⃣ 第二关(代码共享)翻译操作验证3️⃣ 第三关翻译操作总结🛬 文章小结📖 参考资料🛫 导读 需求 除了Tutorial-x86_64.exe教程外,CE…

算法,离你并不遥远

算法,离你并不遥远引子什么是算法?为什么算法很重要?什么时候开始学算法?狭隘的算法定义算法从现在学起,从现在用起算法永不过时引子 今天又是搬砖摸鱼胡混的一天,在问答闲逛,看到了一个问答&a…

Linux多线程-2

“我是我境遇里的起步者。” -- 里尔克《布里格手记》 在上一节Linux多线程当中,我们讲述了Linux中线程的概念以及线程的控制内容。这一篇博客承接上次内容,我们来对线程安全进行阐述。 目录 1.线程安全 1.1互斥的实现 1.1.1互斥锁实现互斥 1.1.2互…

启动 Ethereum(上海) 主网全节点

问题描述 采用最新的geth版本之后,按照之前的方法启动geth主网节点会出现如下问题: Post-merge network, but no beacon client seen. Please launch one to follow the chain!问题原因 The above message is emitted when Geth is run without a conse…

PyTorch深度学习实战 | 神经网络的优化难题

即使我们可以利用反向传播来进行优化,但是训练过程中仍然会出现一系列的问题,比如鞍点、病态条件、梯度消失和梯度爆炸,对此我们首先提出了小批量随机梯度下降,并且基于批量随机梯度下降的不稳定的特点,继续对其做出方…

SpringBoot集成Dubbo启用gRPC协议

文章目录前言项目结构代码示例父工程api moduleservice module注意事项区别本文记录下SpringBoot集成Dubbo启用gRPC协议,以及与原生 gRPC 在代码编写过程中的区别。 下面还有投票,帮忙投个票👍 前言 Dubbo 在 2.7.5 版本开始支持原生 gRPC 协…

【软件测试】浅了解什么是软件测试及开发测试模型

目录 1.什么是软件测试? 2.什么是需求? 3.什么是测试用例 4.什么是软件错误(bug)? 5.开发模型和测试模型 5.1软件的生命周期 5.2瀑布模型 5.3螺旋模型 5.4软件测试V模型 5.5软件测试w模型 6.软件测试的生命周…

Redis第二十九讲 Redis集群发布订阅模式以及Redis集群事务

Redis集群状态下的发布订阅 在Redis的几个基本数据结构介绍中,有讲过List数据结构,可以使用List的阻塞特性实现订阅消费,关于Redis的底层数据结构可以参考我的这篇博客:Redis第六讲 Redis之List底层数据结构实现 底层数据结构基本操作可以看我的这篇博客,Redis第十五讲 R…

【从零到Offer】- 泛型

泛型是个啥 ​ Java 泛型是 JDK 5 中引入的一个新特性,其提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 ​ 通过将数据类型参数化&#xf…

用opencv+playwright过滑动验证码

目录 梳理思路 编写代码 总结与提高 在本节,我们将使用opencv和playwright这两个库通过QQ空间的滑动验证码。 梳理思路 1. 使用playwright打开浏览器,访问qq空间登录页面。 2. 点击密码登录。 3. 输入账号密码并点击登录。 4. 出现滑动验证码图片后…

大型语言模型综述,非常详细,格局打开!A Survey of Large Language Models

大型语言模型综述,非常详细,格局打开!A Survey of Large Language Models 返回论文和资料目录 论文地址 项目地址 1.导读 讲得通俗易懂,且格局拉满!基本覆盖了自ChatGPT以来的AI比较火的事件,还多次提到…

AI 模型首次有了国家标准!头部大厂参与编制,辐射 AMD

3月17日,国内首个面向人工智能生成式模型的国家标准正式公开,并向社会征求意见。 该标准全称为《信息技术神经网络表示与模型压缩第一部分:卷积神经网络》 (GB/T 42382.1-2023&a…

【Linux系统下安装JDK】

一,linux下载JDK最方便快捷的方式:yum 1,执行下方命令,查看可安装java版本。 yum -y list java*2,选择一个进行安装,带-devel的安装的是jdk,而不带-devel的安装的是jre 3,安装命令…

【springBoot篇1】概念、创建和运行

目录 一、什么是springBoot?为什么要学springBoot springBoot的优点:(5点) 优点1:快速集成框架 优点2:内置了Tomcat容器 优点3:快速部署项目 优点4:少配置,多注解 优点5:支持更…