JDK常用性能监控和故障处理工具

news2024/12/28 1:48:16

JDK8

在JDK安装目录下的bin文件夹,有一些辅助命令行工具,通常用来获取JVM的信息或者监控JVM,在排查性能问题方面是非常好用的工具。以Centos7.9系统下的openJDK1.8.0_222为例(不同大版本的JDK命令的参数会有差异,不同操作系统也有差异),如下图:

其中常用的有jps、jstat、jinfo、jmap、jstack、jcmd、jconsole等等。

jps

简介

jps(JVM Process Status)命令用于查看系统内所有的JVM进程,可根据参数选项指定是否显示JVM的执行主类[包含main()方法的类],以及进程的本地JVMID,对于本地JVM进程来说,进程的本地JVMID与操作系统的进程ID(ps命令查看)是一致的。它就是Java提供的一个显示当前所有Java进程pid的命令,和ps命令很相似。

注意:它只能看当前系统登录用户的jvm进程。

用法

jps [option] [hostid]
option选项说明
option用途
-q只输出LVMID(本地虚拟机唯一ID,一般是进程ID),省略主类名称
-m输出JVM进程启动时传递给主类main()函数的参数
-l输出主类的全称,如果进程执行的是jar包,则输出jar路径
-v输出JVM进程启动时的JVM参数

hostid是RMI服务注册表中注册的主机名,可以不写,不写就是查询本机的。

案例

# 输出jvm启动参数和main的参数
jps -lmv
# 第一列为jvmid,也就是pid
# 第二列是主类全称或jar路径
# 第三列是传给main方法的参数
# 第四列是jvm参数

jstat

简介

jstat(JVM Statistics Monitoring Tool)用于收集JVM各方面的运行数据,显示本地或远程JVM进程中的类装载、内存、垃圾收集、JIT编译等运行数据。常用于检测垃圾回收问题以及内存泄漏问题。

用法

# 查看option
jstat -options 
jstat -<option>[-t] [-h<lines>] <vmid>[<interval>[<count>]]
option选项
选项用途
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-compiler输出JIT编译器编译过的方法、耗时等信息
-gc监视Java堆状况,包括Eden区,两个survivor区、老年代、方法区等容量、已用空间、gc时间合计等信息
-gccapacity监视与-gc相同,侧重点在于Java堆各个区域使用到的最大、最小空间
-gcmetacapacity监视元数据区gc情况
-gcnew监视新生代gc情况
-gcnewcapacity与-gcnew相同,侧重于使用到的最大、最小空间
-gcold监视老年代gc情况
-gcoldcapacity与-gcold相同,侧重于使用到的最大、最小空间
-gcutil与-gc基本相同,输出的是已使用空间占总空间的百分比
-gccause与-gcutil一样,但会额外输出导致上一次GC产生的原因
-printcompilation输出被JIT编译的方法

[-t]参数,可以在输出信息前加上一个Timestamp列,显示程序的运行时间。

[-h]参数,可以在输出一定行数的数据后输出一个表头信息,方便观察。

[interval]参数,指定输出统计数据的周期,单位支持秒(s),毫秒(ms),默认单位为毫秒,相当于查询间隔时间。

[count]参数,指定查询的总次数。

可以分析比较Java进程的启用时间以及总GC时间(GCT列),或者两次测量的间隔时间以及总GC时间的增量,来得出GC时间占运行时间的比例。如果该比例超过20%,说明目前堆的压力较大;如果该比例超过90%,则说明堆里几乎没有可用空间,一直在GC但是没用,随时可能抛出OOM异常。

案例 

一般先用jps查出pid,再使用jstat监控。

# 先查询pid,为2205978
jps
# 每隔一秒打印一次,打印10次,加上时间戳,每隔5行打印一次表头,并输出到stat.log文件中
jstat -gc -t -h5 2205978 1000 10 > stat.log
jstat输出列含义
含义
S0C新生代第一个survivor区的容量,单位为字节
S1C新生代第二个survivor区的容量,单位为字节
S0U新生代第一个survivor区的已使用空间,单位为字节
S1U新生代第二个survivor区的已使用空间,单位为字节
EC新生代Eden区容量,单位为字节
EU新生代Eden区已使用空间,单位为字节
OC老年代容量,单位为字节
OU老年代已使用空间,单位为字节
MC元数据区容量
MU元数据区已使用空间
CCSC压缩类空间总容量
CCSU压缩类空间已使用空间
YGC从应用程序启动到采样时youngGC次数
YGCT从应用程序启动到采样时youngGC消耗的时间,单位为秒
FGC从应用程序启动到采样时fullGC次数
FGCT从应用程序启动到采样时fullGC消耗的时间,单位为秒
GCT从应用程序启动到采样时GC用的总时间,单位为秒

