JVM工具实战:线上问题排查与性能分析

文章目录

    • jps:java 进程获取
    • jstat:虚拟机统计信息监视工具
    • jinfo:java 配置信息工具
    • jmap:java 内存映像工具
    • jstack:Java 堆栈跟踪工具

在程序运行过程中,我们可能会遇到各种问题,而稳定性风险是我们无法回避的一个话题。由于代码质量不佳或架构设计上的缺陷,JVM 层面的风险主要表现为内存溢出和死锁等问题,常见的异常包括 OOM 和 CPU 使用率急剧上升。为了深入了解问题的根本原因,我们需要熟练掌握 JVM 工具的使用。幸运的是,JVM 已经为我们提供了一系列的诊断工具。今天,我会带你熟悉 JVM 的一些常见诊断工具。

jps:java 进程获取

命令:

jps [option]
选项作用
-q只输出进程ID
-m输出启动 java 程序传入main函数的值
-l输出执行的jar包的全路径
-v输出执行的java程序的JVM参数

如:

# jps -l
1215122 /data/webapp/api.jar
1227025 /data/webapp/admin.jar
3104812 /data/webapp/bm-platform-admin-server.jar

jstat:虚拟机统计信息监视工具

命令:

jstat option pid [执行频率] [执行次数]

如:

# jstat -gcutil 1454721 1000 3
S0     S1     E      O      M     CCS    YGC     YGCT     FGC    FGCT     CGC    CGCT       GCT   
0.00  95.88  49.36  73.90  99.31  97.27     43     0.243     0     0.000    10     0.014     0.257
0.00  95.88  49.36  73.90  99.31  97.27     43     0.243     0     0.000    10     0.014     0.257
0.00  95.88  49.36  73.90  99.31  97.27     43     0.243     0     0.000    10     0.014     0.257

查看垃圾回收,进程ID:1454721,执行频率:1s,执行次数:3次。

我们再来了解一下查询出的这几个参数的含义:

  • S0、S1:Survivor0、Survivor1 幸存者区
  • E:新生代区
  • O:老年区
  • P:永久代
  • YGC:MinorGC
  • YGCT:MinorGC 的耗时
  • FGC:FullGC
  • FGCT:FullGC 总耗时
  • GCT:GCTime,意思是 GC 总耗时

下面的列表是 jstat 一些选项的作用,你可以自己在服务上敲一下命令试试。

选项作用
-class监视类装载、卸载总量、总空间及类装载所耗费的时间
-gc监视垃圾回收信息
-gcuilt与 -gc 功能类似,输出垃圾回收百分比
-gcnew监视新生代垃圾回收信息
-gcold监视老年代垃圾回收信息

jinfo:java 配置信息工具

jinfo命令可以用来查看和调整 JVM 的配置参数。使用 jps 的-v选项可以查看 JVM 启动时显式指定的参数,而 jinfo 的-flag选项可以帮助我们查看那些使用了默认值的参数。更强大的是,jinfo 甚至可以在运行时修改这些参数。jinfo 的命令格式如下:

命令:

jinfo pid

如:

jinfo 1454721

jmap:java 内存映像工具

用于创建 Java 堆内存的快照,也就是我们常说的"dump 文件",生成的 dump 文件对于分析内存溢出问题非常有用。jmap 不仅可以获取 dump 文件,还可以查询永久代、堆空间的使用情况和垃圾收集器的信息。jmap 的命令格式如下:

jmap [option] pid

选项如下:

选项作用
-dump生成java堆转储快照。格式为:-dump:[live,]format=b,file=filename.bin。其中live子参数说明是否只dump出存活的对象
-heap显示java堆详细信息,如使用哪种回收器、参数配置、分带状况等
histo显示堆中对象统计信息,包括类、示例数量、合计容量

使用示例:

jmap -dump:format=b,file=aaa.bin 1454721

jstack:Java 堆栈跟踪工具

jstack 用于生成虚拟机当前时刻的线程快照,也就是“线程 dump”文件。线程快照的意思就是线程当前的堆栈信息,生成线程快照的主要目的通常是为了定位线程阻塞的原因,如死循环、死锁、IO 资源问题等。如果发生线程阻塞,我们可以使用 jstack 来查看线程堆栈,就可以清晰地看到这些线程在后台执行什么任务、wait 什么 IO 资源。

我们来看一下 jstack 的命令格式:

jstack [option] pid

我们使用 jstack -l 14545 查看线程堆栈。

"log-producer-pool-4" #1610 prio=5 os_prio=0 cpu=4.41ms elapsed=99773.42s tid=0x00007f2b94030080 nid=0x32da0c waiting on condition  [0x00007f2b6e0df000]java.lang.Thread.State: WAITING (parking)at jdk.internal.misc.Unsafe.park(java.base@17.0.11/Native Method)- parking to wait for  <0x00000000f5385d90> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(java.base@17.0.11/LockSupport.java:341)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@17.0.11/AbstractQueuedSynchronizer.java:506)at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17.0.11/ForkJoinPool.java:3465)at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17.0.11/ForkJoinPool.java:3436)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17.0.11/AbstractQueuedSynchronizer.java:1623)at java.util.concurrent.LinkedBlockingQueue.take(java.base@17.0.11/LinkedBlockingQueue.java:435)at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17.0.11/ThreadPoolExecutor.java:1062)at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.11/ThreadPoolExecutor.java:1122)at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.11/ThreadPoolExecutor.java:635)at java.lang.Thread.run(java.base@17.0.11/Thread.java:842)

jstack选项如下:

选项作用
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示相关锁的信息

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

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

相关文章

RabbitMQ线程和连接模型详解

1. 线程、信道、连接、请求的概念 客户端&#xff08;生产者&#xff09;和服务端&#xff08;服务端&#xff09;之间建立连接。例如TCP连接&#xff0c;是一个长连接&#xff0c;也是较为稳定的连接&#xff0c;开销也较大。一般而言主客户端之间需要一个连接。但服务器需要…

【Node.js基础03】利用http模块创建Web服务

一&#xff1a;使用步骤 1 加载http模块&#xff0c;并创建Web服务程序 2 利用Web服务程序监听request事件&#xff0c;设置响应头和响应体 3 配置端口号并启动Web服务 4 浏览器请求设置的端口号&#xff0c;进行Web服务程序测试 二&#xff1a;简单应用 const http requir…

基于多线程延迟排序的睡眠排序算法的创新与改进

基于多线程延迟排序的睡眠排序算法的创新与改进 摘要 本文在传统睡眠排序算法的基础上&#xff0c;提出了一种改进方案&#xff0c;旨在优化处理负数和大规模数据集的性能。通过引入线程池管理和数据分段排序技术&#xff0c;改进后的算法在处理大数据集和包含负数的数据集时…

计算机网络入门 -- TCP详解

计算机网络入门 – TCP详解 1.TCP协议 1.1 报文格式 1.32位序号&#xff1a;该条TCP数据携带的起始序号。 2.32位确认序号&#xff1a;期望对方发送数据从那个序号开始发送。 3.4位首部长度&#xff1a;最大为0xF(15)&#xff0c;指的是TCP头部长度。 首部长度 4 位首部长…

谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装

文章目录 一&#xff0c;v-model1&#xff0c;双向绑定2&#xff0c;vue的双向绑定2.1 html元素上使用指令v-model2.2 model中声明对应属性2.3&#xff0c;验证view绑定modelmodel绑定view 完整代码 二&#xff0c;v-on1&#xff0c;指令简介2&#xff0c;在button按钮中添加v-…

rimraf快速删除node_modules方法

项目中&#xff0c;有时候会遇到下载依赖报错&#xff0c;然后想要删除node_modules再重新下载&#xff0c;但是有时候直接用yarn 或者npm install仍热不行&#xff0c;我们可以尽量用yran&#xff0c;因为npm 可能会自动下一些给一些包升级了&#xff0c;此时因为前面已经下过…

JVM:GraalVM

文章目录 一、介绍1、什么是GraalVM&#xff1a;2、GraalVM版本 二、两种使用模式 一、介绍 1、什么是GraalVM&#xff1a; GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。GraalVM的官网地址&#xff1a;https://www.graa…

泛型新理解

1.创建三个类&#xff0c;并写好对应关系 package com.jmj.gulimall.study;public class People { }package com.jmj.gulimall.study;public class Student extends People{ }package com.jmj.gulimall.study;public class Teacher extends People{ }2.解释一下这三个方法 pub…

