JVM学习日记(十五)Day15——性能监控与调优(二)

好了我们这一篇继续来说命令行监控指令,上一篇说了4个比较重要的指令,其中用的比较多的也就是jstat和jmap了。

jhat:堆转储分析工具

他是JDK自带的分析工具,分析我们上一篇说的jmap转存的内存快照,​​内置了一个微型的HTTP服务器提供Web界面浏览分析结果(默认端口是7000),帮助识别内存泄漏和大对象,​同时支持OQL(Object Query Language)查询,但是已经在JDK9中被删除了,因为官方推荐使用VissualVM。

#基本语法
jhat [options] <heap-dump-file>#基本用法
# 分析堆转储文件并在7000端口启动服务
jhat heap.hprof# 访问分析结果
http://localhost:7000
参数说明示例
-stack false关闭对象分配调用栈跟踪jhat -stack false heap.hprof
-refs false关闭对象引用跟踪jhat -refs false heap.hprof
-port <port>指定HTTP服务器端口(默认7000)jhat -port 8000 heap.hprof
-exclude <file>指定排除文件(包含排除的类名)jhat -exclude exclude.txt heap.hprof
-baseline <file>指定基准堆转储(用于比较)jhat -baseline base.hprof heap.hprof
-debug <int>设置调试级别(0-2)jhat -debug 1 heap.hprof
-version显示版本信息jhat -version
-h/-help显示帮助信息jhat -help

 这个表示就已经启动成功了,可以去浏览器的http://localhost:8000/进行访问,这边建议小伙伴自己去尝试查看,知道这个东西就可以了,后面我们还是使用GUI图形界面去分析的,因为这个会更加的直观的。

jstack:生成 Java 进程的线程快照

我们上篇说到了jamp的堆快照,这里又有个可以查看线程的快照,因为程序出现卡顿不一定是堆堆问题嘛,也可能是线程的问题,jstack获取线程快照​:显示所有 Java 线程的调用栈信息,​诊断死锁​:自动检测并报告死锁线程,分析高 CPU 占用​:结合 top 或 jps 定位问题线程,排查线程阻塞​:识别等待资源或锁的线程。

#基本语法
jstack [options] <pid>
参数作用示例
-F强制生成线程转储(当进程挂起时使用)jstack -F 1234
-l显示额外锁信息(包含同步器和 java.util.concurrent 锁)jstack -l 1234
-m混合模式(显示 Java 和本地方法栈)jstack -m 1234
-h/-help显示帮助信息jstack -help

 这里来说一下区别,和jmap不同的就是他不会要求生成文件然后再分析,而是直接把内容打印到控制台,当然也是可以存文件的,这个文件就是普通的txt文件不需要其他命令或者工具辅助查看了。

