您的位置:首页 > 编程语言 > Java开发

JVM详解(一)-- JVM与Java体系结构

2020-11-01 11:40 2041 查看

本章思维导图

一、Java和JVM

1.1 JVM是java体系的基石

  1. JDK 包含 JRE,JRE 包含 JVM。
  2. JVM(java virtual machine)是虚拟计算机,用于执行字节码文件。JRE(java runtime environment)是 java 运行时环境,包含了 JVM 和 java 核心基础类库(JDBC,lang and util)。 JDK(java development kit)是 java 开发运行环境,包含了 JRE,同时还包含了编译 java 源码的 javac (或称为前端编译器)和用于 java 程序调试分析的工具(JConsole,visualVM等)等。

基于 JVM 聊一下 java 与 C++ 的区别 JVM 具有自动内存分配的功能和垃圾回收机制,而C++需要自己管理内存和自己回收内存。 虽然Java工程师不需要直接与内存分配、垃圾回收打交道,但学习JVM的这些机制对于设计高扩展性应用和诊断运行问题有重要意义。

1.2 跨平台特性

1.2.1 java是跨平台的语言

java通过在不同平台上根据 JVM 规范实现不同的 JVM 实现了 “java 的跨平台”。 注:java 是跨平台的,JVM 不是跨平台的。

1.2.2 JVM是跨语言的平台

JVM 只关心字节码文件,字节码文件使得在JVM上进行多语言或者编程成为现实。

二、JVM介绍

2.1 基本概念

  1. 虚拟机。分为系统虚拟机(VM ware)和程序虚拟机(JVM,安卓的Dalvik)。
  2. Java虚拟机。执行字节码的虚拟机,对字节码有一套规范。具有动态内存分配、垃圾回收机制。
  3. JVM的位置--JVM是运行在操作系统之上的。

2.2 整体架构

2.2.1 Java执行流程

如下图

javac :称为前端编译器。 高级语言翻译成机器指令的过程是由执行引擎完成的

2.2.2 JVM的指令集

指令集架构有两种

  • 基于栈的指令集架构。设计和实现更简单,适用于资源受限的系统;零地址指令方式分配指令;指令集小,同样的操作需要的指令多;可移植性好,跨平台性。
  • 基于寄存器的指令集架构:性能优秀、执行高效;同样的操作需要的指令少;完全依赖硬件,可移植性差。

比如同样实现“2+3”,指令实现为:

// 基于栈的指令集架构:
iconst_2
istore_1 // 2入栈
iconst_3
istore_2 // 3入栈
iload_1
iload_2  // 2和3出栈
iadd     // 2 + 3
istore_3 // 结果5入栈
return
// 基于寄存器的指令集架构
mov eax, 2 //将eax寄存器设为2
add eax, 3 //将eax寄存器的值加3

java反编译的命令

// 先要cd 到需要反编译的文件路径下
javap -v 文件名.class

2.2.3 JVM的生命周期

  • 启动:通过引导类加载器(bootstrap classloader)创建一个初始类(Init Class)来完成的,这个初始类是由具体 JVM 的实现来指定的。
  • 运行:一个运行中的 JVM 有一个清晰的任务-执行程序,程序开始执行时 JVM 运行,程序结束时 JVM 停止,执行程序时,真正执行的是一个叫做 JVM 的进程。
  • 退出:a.程序正常执行结束 b.程序在执行时遇到了异常或错误而异常终止 c.由于操作系统出现错误而导致JVM异常终止 d.某线程调用 Runime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,Runtime 类是单例,对应于 JVM 的“运行时数据区” e.JNI(java 本地接口)规范描述了使用 JNI API 时 JVM 的退出情况。

三、JVM的发展历程

3.1 Classsic VM

第一款商用JVM;只提供解释器,若需使用JIT(即时编译器)编译器,需外挂,二者不能配合工作;Hotspot内置了Classic VM。

即时编译器可以使得程序在执行期间的速度加快,那为什么不只用即时编译器?

将字节码指令翻译成机器指令时是需要花费时间的,如果将所有代码都使用即时编译器编译并缓存(而不是选择热点代码),会导致程序在最初启动时会有“卡顿”印象,影响整体的执行速度。 解释器(逐行解释),响应快,但会重复解析热点代码;即时解释器,响应慢,但对热点代码可缓存。

3.2 Hotspot VM

服务端、客户端、移动端都有应用。JDK8中默认使用的 JVM。

hotspot 为何叫 hotspot?

“热点代码探测技术”:通过计数器找到最具编译价值的代码,触发即时编译或栈上替换;编译器(负责执行性能)和解释器(负责响应时间)协同工作,在最优化的程序响应时间和最佳的执行性能中取得平衡。

3.3 JRockit

专注于服务端。不关注程序的启动速度(响应时间),因此没有解释器的实现,全部代码都由即时编译器编译后执行。是世界上最快的JVM。

3.4 J9

市场定位与hotspot接近,但适用于IBM自己的计算机,通用性较差。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: