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.rhkb.cn/news/353493.html

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

相关文章

力扣793. 阶乘函数后 K 个零

Problem: 793. 阶乘函数后 K 个零 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 1.根据题意可知即是要求取满足条件的n最小是多少&#xff0c;最大是多少&#xff0c;最大值和最小值一减&#xff0c;就可以算出来有多少个n满足条件了。 2.由于题目中的阶乘存在单…

springboot连接多个库

一个SpringBoot项目&#xff0c;同时连接两个数据库&#xff1a;比如一个是Mysql数据库&#xff0c;一个是oracle数据库&#xff08;啥数据库都一样&#xff0c;连接两个同为oracle的数据库&#xff0c;或两个不同的数据库&#xff0c;只需要更改对应的driver-class-name和jdbc…

读AI新生:破解人机共存密码笔记05逻辑

1. 困难问题 1.1. 管理政府或教授分子生物学之类的问题要困难得多 1.2. 这些环境很复杂&#xff0c;大部分是不可观察的&#xff08;一个国家的状态&#xff0c;一个学生的思想状态&#xff09;&#xff0c;还有更多的对象和对象类型&#xff0c;对动作…

云上战场:ToDesk云电脑、青椒云、顺网云全面对决

前言 记得端午放假期间&#xff0c;我已经在旅游的路上了&#xff0c;老板突然发短信&#xff0c;让我给他画个图&#xff0c;我手上的战斗机已经是十年前的老古董了(平常一直用的公司电脑&#xff0c;也没想过要换)&#xff0c;压根满足不了老板的任务要求&#xff0c;不得已&…

了解振弦采集仪在建筑物安全监测中的应用与研究

了解振弦采集仪在建筑物安全监测中的应用与研究 摘要&#xff1a;河北稳控科技振弦采集仪是一种常用的结构物安全监测设备&#xff0c;广泛应用于建筑物、桥梁、塔楼等工程结构的监测。本文将从振弦采集仪的原理、应用案例和研究进展等方面进行详细介绍&#xff0c;以便更好地…

ClickHouse安装与下载22.3.2.2

ClickHouse安装与下载 目录 1. ClickHouse简介 1.1 ClickHouse优点&#xff1a; 1.2 ClickHouse缺点&#xff1a; 1.3 ClickHouse引擎&#xff1a; 1.3.1 数据库引擎 1.3.2 表引擎 2. ClickHouse下载安装 2.1 ClickHouse下载安装 2.2 ClickHouse使用 1. ClickHouse简…

2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)

2024最新IDEA插件开发&#xff08;发布&#xff09;-SelectCamelWords[选中驼峰单词]&#xff08;idea源代码&#xff09; 参考文档 Jetbrains Idea插件开发文档: https://plugins.jetbrains.com/docs/intellij/welcome.html代码地址&#xff1a;https://github.com/yangfeng…

RIP路由协议汇总、版本兼容、定时器、协议优先级配置(华为)

#交换设备 RIP路由协议汇总 一、原理概述 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。路由汇总的原理是&#xff0c;同一个自然网段内的…

Java每日作业day6.18

ok了家人们今天我们继续学习方法的更多使用&#xff0c;闲话少叙&#xff0c;我们来看今天学了什么 1.重载 在同一个类中&#xff0c;可不可以存在同名的方法&#xff1f;重载:在同一个类中&#xff0c;定义了多个同名的方法&#xff0c;但每个方法具有不同的参数类型或参数个…

ClickHouse 高性能的列式数据库管理系统

ClickHouse是一个高性能的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;。以下是对ClickHouse的详细介绍&#xff1a; 基本信息&#xff1a; 来源&#xff1a;由俄罗斯的Yandex公司于2016年开源。全称&…

DDP算法之线性化和二次近似(Linearization and Quadratic Approximation)

DDP算法线性化和二次近似 在DDP算法中,第三步是线性化系统动力学方程和二次近似代价函数。这一步是关键,它使得DDP能够递归地处理非线性最优控制问题。通过线性化和二次近似,我们将复杂的非线性问题转换为一系列简单的线性二次问题,逐步逼近最优解。通过这些线性化和二次近…

R语言做图

目录 1. 图形参数 2. 低级图形 3. 部分高级图形 参考 1. 图形参数 图形参数用于设置图形中各种属性。 有些参数直接用在绘图函数内&#xff0c;如plot函数可以用 pch&#xff08;点样式&#xff09;、col&#xff08;颜色&#xff09;、cex&#xff08;文字符号大小倍数&…

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

48-1 内网渗透 - 内核漏洞提权

权限提升 提权是指将普通用户的权限进行提升,也叫特权提升。在渗透测试中,通过利用各种漏洞提升webshell权限以夺得服务器权限。 系统内核漏洞提权 当目标系统存在已知的内核漏洞且没有更新安全补丁时,攻击者可以利用这些漏洞进行提权,从而获得系统级别的访问权限。 ###…

【记录45】【案例】echarts 柱状图3D效果

环境 echarts4.1.0 <template> <!-- 商场各楼层统计 --><div id"threethree"></div> </template><script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {…

Python基础用法 之 运算符

1.算数运算符 符号作用说明举例加与“”相同 - 减与“-”相同*乘 与“ ”相同 9*218/除 与“ ”相同 9/24.5 、6/32.0//求商&#xff08;整数部分&#xff09; 两个数据做除法的 商 9//24%取余&#xff08;余数部分&#xff09; 是两个数据做除法的 余数 9%21**幂、次方2**…

vue3-父子通信

一个简单的vue3子组件调用父组件方法的demo <template> <div> <h2>Parent Component父组件</h2> <ChildComponent notify-parent"handleParentMethod" /> </div> </template> <script> import { ref } fr…

三星S20以上手机中的动态相片及其分解

三星S20以后的相机&#xff0c;相机拍出来的图片&#xff0c;用三星手机自带的“相册”打开之后&#xff0c;还会有“查看动态照片”的选项&#xff0c;点击之后就能查看拍照片时前后2秒左右的视频&#xff01; 不知道这个功能是不是三星独有的。 这样得到的图片非常大。因为…

用python实现多文件多文本替换功能

用python实现多文件多文本替换功能 今天修改单位项目代码时由于改变了一个数据结构名称&#xff0c;结果有几十个文件都要修改&#xff0c;一个个改实在太麻烦&#xff0c;又没有搜到比较靠谱的工具软件&#xff0c;于是干脆用python手撸了一个小工具&#xff0c;发现python在…

RabbitMQ 相关概念

引言 什么是消息中间件 消息是指在应用间传送的数据&#xff0c;包含文本字符串、JSON等。消息队列中间件&#xff08;MQ&#xff09;指利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型…