jstack -F 1234 > thread_dump.txt
#其实所有的输出都可以用这种方式存到指定的文件
#这个就是基本信息了
2025-08-01 17:13:34 //快照时间
Full thread dump Java HotSpot(TM) 64-Bit Server VM (21.0.5+9-LTS-239 mixed mode, emulated-client, sharing): //虚拟机信息Threads class SMR info: //一共30个线程,线程的地址如下
_java_thread_list=0x0000600002111ac0, length=30, elements={
0x0000000127010a00, 0x0000000127011200, 0x0000000127011a00, 0x000000011680f600,
0x000000011680d000, 0x000000011680d800, 0x000000011680aa00, 0x00000001268b2c00,
0x00000001269abc00, 0x0000000117102800, 0x0000000126b09200, 0x0000000127333c00,
0x0000000126b1c000, 0x000000012723ec00, 0x0000000117200e00, 0x0000000126b0e000,
0x0000000117008e00, 0x000000012734f000, 0x000000012734f800, 0x0000000127346200,
0x0000000127346a00, 0x000000011721b800, 0x0000000126b36c00, 0x0000000126b3ec00,
0x0000000126b3f400, 0x0000000126b3fc00, 0x0000000127347200, 0x0000000126b40400,
0x0000000127344600, 0x0000000126820000
}"Reference Handler" #9 [32259] daemon prio=10 os_prio=31 cpu=1.76ms elapsed=141885.62s tid=0x0000000127010a00 nid=32259 waiting on condition  [0x000000016ec6e000]
#"Reference Handler"​​:线程名称
​​#9​:线程序号(JVM内部编号)
#​​[32259]​​:原生线程ID(Native Thread ID)
#​daemon​:这是一个守护线程(非用户线程)
​#prio=10​:Java线程优先级(1-10)
​#os_prio=31​:操作系统线程优先级
​#cpu=1.76ms​:该线程累计使用的CPU时间
​#elapsed=141885.62s​:线程已运行的时间(秒)
​#tid=0x0000000127010a00​:Java线程ID(内存地址)
#​nid=32259​:对应的操作系统线程ID(Native ID)
​#waiting on condition​:线程当前状态
​​#[0x000000016ec6e000]​​:线程栈的起始地址java.lang.Thread.State: RUNNABLE//运行状态at java.lang.ref.Reference.waitForReferencePendingList(java.base@21.0.5/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@21.0.5/Reference.java:246)at java.lang.ref.Reference$ReferenceHandler.run(java.base@21.0.5/Reference.java:208)

线程状态(Thread.State)

  • RUNNABLE​:线程正在执行或准备执行
  • WAITING​:线程等待某个条件(通常需要唤醒)
  • BLOCKED​:线程等待获取锁
  • TIMED_WAITING​:线程在指定时间内等待

这个就是jstack的示例,这里说一下什么是 daemon​:守护线程(JVM退出时不等待这些线程)什么是非daemon​:用户线程(JVM会等待这些线程结束),简单来说守护线程就是系统后台线程比如日志监控、垃圾回收等。

jcmd:多功能命令行工具

怎么说呢这哥们就是一个缝合怪,除了不能替代jstat其余的基本上都可以替代了,感觉前面讲的是不是有点多余了。

jcmd [options] <pid|main class> <command> [arguments]
部分含义是否必须示例
jcmd命令本身必须jcmd
[options]全局选项可选-l-f
<pid|main class>目标进程标识必须1234 或 com.example.MyApp
<command>要执行的诊断命令可选Thread.printGC.heap_dump
[arguments]命令参数可选filename=/tmp/dump.hprof
命令作用示例
VM.flags查看JVM参数jcmd 1234 VM.flags
VM.system_properties查看系统属性jcmd 1234 VM.system_properties
VM.uptime显示JVM运行时间jcmd 1234 VM.uptime
VM.version显示JVM版本jcmd 1234 VM.version
Thread.print生成线程转储jcmd 1234 Thread.print
GC.class_histogram显示类直方图jcmd 1234 GC.class_histogram
GC.heap_dump生成堆转储文件jcmd 1234 GC.heap_dump /path/to/dump.hprof
GC.run_finalization强制执行finalizejcmd 1234 GC.run_finalization
GC.run显式触发GCjcmd 1234 GC.run
JFR.start开始JFR记录jcmd 1234 JFR.start name=myrec settings=profile
JFR.dump导出JFR记录jcmd 1234 JFR.dump name=myrec filename=rec.jfr
JFR.stop停止JFR记录jcmd 1234 JFR.stop name=myrec
VM.native_memory本地内存统计jcmd 1234 VM.native_memory summary

 突然感觉这个命令有点复杂了有木有,主包这边就不演示了,这么多参数和命令又点头疼,具体使用什么命令还是要看小伙伴自己和使用的场景,有兴趣的小伙伴自己去试试看吧。

jstatd:远程监控工具