Xubuntu22.04 终端命令调用图形设置工具

最近将软件运行环境从Xubuntu16.04迁移到了Xubuntu22.04&#xff0c;主要是为了解决Qt程序的图形渲染使用集显去处理&#xff0c;而不是使用CPU。https://blog.csdn.net/qq_45445740/article/details/134495914 使用Xubuntu22.04系统发现很多图形设置工具不太容易在桌面找到&am…

数据结构(稀疏数组)

简介 稀疏数组是一种数据结构&#xff0c;用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中&#xff0c;只有非零或非重复的元素会被存储&#xff0c;从而节省内存空间。 案例引入 假如想把下面这张表存入文件&#xff0c;我们会怎么做&#xff1f;…

【LeetCode】翻转二叉树

目录 一、题目二、解法完整代码 一、题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…

数据结构 day1

2024.7.20 数据结构之旅 那么接下来&#xff0c;是笔者每日学习之后的总结&#xff0c;以此来巩固复习&#xff0c; 本次目标 入门 中等的数据结构学习&#xff0c;come on 前置知识点: C语言的 (指针、结构、库函数、内存管理等) 数据结构定义&#xff1a; 用于计算机存储、…

【系统架构设计 每日一问】一 在单表查询的情况下,ES快还是mysql快

在单表查询的情况下&#xff0c;Elasticsearch&#xff08;ES&#xff09;和MySQL的查询速度对比并非绝对&#xff0c;而是取决于多个因素&#xff0c;包括查询类型、数据量大小、索引策略、系统配置等。以下是对两者在单表查询速度方面的详细分析&#xff1a; 一、查询类型 E…

php-fpm如何配置max_children参数

前言 略 php-fpm 资源耗尽 php-fpm 的子进程耗尽的时&#xff1a; 会导致 502 出现nginx 出现错误日志 2024/07/18 20:19:10 [crit] 36390#0: *1402471 connect() to unix:/tmp/php-cgi-81.sock failed (2: No such file or directory) while connecting to upstream, cli…

Spring Authorization Server实战

Spring Authorization Server实战 Spring Authorizatin Server Spring Authorizatin Server是一个框架&#xff0c;它提供了OAuth2.1和OpenID Connect 1.0规范以及其它相关规范的实现&#xff0c;它是基于Spring Security构建的 OAuth2.0协议介绍 OAuth是一个开放标准的授权…

使用docker swarm搭建ruoyi集群环境

整体目标 项目背景 领导给到了我一个客户&#xff0c;客户商业模式为成本制作&#xff0c;成本核算。其中涉及到大量涉密数据&#xff0c;且与我们现有产品几乎没有兼容点&#xff08;我们是一套低代码的框架&#xff0c;客户有很多业务二开&#xff09; 测试环境给到了我6台…

大模型学习笔记 - LLM模型架构

LLM 模型架构 LLM 模型架构 1. LLM 核心模型 Transformer2. 详细配置 2.1 归一化方法2.2 归一化模块位置2.3 激活函数2.4 位置编码 2.4.1 绝对位置编码2.4.2 相对位置编码2.4.3 旋转位置编码 RoPE2.4.4 ALiBi位置编码 2.5 注意力机制 2.5.1 完整自注意力机制2.5.2 稀疏注意力机…

ChatGPT实战100例 - (20) 如何玩转影刀RPA

文章目录 ChatGPT实战100例 - (20) 如何玩转影刀RPA背景需求需求分析与流程设计一、需求收集二、流程梳理三、可行性分析流程设计(详细步骤)具体步骤的影刀RPA实现流程图总结AIGC在影刀RPA中的使用总结其他RPA步骤中可能用到AIGC的地方展望总结ChatGPT实战100例 - (20) 如何玩…

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.14239 代码链接&#xff1a;https://github.com/LilianHollard/LeYOLO 一、介绍 本文关注基于FLOP的高效目标检测计算的神经网络架构设计选择&am…

【Vite】快速入门及其配置

概述 Vite是前端构建工具。vite 相较于webpack,vite采用了不同的运行方式&#xff1a; 开发时&#xff0c;并不对代码打包&#xff0c;而是直接采用ESM的方式来运行项目在项目打包部署时&#xff0c;使用 rollup 对项目进行打包除了速度外&#xff0c;vite使用起来也更加方便…