河南省建设行业证书查询网站,生产企业erp管理软件,wordpress 顶部图片,重庆服装网站建设费用1.为什么要学习JVM#xff1f;
未来在工作场景中#xff0c;也许你会遇到以下场景#xff1a;线上系统突然宕机#xff0c;系统无法访问#xff0c;甚至直接OOM#xff1b;线上系统响应速度太慢#xff0c;优化系统性能过程中发现CPU占用过高#xff0c;原因也许是因为…1.为什么要学习JVM
未来在工作场景中也许你会遇到以下场景线上系统突然宕机系统无法访问甚至直接OOM线上系统响应速度太慢优化系统性能过程中发现CPU占用过高原因也许是因为JVM的 GC次数过于频繁新项目上线需要设置JVM的各种参数
2.JDK\JRE\JVM
JDK全称“Java Development Kit”Java开发工具包提供javac编译器、jheap、jconsole等监控工具JRE全称“Java Runtime Environment”Java运行环境提供Class Library 核心类库 JVMJVM全称“Java Virtual Machine”Java虚拟机用于运行Java应用程序 3.Java程序执行过程
1.编译通过javac命令调用JDK编译器将*.java源文件编译成*.class字节码文件。
2.执行通过java命令调用JVM虚拟机执行*.class字节码文件 4.Java程序的跨平台
计算机平台是什么
我们通常把CPU处理器与操作系统构成的系统架构称为计算机平台。
现代的电子计算机是基于二进制设计实现所以CPU仅能识别0与1这样的二进制信号。而计算机程序的本质就是0与1之间的不同组合产生的机器指令交给CPU去执行。CPU为了能识别执行机器指令就需要不同CPU架构和指令集来支持。不同的厂商设计生产的CPUCPU架构和指令集也是不同的。
常见的指令集主要分为精简指令集RISC和复杂指令集CISC。 复杂指令集CISCX86和X64两种CPU架构基于CISC复杂指令集比如Intel、AMD等厂商的CPU。精简指令集RISCARM架构的CPU基于RISC精简指令集比如Compaq的Alpha、HP的PA-RISC、IBM的Power PC、Apple的M1。
在底层硬件及指令集之上需要搭载不同的操作系统用于支持不同的CPU指令集。例如早期的MacOS操作系统只支持Power系列的CPU。最新的MacOS系统只能安装在M1芯片的CPU。
Java是一种跨平台的编程语言主要是为了让相同的Java应用程序代码不用做任何修改可以在不同计算机系统平台上正常运行兼容各种主流操作系统CPU指令集。
跨平台的原因
实现跨平台的原因主要有两个
1不同的平台相同的源代码编译的字节码是相同的所以字节码文件可以在不同平台“通用”
2不同的平台执行字节码时都需要各自的JVM虚拟机版本用于将字节码翻译成当前平台可以执行的机器码指令 5.静态编译器
通过JDK提供的静态编译器将Java源文件编译成字节码文件。
编译过程包括
1词法分析通过空格分隔出源代码中的单词、操作符、控制符等信息将其形成token信息流传递给语法解析器。
2语法分析将token信息流按照Java语法规则组装成一颗语法树
3语义分析对语法树进行关键字使用、类型匹配、作用域等语法检查。
4字节码当语义分析完成后可以生成字节码。 6.字节码
当1个Java源文件被编译后就会按照JVM规范和字节码定义产生1个class字节码文件文件内容由10个固定部分组成。
前4个字节非常特殊红色框的cafe babe是詹姆斯定义的魔法数它的作用是标志当前文件是一个字节码文件。当JVM在进行类加载的Load阶段时如果没有识别到该标志就说明文件不是字节码文件或已损坏则无法进行加载。绿色框代表当前版本号0x34的十进制为52是JDK8的内部版本号代表这个字节码文件基于JDK8编译。
剩余部分中的每个字节均代表一个字节码指令由于每个指令的长度按照1个字节存储所以每个指令被称为字节码BytecodeJava所有的字节码指令有200多个。
由于纯数字的字节码指令阅读比较困难所以JVM在字节码指令的基础上设计了一套操作码助记符使用特殊单词来代替对应的数字指令。
例如
0x15 ILOAD读取int类型的局部变量
0x36 ISTORE保存int类型的局部变量
0x60 IADD执行两个int类型的数值加法运算
0xbb NEW创建对象
0xbc NEWARRAY创建数组
0xac IRETURN返回int类型结果 7.JVM执行方式
JVM执行方式
JVM以解释编译混合模式执行字节码文件。
1JVM的执行方式以解释执行为主。执行过程中JVM将每个字节码文件中的每个指令通过解释器转换成当前平台可以识别的机器码然后交给CPU执行。
2为了提高执行效率JVM还会在运行期间JVM通过热点代码的统计分析识别高频的方法调用循环体、公共模块等当超过阈值时JVM会基于JIT 即时编译器just-in-time compiler将热点代码转换成机器码直接交给CPU执行提高执行效率。
a.Client 模式下默认阈值是 1500 次在 Server 模式下是 10000次。
JVM解释器程序执行的时候解释器首先发挥作用省去了编译器编译时间加快程序的执行效率。JIT编译器在程序运行过程中随着时间的推移JIT开始慢慢发挥了作用把热点代码编译成本地代码后以后执行相同的代码即可直接交给CPU执行带来更高的执行效率。 机器在热机状态可以承受的负载要大于冷机状态刚启动时 如果以热机状态时的流量进行切换可能使处于冷机状态的服务器因无法承载流量而假死。所以在生产环境中发布应用应该以分批的方进行发布根据机器数量划分成多个批次每个批次的机器数大概占到整个集群的15%。
故障案例某应用在线发布新版本采用进行分批发布发布总批数误填写成分为两批发布。如果是热机状态正常情况下集群中的一半的机器可以勉强支撑负载流量但由于刚启动的JVM均是解释执行还没有进行热点代码统计和JIT动态编译导致机器启动之后当前 1/2 发布成功的服务器马上全部宕机。
8.类加载器
字节码必须通过类加载器通过加载、验证、解析等校验步骤将字节码文件中的类加载至JVM的中运行时数据区才可以执行字节码。 9.垃圾收集器
JVM在运行期间通过Garbage Collctor垃圾收集器定期对运行时数据区进行垃圾对象的回收从而实现了内存自动管理。
10.JVM组成结构
JVM由类加载器、运行时数据区、JVM解释器、JIT即时编译器、垃圾回收器、本地方法库等部分组成。
由类加载器完成字节码文件的加载验证和解析存储至运行时数据区并由执行引擎中的解释器完成字节码到机器码的解释执行。同时进行热点代码的统计分析调用JIT即时编译器将字节码直接编译成机器码提高执行效率。JVM运行期间的方法调、数据对象统一存放至运行时数据区。