JDK自带工具解析与生产问题定位指南(一)
1. 引言
Java开发工具包(JDK)内置了强大的诊断工具集,用于监控、分析和调试Java应用程序。这些工具涵盖了从进程管理、内存分析到性能监控的各个方面。本文将介绍一些最常用的Java开发工具,包括jps、jmap、jstat、jcmd、jstack、jvisualvm等,并提供它们的具体应用场景及使用方法,来帮助开发者快速定位运行时问题。
JDK诊断工具全解析与实战指南
一、核心命令行工具详解
1. 进程管理工具 jps
场景
jps
是Java自带的一个命令行工具,用于显示当前系统中所有Java应用程序的简要信息。它对于快速获取运行中的Java进程ID(PID)及其主类名非常有用,尤其是在需要连接到特定进程进行进一步分析或管理时。
使用方法
- 查看所有Java进程的基本信息:只需简单地执行
jps
命令。 - 获取更详细的信息:可以通过添加参数如
-l
来显示完整包路径的主类名,-m
来查看传递给main
方法的参数,或者-v
来查看传递给JVM的选项。在Linux系统中,常使用ps -ef | grep java
来过滤出所有包含“java”字符串的进程的详细信息。有了jps
可以精确地定位到特定的Java应用程序的进程。如果只是为了查java程序的进程号,jps -l
可能会更加简洁的列出你想查找的内容。
jps -q # 仅显示进程ID(PID)
jps -l # 显示完整包路径
jps -v # 显示JVM启动参数
jps -m # 显示main方法参数
参数 | 功能说明 | 示例 |
---|---|---|
-q | 只显示 PID | jps -q → 38721 |
-m | 显示 main 方法参数 | jps -m → 38721 MyApp arg1 |
-l | 显示完整包名/jar路径 | jps -l → com.example.Main |
-v | 显示 JVM 参数 | jps -v → -Xmx1024m |
-V | 显示 JVM 参数(不包含应用参数) | jps -V → -XX:MaxPermSize=256m |
2. 内存分析工具 jmap
场景
jmap
用于生成Java堆的快照(heap dump),这对于诊断内存泄漏等问题至关重要。此外,它还可以显示Java进程的内存映射或共享对象统计信息。
使用方法
- 创建堆转储文件:
jmap -dump:format=b,file=heap.bin <pid>
,其中<pid>
为Java进程ID。 - 查看对象分配直方图:
jmap -histo <pid>
可以列出每个类实例的数量和总大小。
1. 标准参数
jmap [option] <pid>
参数 | 功能说明 | 注意事项 |
---|---|---|
-heap | 显示堆内存分布 | 可能导致服务暂停 |
-histo[:live ] | 对象内存直方图统计 | live 参数触发 Full GC |
-clstats | 类加载器统计(JDK8+) | 需要 attach 权限 |
-finalizerinfo | 显示等待 finalization 的对象 | 输出信息有限 |
-dump: | 生成堆转储文件 | 示例:format=b,file=heap.bin |
2. 堆转储选项
jmap -dump:live,format=b,file=heap.hprof 38721
选项 | 说明 |
---|---|
live | 只转储存活对象 |
format=b | 二进制格式(必须) |
file= | 输出文件名 |
compression=6 | 压缩级别(0-9,JDK13+) |
3. 线程分析工具 jstack
场景
jstack
用来生成Java进程的线程转储,这有助于理解程序在某一时刻的线程状态,主要用于捕获线程执行堆栈 、诊断死锁/CPU热点 。 对于排查死锁、响应慢等问题特别有效。
使用方法
- 打印线程转储:
jstack <pid>
直接输出线程转储信息到标准输出。 - 将线程转储保存到文件:
jstack <pid> > thread_dump.txt
jstack -l <pid> # 显示锁附加信息
jstack -F <pid> # 强制生成线程快照(用于挂起进程)
jstack -m <pid> # 混合模式(显示Java和Native栈帧)
参数 | 功能说明 | 使用场景 |
---|---|---|
-F | 强制生成线程快照 | 进程无响应时使用 |
-l | 显示锁信息(长格式) | 分析死锁必备 |
-m | 混合模式(显示 native 栈) | JNI 调用问题分析 |
-J | 传递参数到 JVM | 示例:-J-d64 使用64位模式 |
4. 统计监控工具 jstat
场景
jstat
提供了对Java应用程序性能和资源使用的监控能力,特别是关于垃圾回收(GC)、编译时间等方面的统计数据。
使用方法
- 监控垃圾回收活动:
jstat -gcutil <pid> 1000
每秒打印一次GC统计信息。
jstat -gcutil <pid> 1000 5 # 每1秒采样GC数据,共5次
jstat -class <pid> # 类加载统计
jstat -compiler <pid> # JIT编译统计
核心监控选项
参数 | 监控指标 | 关键字段说明 |
---|---|---|
-gc | 堆内存各区域容量 | EC/EU: Eden区容量/使用量 |
-gccapacity | 内存池最大/最小容量 | OGCMN: 老年代最小容量 |
-gcutil | 内存使用百分比 | O: Old区使用率,FGC: Full GC次数 |
-gccause | GC 原因统计 | LGCC: 上次GC原因 |
-gcnew | 新生代详细统计 | TT/MTT: 晋升阈值 |
-gcold | 老年代元空间统计 | MU: 元空间使用量 |
-compiler | JIT 编译统计 | Failed: 编译失败次数 |
-class | 类加载统计 | Loaded: 已加载类数量 |
5.查看/修改 JVM 参数jinfo
场景
jinfo
是一个非常实用的命令行工具,用于实时查看和修改正在运行中的Java应用程序的系统属性和JVM标志。它特别适用于需要动态调整JVM参数或检查某个Java进程是否启用了特定的JVM选项时使用。这对于调试、性能调优以及故障排查都非常有帮助。
使用方法
- 查看所有JVM标志:可以通过
jinfo -flags <pid>
来查看指定Java进程的所有JVM启动参数。 - 修改JVM标志(仅限可变标志):对于支持动态修改的JVM标志,可以使用
jinfo -flag [+|-]<name>=<value> <pid>
的形式进行在线调整。请注意,并非所有的JVM标志都支持这种操作方式。
jinfo [option] <pid>
参数 | 功能说明 | 示例 |
---|---|---|
-flags | 显示所有参数 | jinfo -flags 38721 |
-sysprops | 显示系统属性 | jinfo -sysprops 38721 |
查看具体参数值 | jinfo MaxHeapSize 38721 | |
-flag = | 动态修改参数 | jinfo -flag +HeapDumpOnOutOfMemoryError 38721 |
二、高级诊断工具专题
全能诊断工具 jcmd(JDK 7+)
场景
jcmd
是一个多功能工具,它可以向正在运行的Java进程中发送各种诊断命令,例如触发堆转储、线程转储、GC日志记录等。
使用方法
jcmd <pid> help # 查看可用命令列表
jcmd <pid> VM.flags # 查看所有JVM参数
jcmd <pid> GC.heap_dump filename=heap.hprof # 生成堆转储
jcmd <pid> Thread.print # 生成线程快照
版本功能差异:
功能 | JDK 8 支持 | JDK 11+ 增强功能 |
---|---|---|
JFR 控制 | ❌ | ✅ 基础功能免授权 |
Native 内存分析 | ❌ | ✅ 支持详细NMT数据 |
诊断命令数量 | 40+ | 60+(新增网络诊断等命令) |
1. 基础命令
jcmd <pid> help # 查看支持的命令
命令分类 | 示例命令 | 功能说明 |
---|---|---|
JVM 信息 | VM.version | 显示 JVM 版本 |
VM.command_line | 显示启动命令 | |
内存分析 | GC.class_histogram | 类实例统计 |
GC.heap_dump filename=heap.hprof | 生成堆转储 | |
线程分析 | Thread.print | 生成线程快照 |
Thread.dump_to_file -format=text filename=threads.txt | 导出线程信息 |
2. 高级诊断(JDK11+)
命令 | 功能说明 |
---|---|
JVMTI.data_dump | 生成 JVMTI 数据转储 |
Compiler.codecache | 显示代码缓存使用情况 |
VM.native_memory | Native 内存分析 |
3. 飞行记录器 JFR(JDK 11+)
# 开启60秒记录(需要JDK 11+)
jcmd <pid> JFR.start name=app_profile duration=60s filename=recording.jfr# 导出记录文件
jcmd <pid> JFR.dump name=app_profile filename=recording.jfr
参数 | 作用说明 | 推荐配置 |
---|---|---|
name | 记录会话名称 | 建议使用有意义的命名 |
duration | 记录持续时间 | 生产环境建议5-10分钟 |
filename | 输出文件路径 | 确保磁盘空间充足 |
三、 图形化工具
工具 | 功能特点 |
---|---|
JConsole | 实时监控堆/线程/类加载/MBean |
VisualVM | 支持堆转储分析/CPU Profiling/线程跟踪(需安装插件) |
MAT | Eclipse Memory Analyzer(需单独下载) |
JConsole、VisualVM和MAT都是针对Java虚拟机(JVM)的性能分析和监控工具,它们在Java开发领域中发挥着重要作用。三者均提供对内存、线程和GC行为的分析能力,但在功能侧重上形成互补:JConsole作为轻量级监控工具,通过JMX协议实现实时指标可视化,适合基础性能观测;VisualVM作为集成化分析平台,兼具实时监控、CPU/内存采样分析、线程追踪等综合能力,支持插件扩展实现高级诊断;MAT则专精于堆转储文件的深度解析,通过对象支配树、内存泄漏检测等特性,为内存类问题提供根源性诊断方案。具体使用方案,将在下一篇文章详细介绍,敬请期待!
推荐学习路径
专家建议:建立诊断知识库,记录典型问题的排查路径和工具使用组合,可提升团队整体排障效率30%以上。
相关文章:

