JVM虚拟机原理和调优知识大全(2022)

导读:本篇文章讲解 JVM虚拟机原理和调优知识大全(2022),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

JVM虚拟机

一、基础

JVM:JavaVirtualMachine:Java虚拟机

(一)层次关系:

	JDK
		JRE
			JVM
				操作系统

(二)层次作用:

1、Java程序→编译→Java字节码

2、Java字节码→JVM执行→操作系统

	执行java字节码:二进制

3、操作系统→编译→硬件

(三)JVM分类

1、类加载子系统

2、 运行时数据区 [ 栈、堆、方法区 ]

1.方法区

2.堆(heap):线程共享、自动管理

散布:散点
堆:存储单位
区分电脑内存堆
存放内容:实例、new对象实例、this指针、数组
管理:垃圾回收器GC自动内存管理机制

3.栈(stack):顺序队列、自动管理

队列:顺序、连续
栈:运行时单位
区分电脑内存栈
公共基本数据类型:int
java方法——栈帧
压栈(栈帧)——出栈(栈帧)

4.寄存器:线程

指令地址
1个线程——1个寄存器

5.本地方法栈

native关键标注

3、执行引擎(JIT编译器、解释器)

JIT编译器(性能):编译执行
解释器(响应时间):逐行解释字节码

(四)JVM体系结构

1、class文件

入口:编译好字节码文件(编译器前端)

2、类加载子系统

经过:类加载子系统(字节码加载到内存生成class对象)
	加载--->链接--->初始化

3、运行时数据区

4、执行引擎

解释器(解释运行)
jit及时编译器(编译器后端)
垃圾回收器三部分

(五)流程

1、Java代码执行流程

Class文件  →  装载(1) →  类加载器子系统  →  装载(2)  →  运行时数据区
运行时数据区  ↔  执行引擎  ↔  本地方法接口  ↔  本地方法库
运行时数据区  ↔  本地方法接口  ↔  本地方法库

2、Java代码编译执行过程

1.Java字节码生成过程:.class

源代码 →  词法分析器 →  Token流 →  语法分析器 →  语法树/抽象语法树 →  语义分析器 →  注解抽象语法树 →  字节码生成器 →  JVM字节码

2.字节码执行:JVM执行引擎

JVM字节码 →  机器无关优化 →  中间代码 →  机器相关优化  →  中间代码  →  寄存器分配器  →  中间代码  →  目标代码生成器   →  目标代码

(六)JVM生命周期

(七)JVM运行模式

1、Server模式(重量级虚拟机):启动慢

2、Client模式(轻量级虚拟机):启动快

客户端程序

二、类加载:ClassLoader+子类

Bootstrap ClassLoader
Extension ClassLoader
App ClassLoader
Custom ClassLoader

(一)加载:加载

类加载到内存
	1通过一个类的全限定名来获取其定义的二进制字节流
	2将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
	3在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口

(二)连接

1、验证:类(正确性)

检查类的合法性
	文件格式验证
	元数据验证
	字节码验证
	符号引用验证

2、准备:变量(分配空间)

静态变量赋初始值
成员变量赋设定值

3、解析:引用(可选)

符号引用转换为直接引用
常量池内的符号引用替换为直接引用的过程(地址引用)

(三)初始化

静态变量赋设定值
1、父类的静态变量

2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法

(四)使用

(五)卸载

三、类加载器

隐式装载:new
显式装载:class.forName
类:系统类、扩展类、自定义类

(一)分类

1、启动类加载器(引导类加载器):Bootstrap ClassLoader)

2、扩展类加载器:Extension ClassLoader

3、程序类加载器(系统类加载器): Application ClassLoader

4、自定义类加载器:User ClassLoader

(二)类加载机制

1、全盘负责

2、父类委托

3、缓存机制

(三)双亲委派模型

四、类执行:

五、JVM内存管理

(一)线程私有:Thread Local

	程序计数器PC
	栈内存(VM Stack)
		栈帧
		异常
	本地方法栈

(二)线程共享:Thread Shared

1、方法区(永久代)

	运行时常量池

2、堆内存(Heap)

	存储对象或数组
	新生代
	老年代
	异常

(三)直接内存:Direct Memory

不受JVM GC管理

六、线程

(一)守护线程

	gc(垃圾回收机制)
	匿名守护线程

(二)非守护线程(普通线程):

	main函数——java应用——java虚拟机
	main函数1——java应用1——java虚拟机1
	main函数2——java应用2——java虚拟机2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75291.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!