jvm学习

2026-01-12  本文已影响0人  放羊娃华振

目录

  1. JVM 概述
  2. 字节码指令详解
  3. Java 虚拟机参数详解
  4. JVM 性能调优工具
  5. JHSDB 工具详解
  6. 实践案例
  7. 总结

JVM 概述

Java 虚拟机(Java Virtual Machine,JVM)是 Java 程序运行的核心组件。它是一个抽象的计算机,具有指令集并使用虚拟机的实例来执行 Java 字节码。JVM 的主要特点包括:

JVM 内存结构

JVM 内存主要分为以下几个区域:

字节码指令详解

Java 源代码经过编译后会生成字节码(bytecode),字节码是 JVM 的指令集。以下是常见的字节码指令分类:

1. 加载和存储指令

这些指令用于在局部变量表和操作数栈之间传输数据:

2. 运算指令

用于数值计算:

3. 类型转换指令

4. 对象创建和访问指令

5. 方法调用和返回指令

6. 控制转移指令

7. 异常处理指令

8. 同步指令

Java 虚拟机参数详解

Java 虚拟机提供了大量的启动参数来配置 JVM 的运行行为,主要分为以下几类:

1. 标准参数(Standard Options)

这些参数在所有 Java 实现中都必须支持:

2. 非标准参数(Non-Standard Options)

这些参数以 -X 开头:

3. 高级参数(Advanced Options)

这些参数以 -XX 开头:

堆内存相关参数

性能调优相关参数

4. 参数示例

java -Xms2g -Xmx4g -XX:NewRatio=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar

JVM 性能调优工具

JVM 提供了多种性能调优和诊断工具,帮助开发者分析和优化 Java 应用程序的性能。

1. jps(JVM Process Status Tool)

显示当前系统中所有 Java 进程的信息:

jps -l  # 显示主类完整路径
jps -v  # 显示 JVM 参数
jps -m  # 显示传递给主类的参数

2. jstat(JVM Statistics Monitoring Tool)

监控 JVM 统计信息:

jstat -gc <pid> 1000    # 每秒显示 GC 统计信息
jstat -gccapacity <pid> # 显示 GC 容量信息
jstat -class <pid>      # 显示类加载统计信息

3. jinfo(JVM Configuration Information Tool)

查看和修改 JVM 参数:

jinfo -flag <flag> <pid>     # 查看指定参数值
jinfo -flag +<flag> <pid>    # 启用参数
jinfo -flag -<flag> <pid>    # 禁用参数
jinfo -flags <pid>           # 显示所有参数

4. jstack(JVM Stack Trace Tool)

生成 Java 进程的堆栈跟踪:

jstack <pid>                 # 生成线程堆栈
jstack -l <pid>              # 包含锁信息

5. jmap(JVM Memory Map Tool)

生成堆内存映射信息:

jmap -heap <pid>             # 显示堆内存详细信息
jmap -histo <pid>            # 显示堆中对象统计信息
jmap -dump:format=b,file=<filename> <pid>  # 生成堆转储文件

JHSDB 工具详解

JHSDB(Java HotSpot Debugger)是 JDK 9+ 中引入的命令行调试工具,用于分析 JVM 进程的内部状态,特别是在 JVM 崩溃或挂起时。

1. 启动 JHSDB

jhsdb jstack --pid <pid>     # 生成线程堆栈
jhsdb clhsdb --pid <pid>     # 启动 CLHSDB(命令行 HSD)
jhsdb hsdb --pid <pid>       # 启动图形化 HSDB

2. 使用 CLHSDB

CLHSDB 提供了命令行界面来查看 JVM 内部信息:

# 查看内存布局
mem <address> <size>

# 查看对象
inspect <address>

# 查看 OOPMap
oopmap <thread>

# 查看符号表
symbols

# 查看类加载器
classloader

3. 查看 JVM 内存分配

通过 JHSDB 可以查看 JVM 中的具体内存分配情况:

# 查看堆内存使用情况
jhsdb jmap --heap --pid <pid>

# 查看具体的对象分布
jhsdb jmap --histo --pid <pid>

实践案例

案例 1:内存泄漏分析

  1. 使用 jmap -histo 查看对象统计信息
  2. 生成堆转储文件 jmap -dump
  3. 使用 JHSDB 分析内存使用情况

案例 2:GC 性能优化

  1. 监控 GC 行为:jstat -gc <pid> 1000
  2. 分析 GC 日志,识别频繁的 GC 事件
  3. 调整堆大小参数和 GC 算法

案例 3:死锁检测

  1. 使用 jstack 生成线程堆栈
  2. 分析线程状态,识别死锁情况
  3. 定位死锁代码位置

总结

JVM 是 Java 程序运行的基础,理解 JVM 的工作原理对于 Java 开发者至关重要。本文介绍了:

  1. JVM 基础概念:内存结构、运行机制
  2. 字节码指令:了解 Java 代码如何转换为 JVM 指令
  3. JVM 参数:配置 JVM 行为和性能调优
  4. 性能工具:jps、jstat、jinfo、jstack、jmap 的使用
  5. JHSDB 工具:深入分析 JVM 内部状态

掌握这些知识有助于:

参考文章

哔哩哔哩老师讲的jvm:
https://www.bilibili.com/video/BV11S4y1W7dJ?p=4&spm_id_from=333.880.my_history.page.click&vd_source=09ca3e9049c99f913df3c91ce6d7564a

字节码指令:
https://cloud.tencent.com/developer/article/1333540

java的参数oracle官方文档:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

jvm 性能调优工具之 jinfo:
https://www.jianshu.com/p/8d8aef212b25

JHSDB-查看jvm中的内存具体分配
参考:https://www.jianshu.com/p/42cbfc44d70a

上一篇 下一篇

猜你喜欢

热点阅读