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

news2024/12/28 4:55:47

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.coloradmin.cn/o/1835815.html

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

相关文章

Java 开发实例:Spring Boot+AOP+注解+Redis防重复提交(防抖)

文章目录 1. 环境准备2. 引入依赖3. 配置Redis4. 创建防重复提交注解5. 实现AOP切面6. 创建示例Controller7. 测试8. 进一步优化8.1 自定义异常处理8.2 提升Redis的健壮性 9. 总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨…

AI从云端到边缘:人员入侵检测算法的技术原理和视频监控方案应用

在当今数字化、智能化的时代&#xff0c;安全已成为社会发展的重要基石。特别是在一些关键领域&#xff0c;如公共安全、智能化监管以及智慧园区/社区管理等&#xff0c;确保安全无虞至关重要。而人员入侵检测AI算法作为一种先进的安全技术&#xff0c;正逐渐在这些领域发挥着不…

怎样打印微信文档文件?

在日常生活和工作中&#xff0c;我们经常需要打印微信中的文档文件&#xff0c;无论是工作资料、学习笔记还是其他重要信息。随着科技的发展&#xff0c;我们不再需要前往打印店进行繁琐的操作&#xff0c;而是可以通过一些便捷的在线打印平台轻松实现。今天&#xff0c;我们就…

git 快速将当前目录添加仓储

一、进入目录 git init git add . git commit -m "init" git remote add origin http://192.168.31.104/root/AutoBuildDemo.git 二、登录gitlab&#xff0c;创建项目AutoBuildDemo 最后执行&#xff1a; git push -u origin master

【C语言】--- 常见调试信息预处理器宏

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【C语言】--- 常见调试信息预处理器宏 开…

如何用Java SE数组实现高速的数字转换功能

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

技术分析:开源大模型的兴起与热门项目推荐

技术分析&#xff1a;开源大模型的兴起与热门项目推荐 引言 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;开源大模型成为了许多程序员和研究人员关注的焦点。开源项目不仅促进了技术的快速迭代和普及&#xff0c;还为更多的人提供了学习和实践的机会。…

推荐常用的三款源代码防泄密软件

三款源代码防泄密软件——安秉源代码加密、Virbox Protector 和 MapoLicensor——确实各自在源代码保护的不同方面有其专长。这些软件可以满足企业对于源代码保护的三大需求&#xff1a;防止泄露、防止反编译和防止破解。 安秉源代码加密&#xff1a; 专注于源代码文件的加密&…

惊艳视觉!7个让你大开眼界的数据可视化案例

数据可视化是指通过视觉呈现信息的一种方式&#xff0c;它仍处于不断演变的过程中。许多企业、政府和其他组织都使用数据可视化分析来寻求保持竞争优势。在界面设计中&#xff0c;数据可视化也呈现出越来越流行的趋势&#xff0c;学习数据可视化也是设计师保持竞争优势的一种方…

进程间通信以及线程的同步互斥机制

1.进程间通信机制 常用的六种通信机制&#xff1a; 管道、消息队列、共享内存、信号灯集、信号、Socket 管道&#xff08;Pipe&#xff09;和无名管道&#xff08;匿名管道&#xff09;&#xff1a; 管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;通常…

AI在医学中神奇应用

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

前端菜鸡学习日记 -- 关于pnpm

哈咯哇大家&#xff0c;我又来了&#xff0c;最近稍微悠闲一些&#xff0c;所以就趁着这个机会学习一些新的知识&#xff0c;今天就是碰巧遇到了pnm&#xff0c;这个可以看作是npm的升级版本&#xff0c;比npm要快&#xff0c;用起来也更得劲更迅速 官网地址&#xff1a;https…

jupyter使用的一个奇怪bug——SyntaxError: invalid non-printable character U+00A0

bug来由&#xff1a;从其他部分例如kaggle里复制来的代码直接粘贴在jupyter notebook里&#xff0c;每一行代码都会出现&#xff1a; Cell In[5], line 1 warnings.filterwarnings(ignore) ^ SyntaxError: invalid non-printable character U00A0 单元格 In[5]&#xff0c;第 …

Rocky Linux 更换CN镜像地址

官方镜像列表&#xff0c;下拉查找 官方镜像列表&#xff1a;https://mirrors.rockylinux.org/mirrormanager/mirrorsCN 开头的站点。 一键更改镜像地址脚本 以下是更改从默认更改到阿里云地址 cat <<EOF>>/RackyLinux_Update_repo.sh #!/bin/bash # -*- codin…

react native中基于webview的腾讯图形验证码

react native中基于webview的腾讯图形验证码 效果实例图第三方库 腾讯验证码 效果实例图 第三方库 npm i react-native-webviewreact-native-webview import React, { useEffect, useState } from react; import { StyleSheet, Text, View } from react-native; import { We…

8.12 矢量图层面要素单一符号使用二(仅渲染中心点)

文章目录 前言仅渲染中心点&#xff08;Centroid fill&#xff09;QGis设置面符号为仅渲染中心点&#xff08;Centroid fill&#xff09;二次开发代码实现仅渲染中心点&#xff08;Centroid fill&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中仅渲染中心点&#xf…

【三】【QT开发应用】VSQT和QTCreator项目互相转化的方法,QTCreator项目转化VSQT,VSQT转化为QTCreator

VSQT和QTCreator项目互相转化的方法 QTCreator项目转化VSQT 环境变量配置 将qmake.exe所在的目录添加到系统path里面. 转化命令 qmake -tp vc xxx.pro 生成.vcxproj文件 环境变量配置 将qmake.exe所在的目录路径添加到系统path中. 接着用cmd命令行转换,可能出现的问题 …

C++ 70 之 类模版中的成员函数,在类外实现

#include <iostream> #include <string> using namespace std;template<class T1, class T2> class Students10{ public:T1 m_name;T2 m_age;Students10(T1 name, T2 age); // 类内声明 类外实现// {// this->m_name name;// this->m_age …

淘宝文件系统-哈希查找分析

一.框架理解 在淘宝文件系统中&#xff0c;通常会将文件索引存储在一块内存中&#xff0c;这块内存包含了若干个主块&#xff08;Index Block&#xff09;。每个主块中存储着多个文件的索引信息。每个文件的索引按照哈希表的形式进行存储&#xff0c;通过哈希值来定位到具体的文…

QPST的使用

QPST&#xff08;Qualcomm Product Support Tool&#xff09;是一个针对高通芯片开发的传输软件。 下载软件 进行安装 安装后使用&#xff0c;QPSTConfig 可以自动抓取dump的log 使用QFile 刷机