jstatd

简介

jstat只涉及监控本机的Java应用程序,jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的Java应用程序信息传递到远程计算机。它需要rmi相关的权限,一般不使用,了解即可。

用法

jstatd [-nr] [-p port] [-n rminame]

jinfo

简介

jinfo(Configuration Info for Java)可用于查看和调整JVM的配置参数。如果想要知道未被显示指定的参数的系统默认值,可以使用这个命令。

其次就是在程序运行时可以修改部分参数,并使之立即生效。但是不是所有参数都支持运行时修改,只有被标记为manageable的参数可以被实时修改。使用下面的命令查看被标记为manageable的参数。

java -XX:+PrintFlagsFinal -version | grep manageable

用法

jinfo [options] pid
options选项说明
选项说明
输出全部参数和系统属性
-flag <name>输出名称为name的参数
-flag  [+-]<name>

开启(+)或关闭(-)对应名称的参数,被标记为management才可以生效

-flag <name>=<value>指定名称为name的参数值为value
-flags输出全部参数
-sysprops输出系统属性,相当于Java里输出System.getProperties()

案例

# 先使用jps查出pid,2205978
jps -l
# 查看所有参数和系统属性,参数为VM Flags部分,系统属性为Java System Properties部分
jinfo 2205978
# 查看所有参数
jinfo -flags 2205978
# 查看所有属性
jinfo -sysprops 2205978
# 查看某个参数
jinfo -flag MaxHeapSize 2205978
jinfo -flag PrintGC 2205978
# 设置参数开启、关闭,bool类型的可以用+、-操作,下面为开启类的直方图统计
jinfo -flag +PrintClassHistogram 2205978
jinfo -flag -PrintClassHistogram 2205978
# 将MaxHeapFreeRatio 调整为80,默认是100
jinfo -flag MaxHeapFreeRatio 80 28914

# 查看-XX类型参数的初始值
java -XX:+PrintFlagsInitial
# 查看所有-XX类型参数
java -XX:+PrintFlagsFinal
# 查看被用户或jvm设置过的详细的-XX类型的参数 的名称和值
java -XX:+PrintCommandLineFlags

jmap

简介

jmap(JVM Memory Map)用于生成JVM的内存转储快照,生成堆dump文件且可以查询finalize执行队列,以及Java堆与元空间的一些信息。除此之外,它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。

注:jmap导出的快照是在线程运行到安全点处导出的。

用法

jmap <options> <pid>
jmap <options> <executable <core>>
jmap <options> [server_id@]<remote server IP or hostname>
option选项说明
选项用途
-clstats打印类加载的统计信息
-finalizerinfo打印等待终结(执行finalize方法)的对象信息,即在finalizer队列中的对象
-heap打印java堆的简要信息
-histo统计堆中java对象的直方图
-histo:live统计堆中存活java对象的直方图
-dump:<dump-options>dump java堆信息
-F当进程对-dump:<dump-options>或者-histo无响应时,会强制生成dump文件,Linux下有效
dump-options选项,可以多个
选项用途
live仅dump堆中存活的对象,不写此选项则dump堆中所有对象
format=b二进制格式
file=<file>dump到指定文件中

案例

# 先用jps查出pid,2205978
jps -l
# 打印堆的简略信息
jmap -heap 2205978
# 打印类加载的统计信息
jmap -clstats 2205978 > clstats.log
# 打印直方图
jmap -histo 2205978 > histo.log
# 以二进制格式dump堆中存活的对象,这个文件需要用专门的工具分析
jmap -dump:live,format=b,file=heap.bin 2205978

当因为内存泄露出现OOM错误时,需要在此时自动dump内存,用来分析当时的内存状况,可以在重启应用程序时JVM参数添加【-XX:+HeapDumpOnOutOfMemoryError】、【-XX:HeapDumpPath=./dump.bin】,dump路径可以定义,下次出现OOM则可以自动dump。

jstack

简介

jstack(JVM Stack Trace)用于生成JVM指定进程当前时刻的线程快照(Thread Dump),方便用户跟踪JVM堆栈信息。线程快照就是当前JVM内指定进程的每一条线程正在执行的方法堆栈的集合。