作用就是为远程主机提供 JVM 监控数据,通过 RMI 协议提供监控数据,可同时监控多个 Java 进程,支持 VisualVM、JConsole 等工具连接,这个咱们就简单说一下就好了,因为大多数生成环境是不允许的,多开一个端口都是有风险的。

#基本语法
jstatd [options]
#实例
jstatd -J-Djava.security.policy=jstatd.policy -p 3333
参数作用示例
-p <port>指定 RMI 注册端口jstatd -p 1099
-n <name>指定 RMI 注册名称jstatd -n MyJstatd
-J<option>传递参数给 JVMjstatd -J-Djava.security.policy=my.policy
-nr不创建 RMI 注册表jstatd -nr
-r <port>指定 RMI 注册表端口jstatd -r 1099
-h/-help显示帮助信息jstatd -h

 总结

本篇把剩下的命令行已经全部介绍完了,下一篇讲讲GUI图形界面,大家好好练习命令吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker国内镜像列表

Docker 镜像源列表&#xff08;8月3日更新-长期&免费&#xff09;_docker国内镜像源-CSDN博客

Orange AI 管理平台单体版安装教程(Docker Compose 部署)

Orange AI 管理平台单体版安装教程&#xff08;Docker Compose 部署&#xff09; 本文介绍如何通过 Docker Compose 快速安装 Orange AI 管理平台单体版&#xff0c;适用于本地开发和测试环境。步骤简单&#xff0c;适合初学者和有一定运维经验的用户。 一、环境准备 已安装 …

PHP的魔术方法

一、介绍 ‌PHP魔术方法是以双下划线__开头的一组特殊方法&#xff0c;用于在对象生命周期、属性访问、方法调用等场景中实现自动化操作。‌简化面向对象编程。 二、17个现有的魔术方法 &#xff08;一&#xff09;、对象生命周期相关 1、__construct() 类的构造函数方法&a…

vue2实现类似chatgpt和deepseek的AI对话流打字机效果,实现多模型同时对话

实现多模型同时对话功能特点&#xff1a;1、抽离对话框成单独组件ChatBox.vue&#xff0c;在新增模型对比窗口时可重复利用2、通过sse与后台实时数据流&#xff0c;通过定时器实现打字效果3、适应深度思考内容输出&#xff0c;可点击展开与闭合4、可配置模型参数&#xff0c;本…

电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置

一、问题背景 你有没有遇到过这种情况&#xff1a;电脑右下角的网络图标明明显示连接正常&#xff0c;可打开浏览器就是加载不出网页&#xff0c;聊天软件也刷不出新消息&#xff1f; 这种 "网络已连接但无法上网" 的问题特别常见&#xff0c;既不是没插网线&#xf…

思途Spring学习 0804

SpringBoot 核心概念与开发实践SpringBoot 是一个基于 Spring 框架的快速开发脚手架&#xff0c;通过约定大于配置的原则简化了传统 Spring 应用的初始化配置。其核心目标是整合 Spring 生态&#xff08;如 SSM&#xff09;并支持微服务架构开发。控制反转&#xff08;IoC&…

Hutool工具类:Java开发必备神器

Hutool工具类使用说明Hutool是一个Java工具类库&#xff0c;提供了丰富的功能模块&#xff0c;包括字符串处理、日期时间操作、IO流、加密解密、HTTP客户端等。以下是一些常用模块的具体使用方法。字符串工具&#xff08;StrUtil&#xff09;字符串处理是开发中的常见需求&…

Node.js中Buffer的用法

// Buffer 与字符串的转换示例 // Buffer 是 Node.js 中用于处理二进制数据的类&#xff0c;字符串与 Buffer 之间的转换是常见操作// 1. 从字节数组创建 Buffer 并转换为字符串 // Buffer.from(array) 接收一个字节数值数组&#xff0c;创建对应的 Buffer let buf_4 Buffer.f…

【Java 基础】Java 源代码加密工具有哪些?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…

es的histogram直方图聚合和terms分组聚合

