JVM详解(一)-- JVM与Java体系结构
本章思维导图
一、Java和JVM
1.1 JVM是java体系的基石
- JDK 包含 JRE,JRE 包含 JVM。
- 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 基本概念
- 虚拟机。分为系统虚拟机(VM ware)和程序虚拟机(JVM,安卓的Dalvik)。
- Java虚拟机。执行字节码的虚拟机,对字节码有一套规范。具有动态内存分配、垃圾回收机制。
- 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自己的计算机,通用性较差。
- Java的虚拟机JVM详解
- Java HotSpot JVM内存管理之详解
- Java_JVM参数详解
- jvm体系结构-方法区详解
- 堆栈及Java堆栈与JVM堆栈中的设计原理详解
- JVM内存中String分配详解(Java)
- JVM内存管理之JAVA语言的内存管理详解
- JAVA 内存详解 (理解 JVM 如何使用 Windows 和 Linux 上的本机内存)
- JAVA深度剖析之JVM的体系结构
- [java] 虚拟机(JVM)底层结构详解[转]
- Java 执行过程详解 - JVM 生命周期
- Java中JVM虚拟机详解
- Java JVM 工作原理详解
- Java VisualVM监控远程JVM(详解)
- jvm详解-java源码编译
- java之jvm学习笔记二(类装载器的体系结构)
- JVM详解之Java垃圾回收机制详解和调优
- Java HotSpot JVM内存管理之详解
- Java HotSpot JVM内存管理之详解
- JVM详解之Java垃圾回收机制详解和调优