文章目录
前言
随着公司越来越卷,及公司线上服务需要学习和应用一些jvm相关的指令及知识,下面是我总结的一些JVM知识的基础,后期也会慢慢更新后续。
参考:尚硅谷在哔哩哔哩的JVM系列视频大家可以边看边学。
一、JVM基础理论
1.java虚拟机根本不关心运行在其内部的程序到底是何种语言编写的,它只关心字节码文件。也就是说java虚拟机拥有语言无关性,并不会单纯的与java进行终身绑定,只要其他的编程语言满足并包含java虚拟机的内部指令集、符号以及辅助信息,他就是一个有效的字节码文件,就能被java虚拟机识别并装载运行。
2.java语言虽然不是最强的编程语言,但是jvm虚拟机是最强的虚拟机。
3.jvm可以实现多种语言混合编程,也成为主流,特定的场景特定的语言来进行解决,java语言的虚拟机向多语言虚拟机进行发展。
4.推荐书籍《自己动手写java虚拟机》。
5.2000年正式发布HotSpot虚拟机。
6.虚拟机和java虚拟机的区别,虚拟机简称VM就是一台虚拟的计算机,是一个对物理计算机的仿真被称为系统虚拟机,java虚拟机时程序虚拟机,专门为执行单个计算机程序而设计。
7.jvm虚拟机带来了跨平台性,优秀的垃圾回收器,以及可靠的及时编译器。java的核心技术就是Java虚拟机内部。
8.java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释编译为对应平台上的机器指令执行。
9.java虚拟机在实际计算机的位置关系:
特点:
- 一次编译,到处运行
- 自动内存管理机制
- 自动垃圾回收功能
- java虚拟机的位置关系
二、JVM整体结构
1.结构图
1.上层class files --> 类装载子系统(加载–>链接–>执行) --> 运行时数据区 --> 执行引擎(解释器–>编译器–>垃圾回收器)
三、JVM代码执行流程
JAVA虚拟机是基于栈的指令集架构
基于栈架构的特点:
- 设计和实现简单,使用资源受限制的系统
- 避开寄存器的分配难题,使用零指令的方式分配(学习过硬件的同学都知道分配寄存器很困难)
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈,指令集小,编译器容易实现
- 不需要硬件支持,更容易实现跨平台
基于寄存器架构的特点:
- 比如传统PC以及Andriod的Davlik虚拟机
- 指令架构完全依赖于硬件,可以执行差(与硬件设备耦合较高)(换个硬件寄存器地址不一样了)
- 性能优秀,执行高效(直接和硬件做沟通)
- 花费更少的指令完成操作
四、JVM生命周期
1.虚拟机执行启动:
java虚拟机启动是通过引导类加载器(用于加载核心类库,整体由C++实现集成在JVM内部)创建一个初始类完成的,这个类是由虚拟机的具体实现指定的。
2.虚拟机执行:
- 一个运行中的JAVA虚拟机有着一个清晰的任务:执行JAVA程序
- 程序开始执行它才运行,程序结束他就停止
- 执行一个所谓的JAVA程序的时候,真真整整在执行的是一个叫做JAVA虚拟机的进程
3.虚拟机退出:
- 程序正常执行结束
- 程序在执行过程中遇到异常错误终止
- 由于操作系统出现错误终止
- 线程调用RunTime和System的exit方法结束进程,RunTime的halt方法
五、常见虚拟机种类
1.HotSpot虚拟机:
1.最初由一名为Longview Technologies 的小公司设计
2.1997年此由被sun收购 2009年sun公司被甲骨文收购
热点代码探测技术:
- 通过计数器找到最具价值代码,触发及时编译或栈上替换
- 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡
JIT编译器是编译全部,解释器是一行一行进行编译虚拟机是两者结合使用
2.BEA公司的JRockit
- 专注于服务器端应用,不关注程序启动速度,因此jrockit内部不包含解释器时间,全部代码都靠即时编译器编译后执行
- JRockit是世界上最快的JVM虚拟机
- 2008年被Oracke收购
- Mission Control服务套件,以极低开销来监控、管理分析生产环境中的应用程序工具目前java虚拟机也存在
3.IBM的J9
- 市场定位与HotSpot接近,服务器端、桌面应用,嵌入式等用途
- 2017年,IBM发布了开源J9 VM,命名为OpenJ9,交给了Eclipse基金会管理,也称为Eclipse OpenJ9.
总结
大家看完对一些不是很清楚是很正常的,概念性的理论读一读就好,主要是一些能理解的东西,需要多记一下,下篇会将类加载子系统就是我们类加载的过程,包括常说的双亲委派机制,还有运行时数据区,线程、计数器、栈、局部变量表等等
关注我让你学到更多实战的骚操作