JVM (一)内存与垃圾回收|JVM概述
2020-05-26 本文已影响0人
TiaNa_na
本文主要是JVM的总体概述。
目录
1 基本概念
2 JVM整体结构
3 JVM代码执行流程
4 JVM架构模型
5 JVM的生命周期
1 基本概念
- 虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。
- 大体上,虚拟机可分为系统虚拟机(如VMware)和程序虚拟机(如java虚拟机)。
- JVM是运行在操作系统之上的,并没有和硬件有直接的交互.
- JVM特点:一次编译,到处运行;自动内存管理,自动垃圾回收
跨平台的语言java和跨语言的平台jvm
a.一次编译,到处运行:我们编写的程序是以.java结尾的源文件,经过编译生成字节码文件,所有平台的jvm都遵守jvm的规范,故字节码文件可以在不同的平台上解释运行。
java-跨平台的语言
b.Java虚拟机根本不关心运行在其内部的程序到底是何种编程语言编写的,它只关心"字节码"文件
jvm-跨语言的平台
不同的JVM体系架构都会有所不同,我的JVM系列文章均围绕Hotspot 虚拟机来讲
。
2 JVM整体结构
JVM的内部体系结构分为三部分,分别是:类装载器子系统,运行时数据区,和执行引擎。
- 类装载器子系统:将字节码装载到内存中,生成class对象
- 运行时数据区:在内存中,多线程共享堆和方法区,对java虚拟机栈,本地方法栈和程序计数器来说,每个线程独有一份。
-
执行引擎:分为解释器、JIT编译器、垃圾回收器,有将高级语言翻译成机器语言的作用
JVM整体结构
3 JVM代码执行流程
- 先把 Java 代码编译成字节码,也就是把 .java 类型的文件编译成 .class 类型的文件。这个过程的大致执行流程:Java 源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字符码生成器 -> 最终生成字节码,其中任何一个节点执行失败就会造成编译失败;
-
Java 虚拟机使用类加载器(Class Loader)装载 class 文件;
类加载完成之后,会进行字节码效验,字节码效验通过之后 JVM 解释器会把字节码翻译成机器码交由操作系统执行。但不是所有代码都是解释执行的,JVM 对此做了优化,比如,以 Hotspot 虚拟机来说,它本身提供了 JIT(Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译为机器码。
java代码执行流程
4 JVM架构模型
- java编译器输入的指令流基本上是一种
基于栈的指令架构
,另一种指令架构是基于寄存器的指令架构
。 -
由于跨平台的设计,java的指令都是根据栈来设计的
,不同平台CPU架构不同,所以不能设计为基于寄存器的。
栈:跨平台性、指令集小、指令多;执行性比寄存器差
寄存器:指令集架构完全依赖硬件,可移植性差;性能优秀,执行高效
5 JVM的生命周期
①启动
通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
② 执行
- 一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;
- 程序开始执行的时候他才运行,程序结束时他就停止;
- 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
③ 退出
- 程序正常执行结束
- 程序异常或错误而异常终止
- 操作系统错误导致终止
- 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
- 除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况