JDK自带工具解析与生产问题定位指南(一)
1. 引言 Java开发工具包(JDK)内置了强大的诊断工具集,用于监控、分析和调试Java应用程序。这些工具涵盖了从进程管理、内存分析到性能监控的各个方面。本文将介绍一些最常用的Java开发工具,包括jps、jmap、jstat、jcmd、jstack、…...

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束
使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下, CLOCK_DEDICATED_ROUTE 约束设置为 TRUE ,并且缓存 /MMCM 或 PLL 对必须布局在相同…...
《解锁AI黑科技:数据分类聚类与可视化》
在当今数字化时代,数据如潮水般涌来,如何从海量数据中提取有价值的信息,成为了众多领域面临的关键挑战。人工智能(AI)技术的崛起,为解决这一难题提供了强大的工具。其中,能够实现数据分类与聚类…...
Java小白入门教程:Object
目录 一、定义 二、作用 三、使用场景 四、语法以及示例 1、创建Object类型的对象 2、使用 toString()方法 3、使用 equals()方法 4、使用 hashCode()方法 5、使用 getClass()方法 6、使用 clone()方法 7、使用 finalize()方法 一、定义 在Java中, object…...

记6(人工神经网络
目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络(Feedforward Neural Networks)5、鸢尾花数据集——单层前馈型神经网络:6、多层神经网络:增加隐含层7、实现异或运算(01、10为1,00、11为0)8、线性…...

stm32硬件实现与w25qxx通信
使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册,采用B12-B15四个引脚与W25Q64连接,实现SPI通信。 W25Q64SCK(CLK)PB13MOSI(DI)PB15MISO(DO)PB14CS(…...

编程题-最接近的三数之和
题目: 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 解法一(排序双指针): 题目要求找…...

索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢
索引的底层数据结构 MySQL中常用的是Hash索引和B树索引 Hash索引:基于哈希表实现的,查找速度非常快,但是由于哈希表的特性,不支持范围查找和排序,在MySQL中支持的哈希索引是自适应的,不能手动创建 B树的…...

【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中
文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型:中间结果的处理4.5 方案验证,首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…...

网络编程套接字(中)
文章目录 🍏简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求客户端创建套接字客户端连接服务器客户端发起请求服务器测试单执行流服务器的弊端 🍐多进程版的TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务 …...
前端学习-事件委托(三十)
目录 前言 课前思考 for循环注册事件 语法 事件委托 1.事件委托的好处是什么? 2.事件委托是委托给了谁,父元素还是子元素 3.如何找到真正触发的元素 示例代码 总结 前言 才子佳人,自是白衣卿相 课前思考 1.如果同时给多个元素注册事件&…...

线程池以及在QT中的接口使用
文章目录 前言线程池架构组成**一、任务队列(Task Queue)****二、工作线程组(Worker Threads)****三、管理者线程(Manager Thread)** 系统协作流程图解 一、QRunnable二、QThreadPool三、线程池的应用场景W…...

c语言操作符(详细讲解)
目录 前言 一、算术操作符 一元操作符: 二元操作符: 二、赋值操作符 代码例子: 三、比较操作符 相等与不相等比较操作符: 大于和小于比较操作符: 大于等于和小于等于比较操作符: 四、逻辑操作符 逻辑与&…...

【自然语言处理(NLP)】深度学习架构:Transformer 原理及代码实现
文章目录 介绍Transformer核心组件架构图编码器(Encoder)解码器(Decoder) 优点应用代码实现导包基于位置的前馈网络残差连接后进行层规范化编码器 Block编码器解码器 Block解码器训练预测 个人主页:道友老李 欢迎加入社…...
JavaScript 入门教程
JavaScript 入门教程 JavaScript 入门教程引言学习 JavaScript 的好处常见的 JavaScript 框架和库 安装开发环境下载并安装 Node.js 和 npm安装常用开发工具(如 VS Code)配置本地开发环境 基础语法入门数据类型变量与常量运算符算术运算符比较运算符 条件…...

浅析CDN安全策略防范
CDN(内容分发网络)信息安全策略是保障内容分发网络在提供高效服务的同时,确保数据传输安全、防止恶意攻击和保护用户隐私的重要手段。以下从多个方面详细介绍CDN的信息安全策略: 1. 数据加密 数据加密是CDN信息安全策略的核心之…...
代码随想录刷题day22|(字符串篇)344.反转字符串、541.反转字符串 II
目录 一、题目思路 二、相关题目 三、总结与知识点 3.1 字符数组转换成字符串 一、题目思路 344反转字符串比较容易,双指针即可在空间复杂度为O(1)的基础上解决; 541反转字符串II :其中for循环中 i 每次的取值,不是 i&#…...

python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配
【1】引言 前序学习进程中,已经探索了使用cv.matchTemplate()函数实现最佳图像匹配的技巧,并且成功对两个目标进行了匹配。 相关文章链接为:python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像…...

win10部署本地deepseek-r1,chatbox,deepseek联网(谷歌网页插件Page Assist)
win10部署本地deepseek-r1,chatbox,deepseek联网(谷歌网页插件Page Assist) 前言一、本地部署DeepSeek-r1step1 安装ollamastep2 下载deepseek-r1step2.1 找到模型deepseek-r1step2.2 cmd里粘贴 后按回车,进行下载 ste…...

冯·诺依曼体系结构
目录 冯诺依曼体系结构推导 内存提高冯诺依曼体系结构效率的方法 你使用QQ和朋友聊天时,整个数据流是怎么流动的(不考虑网络情况) 与冯诺依曼体系结构相关的一些知识 冯诺依曼体系结构推导 计算机的存在就是为了解决问题,而解…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...