生成线程快照的作用是可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题,这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。

线程快照中的状态

线程状态
状态含义
DeadLock死锁
Waiting on Condition条件等待
Waiting on monitor entry等待获取监视器
Blocked被阻塞
Runnable运行中
Suspend暂停
TIMED_WAITING、Object.wait()等待中
Parked停止

表中标红的部分需要重点关注,有可能是导致引用程序卡死的原因。

用法

jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
jstack [-m] [-l] <executable> <core>
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
options选项
选项用途
-F当jstack <pid>无响应时,强制输出线程的dump信息
-l除了打印线程堆栈,还打印关于锁的附加信息
-m打印java和本地方法的栈帧(混合模式)

案例

# 查出pid,2205978
jps
# 打印堆栈
jstack 2205978 > stack.log

jcmd

简介

在JDK1.7以后,新增了一个命令行工具jcmd。它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能,比如用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。

用法

jcmd #和jps -lm类似
jcmd -l #和jcmd作用相同

# 查看command
jcmd <pid> help
jcmd <pid | mainclass |jar> <options> # 当pid=0时,命令会发给所有的jvm

# 替代其他命令
jcmd <pid> GC.heap_dump         #和jmap -dump <pid> 类似
jcmd <pid> GC.class_histogram   #和jmap -histo <pid> 类似
jcmd <pid> Thread.print         #和jstack <pid> 类似
jcmd <pid> VM.system_properties #和jinfo -sysprops <pid> 类似
jcmd <pid> VM.flags             #和jinfo -flags <pid> 类似 
...
options说明
选项用途
command可以是所有的命令,用jcmd <pid> help查看所有支持的command
PerfCounter.print打印当前进程的性能计数器
-f file从指定的文件读取command并执行

案例

# 查看pid 2205978
jcmd -l
# 查看command
jcmd 2205978 help
# 导出堆到文件里
jcmd 2205978 GC.heap_info > heap.log
# 打印其他参数
jcmd 2205978 VM.uptime
jcmd 2205978 VM.flags
jcmd 2205978 GC.class_histogram -all

# 打印性能计数器
jcmd 2205978 PerfCounter.print

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

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

相关文章

利用python进行数据分析 pdf

利用python进行数据分析 pdf 介绍 在现代社会中&#xff0c;随着大数据时代的到来&#xff0c;数据分析的需求越来越大。而Python作为一门简洁且易于学习的编程语言&#xff0c;具有强大的数据分析能力&#xff0c;成为了广大数据分析师的首选工具之一。本文将指导一位刚入行的…

相关性网络图 | 热图中添加显著性

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 本期教程 写在前面 此图是一位同学看到后&#xff0c;想出的一期教程。 最近&#xff0c;自己的事情比较多&#xff0c;会无暇顾及社群和公众号教程。 1 安装和加载相关的R包 library(ggraph) library(tidy…

追求卓越 再添新荣誉 | Softing中国顺利通过ISO9001质量管理体系认证!

近日&#xff0c;羧福汀电子科技&#xff08;上海&#xff09;有限公司&#xff08;简称&#xff1a;Softing中国&#xff09;顺利通过ISO9001质量管理体系认证审核&#xff0c;并被授予认证证书。ISO9001认证的通过&#xff0c;代表Softing中国的软硬件技术研发水平及管理水平…

压敏涂料静态校准装置中的温度、真空压力和氧浓度精密控制解决方案

摘要&#xff1a;针对客户提出的在温度-10℃~80℃、绝对压力1Pa~600kPa、氧浓度0~80%范围内实现对压力敏感涂料静态特性校准测试腔室的精密自动控制要求&#xff0c;本文提出了相应的解决方案。解决方案的主要技术内容是采用TEC半导体制冷器进行温度控制、采用动态平衡法和电控…

C# Onnx 用于边缘检测的轻量级密集卷积神经网络LDC

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

Python二级 每周练习题24

练习一: 体重比较器 要求: 请编程实现如下功能: (1)程序开始运行时&#xff0c;提醒用户输入三个人的名字和体重 (可以分开输入&#xff0c;每次输入名字或者体重) (2) 程序自动比较&#xff0c;找出最重的一个人的名字和体重输出 的格式不限&#xff0c;但是要有最重人的姓名…

AcWing96. 奇怪的汉诺塔

