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只显示 PIDjps -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次数
-gccauseGC 原因统计LGCC: 上次GC原因
-gcnew新生代详细统计TT/MTT: 晋升阈值
-gcold老年代元空间统计MU: 元空间使用量
-compilerJIT 编译统计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_memoryNative 内存分析

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/线程跟踪(需安装插件)
MATEclipse Memory Analyzer(需单独下载)

JConsole、VisualVM和MAT都是针对Java虚拟机(JVM)的性能分析和监控工具,它们在Java开发领域中发挥着重要作用。三者均提供对内存、线程和GC行为的分析能力,但在功能侧重上形成互补:JConsole作为轻量级监控工具,通过JMX协议实现实时指标可视化,适合基础性能观测;VisualVM作为集成化分析平台,兼具实时监控、CPU/内存采样分析、线程追踪等综合能力,支持插件扩展实现高级诊断;MAT则专精于堆转储文件的深度解析,通过对象支配树、内存泄漏检测等特性,为内存类问题提供根源性诊断方案。具体使用方案,将在下一篇文章详细介绍,敬请期待!

推荐学习路径

基础工具
线上问题定位
性能优化
JVM原理
定制化解决方案

专家建议:建立诊断知识库,记录典型问题的排查路径和工具使用组合,可提升团队整体排障效率30%以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于vscode的cppcmake调试环境配置

1. 创建项目文件 创建cpp文件及CMakeLists.txt文件 helloOpenCV.cpp #include <opencv2/opencv.hpp> int main() {// 创建图像&#xff0c;初始化为黑色cv::Mat image cv::Mat::zeros(200, 300, CV_8UC3);// 设置为纯绿色 (BGR格式&#xff1a;0, 255, 0)image.setTo…

leetcode刷题记录(一百)——121. 买卖股票的最佳时机

&#xff08;一&#xff09;问题描述 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;121. 买卖股票的最佳时机 - 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并…

算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…

Java中的依赖注入(可以不使用@Autowired注解)

一、Autowired Autowired 是 Spring 框架中一个非常重要的注解&#xff0c;用于实现依赖注入&#xff08;Dependency Injection, DI&#xff09;。它可以让 Spring 容器自动将符合条件的 Bean 注入到标注了该注解的字段、构造函数或方法中&#xff0c;从而简化了代码的编写&am…

Android开发,待办事项提醒App的设计与实现(个人中心页)

文章目录 1. 编写UI布局2. 实现逻辑3. 运行效果图3. 关于作者其它项目视频教程介绍 Android开发&#xff0c;待办事项提醒App的设计与实现&#xff1a; https://blog.csdn.net/jky_yihuangxing/article/details/145277956?spm1001.2014.3001.5501 1. 编写UI布局 fragment_mi…

分布式系统学习:小结

关于分布式系统的学习就暂时告一段落了&#xff0c;下面整理了个思维导图&#xff0c;只涉及分布式的一些相关概念&#xff0c;需要的可自取。后面准备写下关于AI编程相关的技术文章&#xff0c;毕竟要紧跟时代的脚步嘛 思维导图xmind文件下载地址&#xff1a;https://download…

Ansible自动化运维实战--复制模块和用户模块(3/8)

文章目录 一、复制模块&#xff08;copy&#xff09;1.1、功能1.2、常用参数1.3、示例1.4、注意事项 二、用户模块&#xff08;user&#xff09;2.1、功能2.2、常用参数2.3、示例 一、复制模块&#xff08;copy&#xff09; 1.1、功能 用于将本地文件复制到远程主机。可以指定…

深度解析iTransformer:维度倒置与高效注意力机制的结合

今天&#xff0c;我想和大家一起探讨一篇非常有意思的Paper——iTransformer。作为一种针对多变量时间序列预测的新型架构&#xff0c;iTransformer 引入了颠覆性的设计思路&#xff0c;特别是在维度倒置和高效自注意力机制上的创新&#xff0c;展现出了出色的性能和适应性。 …

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…

82,【6】BUUCTF WEB .[CISCN2019 华东南赛区]Double Secret

进入靶场 提到了secret&#xff0c;那就访问 既然这样&#xff0c;那就传参看能不能报错 这个页面证明是有用的 传参长一点就会报错&#xff0c;传什么内容无所谓 所以网站是flask框架写的 有一个颜色深一点&#xff0c;点开看看 rc4加密url编码 import base64 from urllib…

MySQL--》深度解析InnoDB引擎的存储与事务机制

目录 InnoDB架构 事务原理 MVCC InnoDB架构 从MySQL5.5版本开始默认使用InnoDB存储引擎&#xff0c;它擅长进行事务处理&#xff0c;具有崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛&#xff0c;其逻辑存储结构图如下所示&#xff0c; 下面是InnoDB架构图&#xf…

第 25 场 蓝桥月赛

3.过年【算法赛】 - 蓝桥云课 问题描述 蓝桥村的村民们正准备迎接新年。他们计划宰杀 N 头猪&#xff0c;以庆祝一整年的辛勤劳作和丰收。每头猪的初始位置位于下标 xi​&#xff0c;所有 xi​ 均为偶数&#xff0c;保证没有两头猪初始位置相同。 当猪意识到人类打算宰杀它们…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

【机器学习】深入探索SVM:支持向量机的原理与应用

目录 &#x1f354; SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 &#x1f354; 小结 学习目标 知道SVM的概念 &#x1f354; SVM引入 1.1什么是SVM? 看一个故事&#xff0c;故事是这样子的&#xff1a; 在很久以前的情人节&#xf…

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…

性能测试网络风险诊断有哪些?

目录 一、网络定位分析手段 二、sar命令 三、netstat命令 以下是几种常见的网络风险诊断方法 网络连通性检查 带宽与延迟测量 丢包率分析 网络拓扑结构审查 安全设备影响评估 协议层面上的优化 负载均衡器效能检验 云化服务架构下的特殊考量 系统应用之间的交换&am…

ios打包:uuid与udid

ios的uuid与udid混乱的网上信息 新人开发ios&#xff0c;发现uuid和udid在网上有很多帖子里是混淆的&#xff0c;比如百度下&#xff0c;就会说&#xff1a; 在iOS中使用UUID&#xff08;通用唯一识别码&#xff09;作为永久签名&#xff0c;通常是指生成一个唯一标识&#xf…

微服务学习-服务调用组件 OpenFeign 实战

1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时&#xff0c;需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…