一、初识JVM
1、 JVM
2、 Java VS C++
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
C语言需要自己来分配内存和回收内存,Java全部交给JVM进行分配和回收。
3、Java的跨平台性
Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。
也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”。
只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
4、 字节码
我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。
不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。
5、 虚拟机概念
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
大名鼎鼎的Virtual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
6、JVM的位置
JVM是运行在操作系统之上的,它与硬件没有直接的交互
7、JVM的体系结构
8、JVM的整体结构
- HotSpot VM是目前市面上高性能虚拟机的代表作之一。
- 它采用解释器与即时编译器并存的架构。
- 在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。
- 执行引擎包含三部分:解释器,即时编译器,垃圾回收器
9、JVM生命周期
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
程序开始执行时他才运行,程序结束时他就停止
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程
虚拟机的退出
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统用现错误而导致Java虚拟机进程终止
- 某线程调用Runtime类或System类的exit( )方法,或Runtime类的halt( )方法,并且Java安全管理器也允许这次exit( )或halt( )操作。
- 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。
10、三款JVM虚拟机
HotSpot:
JDK1.3时,HotSpot VM成为默认虚拟机,名称中的HotSpot就是他的热点代码探测技术。
通过计数器找到最具编译价值代码,触发即时编译或栈上替换。通过编译器与解释器协同工作,在优化响应时间和最佳执行性能中取得平衡。
JRockit:
世界上最快的JVM。
专注服务器端应用,不太关注程序启动速度,引起JRockit内部不包括解析器实现,全部代码靠即时编译器编译后执行。
优势:全面的Java运行时解决方案组合。
JRockit Real Time提供毫秒或微秒级的JVM响应时间,适合财务、军事指挥,电信网络的需要。
MissionControl服务套件,极低的开销,来监控、管理和分析生成环境中的应用程序的工具。
JDK8中,在HOTSPOT的基础上,移植JRockit的优秀特性。
IBM J9:
全称:IBM Technology for java Virtual Machine 简称IT4J,内部代号J9。
市场定位与HotSpot接近,服务器端、桌面应用,嵌入式等多用途VM。
TaobaoJVM(补充):
基于OpenJDK开发了自己的定制版本AlibabaJDK。深度定制且开源的高性能服务器版JAVA虚拟机。
GCIH:GC invisible heap,将生命周期较长的Java对象从heap中移到heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率。
GCIH中的对象还能够在多个JAVA虚拟机进程中实现共享。使用crc32指令实现JVM intrinsic降低JNI的调用开销。针对大数据场景的ZenGC。
在阿里产品上性能高,硬件严重依赖intel的CPU,损失了兼容性,但是提高了性能。淘宝、天猫上线,把oracle官方JVM版本全部替换。