JVM性能优化工具及问题排查

jvm性能优化工具

jdk提供给我们了很实用的工具来分析JVM的状态,线程以及配置,这些工具包含于jdk中,并且以java实现,是JVM性能优化必不可少的工具集,这些工具都在$JAVA_HOME/bin下

jps、jinfo、jstack、jmap、jstat基本使用

先说下各个命令的作用

  • jps : 查看虚拟机进程工具
  • jinfo:查看虚拟机配置工具,需要进程id
  • jstack:虚拟机线程快照工具 ,可以用来排查死锁,或线程长时间停滞的问题
  • jmap:虚拟机堆快照工具,生成dump文件,用来与MAT工具混合使用
  • jstat :收集虚拟机各方面运行数据

jps(jvm process status tool)

jps [options] [hostid]
配置作用
-q忽略主类的名称,只输出pid
-m输出启动类main函数的参数
-l输出主类名,如果进程执行的为jar,则输出jar路径
-v输出具体进程启动时jvm参数

如不指定hostid,则默认当前主机,常用方式 jps -ml | jps -lv

jinfo ( configuration info for java ) 

  • jinfo pid : 显示jvm系统属性与vm参数信息
  • jinfo -flags pid : 显示jvm vm参数信息,如最大最小堆,默认堆,垃圾收集器参数
  • jinfo -sysprops pid : 显示jvm系统属性
  • jinfo -flag xxx pid : 显示特定vm参数值 jinfo -flag MaxHeapSize pid 输出pid的最大堆内存

jstack ( stack trace for java )

jstack [options]  pid
配置项作用

-f

当正常输出请求不被响应时,强制输出线程栈堆,当Java进程负载较高的时候,可以加上该参数,强制dump线程快照
-l除线程栈堆外,显示关于锁的附加信息
-m如果调用本地方法的话,可以显示c/c++的栈堆

jmap(memory map for java )

jmap [option] pid
配置项作用
-heap 查看当前jvm heapdump与垃圾收集器的使用情况

-dump:format=b,file=filename.hprof pid

转储堆快照,生成hprof文件到指定路径
-histo pid 列出当前heap中对象状况,附字节码与java对象映射表


Heap Configuration:                                    #堆配置情况,也就是JVM参数配置的结果MinHeapFreeRatio         = 0                        #最小堆使用比例MaxHeapFreeRatio         = 100                      #最大堆可用比例MaxHeapSize              = 8522825728 (8128.0MB)    #最大堆空间大小NewSize                  = 177209344 (169.0MB)      #新生代分配大小MaxNewSize               = 2840592384 (2709.0MB)    #最大可新生代分配大小OldSize                  = 355467264 (339.0MB)      #老年代大小NewRatio                 = 2                        #新生代比例SurvivorRatio            = 8                        #新生代与suvivor的比例MetaspaceSize            = 21807104 (20.796875MB)   #元空间大小CompressedClassSpaceSize = 1073741824 (1024.0MB)    #压缩类空间大小MaxMetaspaceSize         = 17592186044415 MB        #最大元空间大小G1HeapRegionSize         = 0 (0.0MB)                #G1的region大小Heap Usage:                                            #堆使用情况
PS Young Generation                                    #新生代(Eden区 + survior(from + to)区)
Eden Space:                                            #Eden区capacity = 1928855552 (1839.5MB)                    #Eden区容量used     = 267720912 (255.3185577392578MB)          #已经使用大小free     = 1661134640 (1584.1814422607422MB)        #剩余容量13.87978025220211% used                             #使用比例
From Space:                                            #survior0区capacity = 66060288 (63.0MB)                        #survior0区容量used     = 0 (0.0MB)                                #survior0已经使用大小free     = 66060288 (63.0MB)                        #survior0剩余容量0.0% used                                           #survior0使用比例
To Space:                                              #survior1区capacity = 85983232 (82.0MB)                        #survior1区容量used     = 0 (0.0MB)                                #survior1已经使用大小free     = 85983232 (82.0MB)                        #survior1剩余容量0.0% used                                           #survior1使用比例
PS Old Generation                                      #老年代使用情况capacity = 695730176 (663.5MB)                      #老年代容量used     = 207137472 (197.54168701171875MB)         #老年代已使用大小free     = 488592704 (465.95831298828125MB)         #老年代剩余大小29.77267324969386% used                             #老年代使用比例

jmap -histo:live pid  显示堆中对象的统计信息,如果指定了live子选项,则只计算活动的对象

jmap -dump:format=b,file=heapdump.hprof pid,dump当前内存快照,以hprof二进制格式转储Java堆到指定filename的文件中,live子选项是可选的 

可以通过MT工具或者jdk自带的jvisualvm装载dump文件分析问题,

-XX:+HeapDumpOnOutOfMemoryError配置这玩意之后,oom的时候会自动jump的,到时候拿快照分析一波就好了 

jstat ( jvm statistics monitoring tool)

