JVM基础概念
一、JVM概述
1. 为什么要学习JVM?
线上系统突然宕机,系统⽆法访问,甚⾄直接 OOM ;
线上系统响应速度太慢,优化系统性能过程中发现 CPU 占⽤过⾼,原因是因为 JVM 的 GC 次 数过于频繁;
新项⽬上线,需要对JVM的各种参数进行设置;
面对上述实际⼯作中产⽣的问题,都需要对 JVM 有全面的掌握和了解。
1.1. Java 跨平台
Java 是⼀种可以跨平台的编程语⾔,我们通常把 CPU 处理器与操作系统构成的计算机系统整 体成为叫平台。
不同的 CPU ,差异主要在底层指令集不同,指令集分为精简指令集( RISC )和复杂指令集 ( CISC )。每个 CPU 都有自己的特定指令集。
Java 可以跨平台的最主要原因是因为 JVM ,因为不同的平台,使⽤的 JVM 不⼀样。
通常,我们编写的 Java 源代码在编译后会⽣成⼀个 Class ⽂件,称为字节码⽂ 件。 Java 虚拟机负责将字节码⽂件翻译成特定平台下的机器代码,然后运⾏。简单来 讲, Java 的跨平台就是因为不同版本的 JVM 。只要在不同的平台上安装相应的JVM,就可以运 ⾏字节码⽂件( .class )并运⾏我们编写的 Java 程序。
1.2 Java虚拟机
- 虚拟机(Virtual Machine),虚拟计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
- VMware属于系统虚拟机,完全对物理计算机的仿真,提供一个可运行完整操作系统的平台。程序虚拟机的典型代表是java虚拟机,专门为执行某个计算机程序而设计。在java虚拟机中执行的指令称为java字节码指令。
- Java虚拟机是一种执行java字节码文件的虚拟机,它拥有独立的运行机制。
- Java技术的核心就是Java虚拟机,因为所有的java程序都要在java虚拟机内部运行。
- JVM ( Java Virtual Machine )是 Java 平台的基础,它有⾃⼰的指令集,并在运⾏ 时操作不同的内存区域( JVM 内存模型)。 JVM 虚拟机运⾏于操作系统之上,将字节码加载到 J VM 内存模型中,通过解释器将字节码翻译成当前平台 CPU 能识别的机器码⾏。每⼀条 Java 指 令, Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪⾥。
- JVM 是运⾏在操作系统之上的,所以,它与硬件没有直接交互。
1.3 JVM的特点
- 一次编译到处运行;
- 自动内存管理;
- 自动垃圾回收功能;
1.4 JVM整体组成部分
- 类加载器(ClassLoader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
- 本地库接口(Native Interface)
程序在执行之前先要把 java 代码转换成字节码(class 文件),jvm 首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 jvm 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口(NativeInterface) 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。
而我们通常所说的 JVM 组成指的是 运行时数据区(Runtime Data Area) ,因为通常需要程序员调试分析的区域就是“运行时数据区”,或者更具体的来说就是“运行时数据区”里面的 Heap(堆)模块。
1.5Java代码执行流程
JAVA 程序的执行过程简单来说包括:
1. JAVA 源代码编译成字节码;
2. 字节码校验并把 JAVA 程序通过类加载器加载到 JVM 内存中;
3. 在加载到内存后针对每个类创建 Class 对象;
4. 字节码指令和数据初始化到内存中;
5. 找到 main 方法,并创建栈帧;
6. 初始化程序计数器内部的值为 main ⽅法的内存地址;
7. 程序计数器不断递增,逐条执⾏JAVA字节码指令,把指令执⾏过程的数据存放到操作数栈中 (入栈),执行完成后从操作数栈取出后放到局部变量表中,遇到创建对象,则在堆内存中分配 ⼀段连续的空间存储对象,栈内存中的局部变量表存放指向堆内存的引⽤;遇到⽅法调⽤则再创 建⼀个栈帧,压到当前栈帧的上⾯。