题目 汉诺塔问题&#xff0c;条件如下&#xff1a; 1、这里有 A、B、C 和 D 四座塔。 2、这里有 n n n 个圆盘&#xff0c; n n n 的数量是恒定的。 3、每个圆盘的尺寸都不相同。 4、所有的圆盘在开始时都堆叠在塔 A 上&#xff0c;且圆盘尺寸从塔顶到塔底逐渐增大。 5、…

python实现MC协议(SLMP 3E帧)的TCP服务端

python实现MC协议&#xff08;SLMP 3E帧&#xff09;的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模…

如何快速定制个性化外观验证码?

验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身份核验的功能&#xff0c;在保障账户安全方…

【vtk学习笔记2】vtk编程中的基本对象与可视化管线

一、VTK编程中的基本对象 数据可视化一般需要一个数据源&#xff0c;可以来说具体的算法&#xff0c;如有限元、边界元等&#xff0c;也可以是测量数据&#xff0c;如医学检测数据等。这些基础数据经过变换处理&#xff0c;变成计算机图形流水线支持的数据&#xff0c;最后显示…

C语言编程之排列组合问题

1.动态取球 在生活中我们经常会遇到一个这样的问题&#xff0c;从N个球中随机取K个(N>K)&#xff0c;问有多少总取法。这是我们数学中的排列组合&#xff0c;通过排列组合可计算方法为&#xff1a;C(N,K);   例如一个袋子中有6个球为(1,2,3,4,5,6)&#xff0c;从袋子中一次…

Python基础介绍 —— 使用pytest进行测试!

Pytest 是 Python 的一种单元测试框架&#xff0c;与 Python 自带的 unittest 测试框架类似&#xff0c;但是比 unittest 框架使用起来更简洁&#xff0c;效率更高。 Pytest 是一个成熟的全功能的 Python 测试工具&#xff0c;可以帮助你写出更好的程序&#xff0c;让我们很方便…

MINIO 对象存储服务

MINIO 官网下载地址&#xff1a; 注&#xff1a;需要下载 MINIO SERVER&#xff08;服务端&#xff09; 和 MINIO CLIENT&#xff08;客户端&#xff09;两个文件 WINDOWS版本下载地址&#xff1a;https://min.io/download#/windows LINUX版本下载地址&#xff1a;https://mi…

数据库 索引

Mysql的索引 事务 存储引擎 索引 概念 什么是索引&#xff1a;索引是一个排序的列表&#xff0c;列表当中存储的是所有的值和包含这个值的数据所在行的物理地址 索引的作用 加快查询作用&#xff0c;这是他主要的一个作用 利用索引数据库可以快速定位&#xff0c;大大加快…

AERMOD模型、WRF/Chem模式、CMAQ、Smoke模式及EDGAR/MEIC清单制作

推荐一些大气环境、气象领域常用的一些模型软件免费教程&#xff0c;包含5大方向&#xff0c;不容错过&#xff01;评论区联系小编领取 >>>> WRF模式及在地学多领域应用&#xff08;必学&#xff09; 1、WRF模式基础 &#xff08;初始和边界场、气象预报流程、数…

毫米波雷达3-三个FFT(距离,速度,角度)

文章目录 快慢时间维度空间维度FFT原理useful links快慢时间维度 由于电磁波传播的速度非常之快,导致了回波间隔比发射间隔小了好几个数量级 下图中,每一行(快时间维)对应的是一个脉冲回波的连续采样,在快时间维度,即使一个移动的物体,我们也可以看作不动,那么对于快…

代码随想录day50|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

198.打家劫舍 &#xff08;中等&#xff09; leetcode题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode…

前端css介绍

CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 CSS语法 CSS实例 每个CSS样式由两个组成部分&#xff1a;选择器和…

C语言 DAY07:预编译,宏,选择性编译,库(静态库,动态库)

声明与定义分离 声明&#xff1a;将声明单独封装成一个以.h为后缀名的头文件 定义&#xff1a;将定义的变量&#xff0c;函数&#xff0c;数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。 注意&#xff1a;1.声明的…

【MATLAB源码-第63期】基于matlab的DCSK(差分混沌移位键控调制)系统误码率仿真。

MATLAB 2022a 1、算法描述 DCSK&#xff08;Differential Chaos Shift Keying&#xff09;是一种差分混沌移位键控调制方式&#xff0c;常用于无线通信系统。其调制和解调的基本流程如下&#xff1a; 1. DCSK调制 1.1 生成混沌序列 - 初始条件&#xff1a;选择一个混沌映射&a…