jstat -< option > [-t] [-h] pid [< interval > [< count >]]
  • -t 参数可以在输出信息前面加上一个 Timestamp 列,显示程序运行的时间
  • -h 参数可以周期数据输出时,输出多少行后,跟着输出一个表头信息
  • interval 表示循环时间间隔,默认单位为ms,可以在直接使用s/ms指定单位,如 60ms/1s, count 表示输出几次 ,下面是查询每10s 查询20次gc情况
jstat gc pid 10s 20  
配置项        作用
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆,包括Eden区、两survivor区、老年代、永久代等的容量、已用空间、GC时间合计等
-gccapacity与-gc基本相同,但关注点为Java堆各个区域使用到的最大、最小空间
-gcutil 与-gc基本相同,但关注点为Java堆各个区域已使用空间占总空间的百分比
-gccause与-gcutil功能相同,但会额外输出导致上一次GC产生的原因
-gcnew 监控新生代GC情况
-gcnewcapacity与-gcnew基本相同,但关注最大,最小空间
-gcold    监控老年代GC情况
gcoldcapacity 与-gcold基本相同,但关注最大,最小空间
-compiler 输出被JIT编译过的方法、耗时等信息
-printcomplilation输出已经被JIT编译的方法

查询gc情况 jstat -gc pid ,属性含义后缀是C代表容量,后缀是U代表已使用,后缀是T代表的是时间(秒)

属性含义
S0C 新生代survivor0容量
S1C  新生代survivor1容量
S0U新生代survivor0已使用大小
S1U新生代survivor1已使用大小
EC 新生代eden区容量
OC 老年代容量
OU老年代已使用大小
MC元数据容量即方法区容量
MU元数据已使用空间
CCSC 压缩类空间大小
CCSU压缩类空间使用大小
YGC 新生代gc次数(young gc)
YGCT新生代gc时间(s)
FGC老生代gc次数(full gc)
GCT总的gc时间,包括young gc和full gc

 jstat -gccapacity pid 查看各空间容量

属性含义
NGCMN 新生代最小容量
NGCMX新生代最大容量
NGC当前新生代容量
S0C survivor0大小
S1Csurvivor1大小
EC Eden区大小
OGCMN老年代最小容量
OGCMX老年代最大容量
OGC当前老年代大小
MCMN 元数据最小容量
MCMX元数据最大容量
CCSMN最小压缩类空间大小
CCSMX最大压缩类空间大小
CCSC当前压缩类空间大小

可视化工具jvisualvm和jconsole控制台

这两种方式都能可视化监控java程序的运行状态,不过VisualVm界面更美观,数据更实时,所以推荐使用VisUalVm

 jvisualvm

命令行窗口输入jvisualvm,即可打开visualvm,可以查看本地java进程和远程java进程,支持导入dump文件

jconsole

命令行窗口输入jconsole,打开jconsole工具,可以查看java程序线程,内存、堆等信息

JVM问题排查步骤

1、top命令找到占用线程最高的进程

top

2、进入线程模式查找过高的线程pid

top -Hp  获取占用cpu过高的线程pid(1)中的pid

3、线程pid转换为十六进制

printf "%x\n" 占用最高的线程pid (2)中的pid

4、使用命令jstack pid| grep 0x16进制pid -A30 找到占用cpu资源过高的代码

因为我这是tomcat进程,所以没有定位到代码 ,正常情况会定位到代码栈信息,就可以定位问题啦 

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

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

相关文章

打开nginx连接的php页面报错502

目录 问题描述&#xff1a; 原因&#xff1a; 1. 使用 Unix 域套接字&#xff08;Unix Socket&#xff09; 区别和优势&#xff1a; 2. 使用 TCP/IP 套接字 区别和优势&#xff1a; 如何选择 扩展&#xff1a;Rocky_Linux9.4安装PHP的步骤&#xff1a; 使用Remi存储库…

NLP入门——基于梯度下降法分类的应用

问题分析 我们前面研究的都是基于统计的方法&#xff0c;通过不同的统计方法得到不同的准确率&#xff0c;通过改善统计的方式来提高准确率。现在我们要研究基于数学的方式来预测准确率。 假设我们有一个分词 s_{class,word}&#xff0c;class是该对象的类别&#xff0c;word…

【漏洞复现】金和OA C6 download.jsp 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

AI数据分析:Excel表格智能判断数据起点来计算增长率

工作任务&#xff1a;计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。 如果数据都有的情况下&#xff0c;公式很简单&#xff1a; 总增长率 (O2-B2)/B2 复合增长率 POWER((O2/B2),1/13)-1 但是&#xff0c;2023年1月、2月、3月的数据&#xff0c;有些有&…

AI办公自动化:用通义千问批量翻译长篇英语TXT文档

在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\AI自媒体内容\待翻译&#xff1b; 获取里面所有TXT文档&#xff…

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题&#xff0c;比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果&#xff0c;所以及时检测和修复硬盘损坏是非常必要的。那么&#xff0c;mac如何检测硬盘损坏呢&#xff1f;有哪些常用的mac硬盘检测坏道工具呢&#xff1f; 一、m…

Python 数据可视化 散点图

Python 数据可视化 散点图 import matplotlib.pyplot as plt import numpy as npdef plot_scatter(ref_info_dict, test_info_dict):# 绘制散点图&#xff0c;ref横&#xff0c;test纵plt.figure(figsize(80, 48))n 0# scatter_header_list [peak_insert_size, median_insert…