你提到的这两个 Elasticsearch aggs 聚合语句&#xff1a;第一种&#xff1a;histogram 直方图聚合 "aggs": {"DayDiagram": {"histogram": {"field": "${FiledName}","interval": ${TimeInterval},"extende…

基于Java的AI/机器学习库(Smile、Weka、DeepLearning4J)的实用

基于Java和AI技术处理动漫视频 以下是一些基于Java和AI技术处理动漫视频(如《亚久斗》)的实用案例和实现方法,涵盖视频分析、风格转换、角色识别等方向。每个案例均提供技术思路和关键代码片段。 视频关键帧提取 使用OpenCV提取动漫视频中的关键帧,保存为图片供后续分析…

笔记本电脑联想T14重启后无法识别外置红米屏幕

【原先是可以连接重启后不行】按照以下步骤排查和解决&#xff1a;✅ 1. 基础排查确认连接方式&#xff1a;检查是否使用 USB-C转DP/HDMI线 或 HDMI/DP直连&#xff0c;尝试更换线缆或接口&#xff08;如换另一个USB-C口或HDMI口&#xff09;。测试显示器&#xff1a;将红米显示…

vue+ts 基础面试题 (一 )

目录 1.Vue3 响应式原理 一、 响应式的基本概念 二、 核心机制&#xff1a;Proxy 和依赖追踪 三、 触发更新的过程 四、 代码示例 五、 优势总结 2.如何实现组件间通信&#xff1f; 一、父子组件通信 1. 父传子&#xff1a;Props 传递 2. 子传父&#xff1a;自定义事…

Spring AI实战:SpringBoot项目结合Spring AI开发——提示词(Prompt)技术与工程实战详解

&#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录一、前言二、提示词前置知识2.1 提示词要素2.2 设计提示词的通用技巧2.2.1 从简单开始2.2.…

【后端】Java static 关键字详解

在 Java 中&#xff0c;static 是一个修饰符&#xff0c;用于定义与类相关&#xff08;而非对象实例相关&#xff09;的成员。以下是核心知识点和用法&#xff1a;一、四大用途静态变量&#xff08;类变量&#xff09; 作用&#xff1a;属于类&#xff0c;而非实例。所有实例共…

算法训练营DAY50 第十一章:图论part01

98. 所有可达路径 98. 所有可达路径 【题目描述】 给定一个有 n 个节点的有向无环图&#xff0c;节点编号从 1 到 n。请编写一个程序&#xff0c;找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 【输入描述】 第一行包含两个整数 N&#…

OpenCV:从入门到实战的全方位指南

目录 一、OpenCV 简介 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;应用场景 二、OpenCV 的核心模块 &#xff08;一&#xff09;core 模块 &#xff08;二&#xff09;imgproc 模块 &#xff08;三&#xff09;video 模块 &#xff08;四&#xff09;f…

如何在 Ubuntu 24.04 上安装和配置 TFTP 服务器

了解如何在 Ubuntu 24.04 Linux 上安装 TFTP 以执行基本的文件传输。 简单文件传输协议(TFTP)是标准 FTP 的轻量级替代方案,用于在联网设备之间传输文件。与 FTP 和 HTTP 相比,TFTP 更简单,无需复杂的客户端-服务器模型即可操作。这就是为什么该协议用于执行基本文件传输…

基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)

AXI-Lite 实现RPC调用硬件函数服务 &#x1f44b; 本文介绍如何基于 AXI-Lite 总线设计一个通用的“硬件函数调用框架”。主机端&#xff08;PS&#xff09;只需通过寄存器写入参数与启动标志&#xff0c;即可触发 PL 模块执行指定算法逻辑&#xff0c;并将结果返回。 该机制本…

[spring-cloud: NamedContextFactory ClientFactoryObjectProvider]-源码阅读

依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId><version>4.3.0</version> </dependency>源码 NamedContextFactory NamedContextFactory 类通过创建多个子…