JVM 概述
JVM 即 Java 虚拟机,是运行 Java 字节码的虚拟计算机,也是 Java 程序的运行环境。其设计基于平台无关性理念,通过抽象硬件细节,让 Java 程序能在任意操作系统上运行,实现“一次编写,到处运行”,显著降低软件开发与维护成本。

JVM 虚拟机的组成
组成部分 | 说明 |
---|---|
堆 | 用于存储对象实例,是垃圾回收的主要区域,可分为新生代(使用复制算法)和老年代(使用标记 – 清除、标记 – 整理算法) |
方法区(元空间) | 存储已被虚拟机加载的类信息、常量、静态变量等 |
栈(线程) | 每个线程都有一个私有的栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息 |
本地方法栈 | 与栈类似,但为本地方法服务 |
程序计数器 | 指示当前线程所执行的字节码的行号指示器 |
栈帧组成
栈帧包含局部变量表、操作数栈、动态链接、方法出口,具体如下:
– 局部变量表:用于存储方法参数和局部变量。
– 操作数栈:在方法执行过程中,用于存储操作数和计算结果。
– 动态链接:将符号引用转换为直接引用。
– 方法出口:记录方法执行完毕后返回的位置。
对象组成
对象由对象头、实例数据和对齐填充组成:
– 对象头:包括 Mark Word、Klass Pointer 类型指针和数组长度(如果是数组对象)。
– 实例数据:存储对象的实际数据。
– 对齐填充:保证对象的大小为 8 个字节的整数倍。
分代收集
堆分为新生代和老年代:
– 新生代:使用复制算法进行垃圾回收,将新生代划分为一个 Eden 区和两个 Survivor 区,每次只使用 Eden 区和一个 Survivor 区,当进行垃圾回收时,将存活的对象复制到另一个 Survivor 区。
– 老年代:使用标记 – 清除、标记 – 整理算法进行垃圾回收。标记 – 清除算法先标记出需要回收的对象,然后进行清除;标记 – 整理算法在标记 – 清除的基础上,对存活的对象进行移动和整理,避免内存碎片。
常见垃圾回收器
CMS(Concurrent Mark Sweep)
执行过程包括初始标记、并发标记、重新标记、并发清理、并发重置:
– 初始标记:标记 GC Roots 能直接关联到的对象,速度较快。
– 并发标记:从 GC Roots 开始对堆中对象进行可达性分析,找出存活对象,此过程与用户线程并发执行。
– 重新标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,停顿时间比初始标记稍长,但远比并发标记短。
– 并发清理:清除标记为垃圾的对象,与用户线程并发执行。
– 并发重置:重置 CMS 算法相关的数据结构,为下一次垃圾回收做准备。
G1(Garbage First)
执行过程包括初始标记、并发标记、最终标记、筛选回收:
– 初始标记:标记 GC Roots 能直接关联到的对象,需要停顿线程,但耗时很短。
– 并发标记:从 GC Roots 开始对堆中对象进行可达性分析,找出存活对象,与用户线程并发执行。
– 最终标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,比 CMS 的重新标记更复杂,停顿时间也更长。
– 筛选回收:根据各个 Region 的回收价值和成本进行排序,选择回收价值最大的 Region 进行回收,可与用户线程并发执行。
常用 JVM 分析工具
- Jstack:用于查看线程的运行情况,可帮助分析线程死锁、线程阻塞等问题。
- Jstat:用于查看垃圾回收情况,可提供堆内存各区域的使用情况、垃圾回收次数、垃圾回收时间等信息。
数据库锁查询方法
在数据库中,可通过以下 SQL 语句查询锁相关信息:
-- 查询是否锁表
SHOW OPEN TABLES WHERE in_use>0;
-- 查询进程
SHOW PROCESSLIST;
-- 查询正在锁的事务
SELECT * FROM information_schema.`INNODB_LOCKS`;
-- 查询等待锁的事务
SELECT * FROM information_schema.`INNODB_LOCK_WAITS`;
类加载机制
类加载过程包括加载、验证、准备、解析和初始化,采用双亲委派加载机制,即类加载器在加载类时,先委托给父类加载器尝试加载,如果父类加载器无法加载,再由自身加载。常用的类加载器有启动类加载器、扩展类加载器和应用程序类加载器,分别加载不同类型的类。
性能调优
性能调优部分更偏向应用,需要掌握 JVM 优化参数的作用、参数调优的依据,以及常用的 JVM 分析工具能分析哪些问题和使用方法。例如,通过调整堆内存大小、新生代和老年代的比例等参数,可提高程序的性能。
编译器优化和执行模式
编译器优化包括 javac 的编译过程、AST 抽象语法树、编译器优化和运行器优化。执行模式有解释模式、编译模式和混合模式,各有优缺点。Java 7 提供了分层编译技术,JIT 即时编译技术和 OSR 栈上替换,C1 编译器针对客户端模式,C2 编译器针对 server 模式,C2 优化更激进。
原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/142