JVM 基础知识(基础组成 )

使用场景

  • 线上系统突然宕机,系统无法访问,甚至直接 O0M;
  • 线上系统响应速度太慢,优化系统性能过程中发现 CPU 占用过高,原因也许是因为 JVM的 GC 次数过于频繁;
  • 新项目上线,需要设置 JVM的各种参数;等

JDK / JRE / JVM

JDK 

        JDK 全称 ( Java Development Kit ) ,是 Java 开发工具包,提供 javac 编译器、jheap、jconsole 等监控工具;

JRE

        JRE 全称 ( Java Runtime Environment ),是 Java 运行环境,提供 Class Library 核心类库 + JVM

JVM

        JVM 全称 ( Java Virtual Machine ),Java 虚拟机,用于运行 Java 应用程序。

 

Java 程序执行过程

编译:

        通过 javac 命令。调用 JDK 编译器,将 *.java 源文件 编译 *.class 字节码文件

执行:

        调用 java 命令, 调用 JVM 虚拟机,执行 *.class 字节码文件。

Java 程序跨平台

计算机平台

        计算机平台:CPU 处理器与操作系统构成的系统架构。

        现代的电子计算机是基于二进制设计实现,所以 CPU 仅能识别 θ 与 1 这样的二进制信号。而计算机程序的本质就是 0 与 1 之间的不同组合产生的机器指令,交给CPU去执行。CPU为了能识别执行机器指令,就需要不同 CPU架构和指令集来支持。不同的厂商,设计生产的 CPU, CPU 架构和指令集也是不同的

         常见的指令集主要分为:精简指令集( RISC)和复杂指令集( CIS()。

  • 复杂指令集(CISC):X86 和X64 两种 CPU 架构基于CISC复杂指令集,比如:Intel、AMD 等厂商的 CPU。
  • 精简指令集(RISC):ARM 架构的CPU基于 RISC 精简指令集,比如:Compaq 的 Alpha 、HP 的 PA-RISC、IBM 的 Power PC、Apple的M1。

        在底层硬件及指令集之上,需要搭载不同的操作系统,用于支持不同的 CP U 指令集。例如:早期的MacOS 操作系统只支持 Power 系列的 CPU。最新的Macos 系统只能安装在M1 芯片的 CPU。
        Java 是一种跨平台的编程语言,主要是为了让相同的 Java 应用程序代码,不用做任何修改,可以在不同计算机系统平台上正常运行,兼容各种主流操作系统+ CPU 指令集。

跨平台原因

  • 不同的平台,相同的源代码,编译的字节码是相同的,所以字节码文件可以在不同的平台"通用";
  • 不同的平台,执行字节码时,都需要各自的 JVM 虚拟机版本,用于将字节码文件翻译成当前平台可以执行的机械码指令;

 

静态编译器 

通过 JDK 提供的静态编译器,将 Java 源文件编译成字节码文件。

编译过程包括:

  • 词法分析:通过空格分隔出源代码中的单词、操作符、控制符等信息,将其形成 token 信息流,传递给语法解析器。
  • 语法分析:将 token 信息流按照 Java 语法规则,组装成一颗语法树
  • 语义分析:对语法树进行关键字使用、类型匹配、作用域等语法检查。
  • 字节码:当语义分析完成后,可以生成字节码。

字节码

        当1个 Java 源文件被编译后,就会按照 JVM 规范和字节码定义,产生1个class 字节码文件,文件内容由 10 个固定部分组成。

        前 4 个字节非常特殊,红色框的 cafe babe 是詹姆斯定义的魔法数,它的作用是标志当前文件是一个字节码文件。当 JVM在进行类加载的Load 阶段时,如果没有识别到该标志,就说明文件不是字节码文件或已损坏,则无法进行加载。绿色框代表当前版本号,0x34 的十进制为 52,是JDK8的内部版本号,代表这个字节码文件基于 JDK8 编译。

        剩余部分中的每个字节均代表一个字节码指令,由于每个指令的长度按照 1 个字节存
储,所以每个指令被称为字节码(Bytecode),Java 所有的字节码指令有 200 多个。

        由于纯数字的字节码指令阅读比较困难,所以 JVM 在字节码指令的基础上设计了一套操作码助记符,使用特殊单词来代替对应的数字指令。

例如:

        0x15      ILOAD : 读取 int 类型的局部变量

        0x36      ISTORE : 保存int类型的局部变量

        0x60      IADD : 执行两个 int 类型的数值加法运算

        0xbb      NEW : 创建对象

        Oxbc      NEWARRAY : 创建数组

        Oxac      IRETURN : 返回 int 类型结果

JVM 执行方式 

        JVM 以解释+编译混合模式,执行字节码文件。

        1. JVM 的执行方式以解释执行为主。执行过程中,JVM将每个字节码文件中的每个指令,通过解释器转换成当前平台可以识别的机器码,然后交给 CPU执行。

        2. 为了提高执行效率,JVM还会在运行期间,JVM通过热点代码的统计分析,识别高频的方法调用,循环体、公共模块等,当超过阈值时,JVM会基于 JIT 即时编译器 (just-in-time compiler)将热点代码转换成机器码,直接交给 CPU执行,提高执行效率。

        Client 模式下默认阈值是 1500 次,在 Server 模式下是 10000 次。

JVM 解释器:程序执行的时候,解释器首先发挥作用,省去了编译器编译时间,加快
程序的执行效率。
JIT 编译器:在程序运行过程中,随着时间的推移,JIT 开始慢慢发挥了作用,把热点代码编译成本地代码后,以后执行相同的代码,即可直接交给 CPU 执行,带来更高的执行效率。

         机器在热机状态可以承受的负载要大于冷机状态(刚启动时),如果以热机状态时的流量进行切换,可能使处于冷机状态的服务器因无法承载流量而假死。所以,在生产环境中发布应用,应该以分批的方进行发布,根据机器数量划分成多个批次,每个批次的机器数大概占到整个集群的 15%。

        故障案例:某应用在线发布新版本,采用进行分批发布,发布总批数误填写成分为两批发布。如果是热机状态,正常情况下,集群中的一半的机器可以勉强支撑负载流量,但由于刚启动的 JVM 均是解释执行,还没有进行热点代码统计和J动态编译,导致机器启动之后,当前 1/2 发布成功的服务器马上全部宕机。

类加载器

        字节码必须通过类加载器,通过加载、验证、解析等校验步骤,将字节码文件中的类,加载至 JVM 的中运行时数据区,才可以执行字节码 

 

垃圾收集器

        JVM 在运行期间,通过 Garbage Collctor 垃圾收集器,定期对运行时数据区进行垃圾对象的回收,从而实现了内存自动管理。

JVM 组成结构

        JVM 由类加载器、运行时数据区、JVM解释器、JIT 即时编译器、垃圾回收器、本地方法库等部分组成。

        由类加载器完成字节码文件的加载验证和解析,存储至运行时数据区,并由执行引擎中的解释器,完成字节码到机器码的解释执行。同时进行热点代码的统计分析,调用 JIT 即时编译器将字节码接编译成机器码,提高执行效率。JVM运行期间的方法调、数据对象统一存放至运行时数据区。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react + antDesign封装图片预览组件(支持多张图片)

需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕,那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相,短短数月,Ray-Ban Meta 就突破百万销量,不仅让马…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的,当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的,需要解压缩即可安装。 3、重启浏览器,再次点击扩展程序即…

解密 Python 的 staticmethod 函数:静态方法的全面解析!

更多Python学习内容:ipengtao.com 在 Python 中,staticmethod 函数是一种装饰器,用于将函数转换为静态方法。静态方法与实例方法和类方法不同,它们不需要类实例作为第一个参数,也不需要类作为第一个参数,因…

微型丝杆的行业应用!

微型丝杆作为一种高精度、小尺寸的机械传动元件,在现代工业中扮演着重要角色,在多个行业中都有广泛的应用‌,主要包括以下几个方面: 1、医疗设备:在手术机器人中,微型丝杆能够实现精准定位和操作&#xff0…

二叉树进阶

目录 1. 二叉搜索树实现 1.1 二叉搜索树概念 2.2 二叉搜索树操作 ​编辑 ​编辑 2.3 二叉搜索树的实现 2.3.0 Destroy() 析构 2.3.1 Insert()插入 2.3.2 InOrder() 打印搜索二叉树 ​编辑​编辑 2.3.3 Find() 查找 …

GaussDB关键技术原理:高弹性(五)

书接上文GaussDB关键技术原理:高弹性(四)从扩容流程框架方面对hashbucket扩容技术进行了解读,本篇将从日志多流和事务相关方面继续介绍GaussDB高弹性技术。 目录 4.2 日志多流 4.2.1 日志多流总体流程 4.2.2 基线数据传输 4.…

fiddler抓包07_抓IOS手机请求

课程大纲 前提:电脑和手机连接同一个局域网 (土小帽电脑和手机都连了自己的无线网“tuxiaomao”。) 原理如下: 电脑浏览器抓包时,直接就是本机网络。手机想被电脑Fiddler抓包,就要把Fiddler变成手机和网络…

PMP与CMMI:两种管理方法的对比

PMP与CMMI:两种管理方法的对比 PMP:专注于项目管理CMMI:组织过程改进的框架总结:互补而非替代 在现代企业管理中,项目管理和组织能力成熟度模型集成(CMMI)是两个经常被提及的概念。虽然它们都是…

vue3中echarts柱状图横轴文字太多放不下怎么解决

问题:在做数据展示的时候,使用的是echarts,遇到了个问题,就是数据过多,但是设置的x轴的文字名称又太长,往往左边第一个或右边最后一个的名称展示不全,只有半个。 从网上找到了几种办法&#xff…

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142454993 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…

Vue74 路由的props配置

笔记 ​ 作用:让路由组件更方便的收到参数 {name:xiangqing,path:detail/:id,component:Detail,//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件// props:{a:900}//第二种写法:props…

edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]

文章目录 edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞环境0x03 漏洞复现1.访问漏洞环境2.构造POC3.复现edu某智慧平台 ExpDownloadService.aspx接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

统信服务器操作系统进入【单用户模式】

统信服务器操作系统D版、E版、A版进入单用户模式的方式。 文章目录 前言一、问题现象二、问题原因三、解决方案1. D版问题解决方案2. E版及A版问题解决方案前言 D版又称企业版、E版又称欧拉版、A版又称龙蜥版。 单用户模式主要是在 grub2 引导时编辑内核引导,一般用于修改用…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢? 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模…

英伟达:AI时代的领跑者,引领智能计算的未来@附149页PDF文件下载

在人工智能的浪潮中,英伟达(NVIDIA)以其卓越的GPU技术,成为了这个时代的领跑者。从游戏显卡的霸主到AI计算的领导者,英伟达的转型之路充满了创新与突破。今天,我们将深入探讨2024年英伟达如何通过其战略布局…

Apache CVE-2021-41773 漏洞攻略

漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者可利⽤该路径穿越漏洞读取到Web⽬录之外的其他⽂件在…

DPDK 简易应用开发之路 2:UDP数据包发送及实现

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 发送数据包的通用步骤 初始化DPDK环境&#xff1a; 调用 rte_eal_init() 来初始化DPDK的EAL&#xff08;环境抽象层&#xff09;&#xff0c;这是所有DPDK应用程序的第一步&#xff0c;用于初始化硬件、内存和逻辑核…

[Linux]:线程(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 初识线程 1.1 线程的概念 在操作系统中&#xff0c;进程与线程一直是我们…

简单了解Redis(初识阶段)

1.认识Redis 对于Redis有一个很重要的点就是&#xff0c;它存储数据是在内存中存储的。 但是对于单机程序&#xff0c;直接通过变量存储数据的方式是更优的&#xff0c;在分布式系统下 Redis才能发挥威力 因为进程是有隔离性的&#xff0c;Redis可以基于网络&#xff0c;把进…