nginx反向代理动静分离和负载均衡

一.nginx 反向代理简要介绍 1.什么是反向代理 反向代理是一种服务器&#xff0c;在这种设置中&#xff0c;代理服务器接收客户端的请求&#xff0c;并将这些请求转发给一个或多个后端服务器&#xff08;例如应用服务器、数据库服务器等&#xff09;。然后&#xff0c;后端服务…

【LinkedList与链表】

目录 1&#xff0c;ArrayList的缺陷 2&#xff0c;链表 2.1 链表的概念及结构 2.2 链表的实现 2.2.1 无头单向非循环链表实现 3&#xff0c;LinkedList的模拟实现 3.1 无头双向链表实现 4&#xff0c;LinkedList的使用 4.1 什么是LinkedList 4.2 LinkedList的使用 5…

上位机图像处理和嵌入式模块部署(h750 mcu和ad/da电路)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学学习mcu的时候&#xff0c;都会把重点放在232、485、can、usb、eth这些常规的通信接口上面。还有一部分同学&#xff0c;可能会对lcd、c…

Codeforces Round 953 (Div. 2 ABCDEF题) 视频讲解

A. Alice and Books Problem Statement Alice has n n n books. The 1 1 1-st book contains a 1 a_1 a1​ pages, the 2 2 2-nd book contains a 2 a_2 a2​ pages, … \ldots …, the n n n-th book contains a n a_n an​ pages. Alice does the following: She …

【HTML01】HTML基础-基本元素-附带案例-作业

文章目录 HTML 概述学HTML到底学什么HTML的基本结构HTML的注释的作用html的语法HTML的常用标签&#xff1a;相关单词参考资料 HTML 概述 英文全称&#xff1a;Hyper Text Markup Language 中文&#xff1a;超文本标记语言&#xff0c;就将常用的50多个标记嵌入在纯文本中&…

RabbitMQ 入门

目录 一&#xff1a;什么是MQ 二&#xff1a;安装RabbitMQ 三&#xff1a;在Java中如何实现MQ的使用 RabbitMQ的五种消息模型 1.基本消息队列&#xff08;BasicQueue&#xff09; 2.工作消息队列&#xff08;WorkQueue&#xff09; 3. 发布订阅&#xff08;Publish、S…

【论文阅读】Multi-Camera Unified Pre-Training via 3D Scene Reconstruction

论文链接 代码链接 多摄像头三维感知已成为自动驾驶领域的一个重要研究领域&#xff0c;为基于激光雷达的解决方案提供了一种可行且具有成本效益的替代方案。具有成本效益的解决方案。现有的多摄像头算法主要依赖于单目 2D 预训练。然而&#xff0c;单目 2D 预训练忽略了多摄像…

【深度学习】GPT-3,Language Models are Few-Shot Learners(一)

论文&#xff1a; https://arxiv.org/abs/2005.14165 摘要 最近的研究表明&#xff0c;通过在大规模文本语料库上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;可以在许多NLP任务和基准上取得显著的进展。虽然这种方法在结构上通常是任务无关的&#xff0c;但…

走进Web3时代的物联网领域:科技的无限可能

随着Web3技术的迅速发展&#xff0c;物联网&#xff08;IoT&#xff09;领域正迎来一场深刻的变革。本文将深入探讨Web3时代如何重新定义物联网的边界和未来发展的无限可能性&#xff0c;从技术原理到应用案例&#xff0c;为读者呈现一个充满挑战和机遇的全新科技景观。 1. Web…

mediasoup源码分析(三)channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中&#xff0c;已经介绍过信令服务中tcp和channel的创建&#xff0c;本文主要讲解c中mediasoup的channel创建&#xff0c;以及信令服务和medi…

如何避免接口重复请求(axios推荐使用AbortController)

前言&#xff1a; 我们日常开发中&#xff0c;经常会遇到点击一个按钮或者进行搜索时&#xff0c;请求接口的需求。 如果我们不做优化&#xff0c;连续点击按钮或者进行搜索&#xff0c;接口会重复请求。 以axios为例&#xff0c;我们一般以以下几种方法为主&#xff1a; 1…

【Pmac】PMAC QT联合开发中各种可能遇到的坑

目录 1. 错误 C2027 使用了未定义类型“PCOMMSERVERLib::DEVUPLOAD”2. 输入了正确的pmac的ip地址&#xff0c;没有显示可选的pmac设备3. Pmac DTC-28B无读数 使用QT编写PMAC上位机程序时&#xff0c;利用QT中的dump工具可以将pcommserver.exe转化为pcommserverlib.h和pcommser…

调度算法-内存页面置换算法

缺⻚异常&#xff08;缺⻚中断&#xff09; 与⼀般中断的主要区别在于&#xff1a; 缺⻚中断在指令执⾏「期间」产⽣和处理中断信号&#xff0c;⽽⼀般中断在⼀条指令执⾏「完成」后检查和处理中断信号。缺⻚中断返回到该指令的开始重新执⾏「该指令」&#xff0c;⽽⼀般中断返…