JVM 基础知识(基础组成 )

news2024/12/23 16:05:20

使用场景

  • 线上系统突然宕机,系统无法访问,甚至直接 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运行期间的方法调、数据对象统一存放至运行时数据区。

 

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

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

相关文章

Git 使用方法

简介 Git常用命令 Git 全局设置 获取Git 仓库 方法二用的比较多 将仓库链接复制 在 git base here ----> git clone 仓库链接 工作区、暂存区、版本库 Git 工作区中文件中的状态 本地仓库的操作 远程仓库操作 git pull 将代码推送到远程仓库 1. git add 文件名 ---放…

C++:继承和多态,自定义封装栈,队列

1.栈: stack.cpp #include "stack.h"Stack::Stack():top(nullptr),len(0){} //析构函数 Stack::~Stack() {while(!empty()){pop();} }bool Stack::empty() //判断栈是否为空 {return topnullptr; }int Stack::size()//获取栈的大小 {return len; } //压…

万字长文详解Java线程知识

什么是进程、线程、协程? 进程 进程是计算机科学中的一个核心概念,它指的是在操作系统中正在执行的一个程序的实例。进程是操作系统中的一个独立执行单元,具有独立的内存空间和系统资源。每个进程都有自己独立的地址空间和文件描述符&#x…

循环神经网络笔记

循环神经网络学习 RNN训练方法–BPTT BPTT (Backpropagation Through Time),这是一种用于训练循环神经网络(RNNs)的算法。由于 RNNs 能够处理序列数据,并且在每个时间步上都有内部状态,因此需…

南京自闭症寄宿学校:打造温馨的第二家

南京自闭症寄宿学校的愿景与广州星贝育园的温馨实践 在探讨自闭症儿童教育的广阔领域中,寄宿制学校以其独特的优势,为这些特殊的孩子提供了全方位的支持与关怀,致力于打造一个温馨如家的第二生活环境。虽然本文的主题是围绕南京自闭症寄宿学…

Chirp通过Sui让IoT世界变得更简单

据估计,未来十年内,联网设备的数量将增长到近400亿台。无论是追踪共享出行车辆的移动、改善食品追溯性、监控制造设施,还是保障家庭安全,物联网 ( Internet of Things,IoT) 对企业和消费者来说都已经成为一项关键技术。…

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥,不想老是浪费时间了,所以刷多少题我就会写多少题解,使用nss随机刷题,但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

什么是竞争条件?

竞争条件,简单来说就是多个进程同时访问同一个共享资源,导致出现预期结果以外的错误的情况。 出现竞争条件的本质原因是cpu对程序的调度是没有特定规律的,某一时刻cpu处理哪个进程是不确定的。 简单写一个测试程序,先需要子进程和…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

手机轻松解压 RAR 文件指南

手机通常不直接支持 RAR 文件打开,主要有以下几个原因。首先,手机操作系统的设计初衷并非为了处理各种复杂的压缩文件格式。 大多数手机内置的文件管理器主要侧重于管理手机内部存储和常见的文件类型,如图片、音频、视频等。对于像 RAR 这样…

【UR #1】外星人(dp思维技巧)

考虑去除后效性,常用方法排序状态可以直接以答案为状态来判断合法性考虑转移方向,向后转移,选与不选来定向答案 f[i][j]表示前i个数答案为j的方案数 不选i 则加上f[i][j] 的方案数 * (n-i),ai可以在后面随便选。 选…

Python 课程20-Scikit-learn

前言 Scikit-learn 是 Python 中最流行的机器学习库之一,它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者,都可以借助它进行快速原型设计和模型开发。 在本教程中&a…

为何专利对企业创新与竞争至关重要?

在当今这个技术飞速发展的时代,每一个创新的火花都可能成为推动行业进步的关键力量。然而,创新并非一蹴而就,它需要时间、资金与智慧的共同投入,更需要一套完善的保护机制来确保其成果不被轻易窃取或模仿。这一重任,便…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器,框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)

医护人员排班系统目录 目录 基于springboot医护人员排班系统设计与实现 一、前言 二、系统功能设计 三、系统实现 医护类型管理 排班类型管理 科室信息管理 医院信息管理 医护信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示: 五、核心代码…

“AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战

近日,由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的“AI Security”系列第 3 期技术沙龙:“AI 安全智能体,重塑安全团队工作范式”活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 在活动中…

shell中对xargs命令传参进行编辑

以文件解压为例,将当前路径下的所有gz文件解压到同名的log文件中,解压命令如下所示: ls *.gz| xargs -n 1 -P 4 -I {} bash -c zcat "{}" > $(echo "{}" | sed "s/gz$/log/g") 执行结果如下图所示&#x…

mamba-yolo模型的深度学习环境配置

本文将介绍如何配置目标检测模型mamba-yolo的深度学习环境 1. 环境要求 Python > 3.9 (本文使用python-3.11) CUDA > 11.6 (本文使用CUDA-11.8) Pytorch > 1.12.1 (本文使用torch-2.4.0) Linu…

【C++】STL标准模板库容器——set

🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌关联式容器set(集合)简介 📌set(集合)的使用 🎏set(集合)的模板参数列表 🎏set(集合)的构造函数 🎏set(集合)的迭代…

JavaScript异步编程:async、await的使用

async 和 await 是在 ECMAScript 2017 (ES7) 中引入的特性,用于处理异步操作。它们允许你以一种更加简洁和同步的方式来编写异步代码。 async 函数表示它会返回一个 Promise,而 await 关键字用于等待一个 Promise 解决。 关于 promise 的详细介绍&#…