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.mfbz.cn/a/722253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件工程】【22.10】p2

关键字&#xff1a; 软件开发基本途径、初始需求发现技术、UML表达事物之间关系、RUP需求获取基本步骤、项目过程建立涉及工作、项目规划过程域的意图和专用目标 判定表、分支覆盖、条件覆盖 三、简答 四、应用 这里条件覆盖有待商榷

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 公司园区参观路径统计(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Android矩阵Matrix setRectToRect实现标准scaleType中心缩放centerCrop,Kotlin

Android矩阵Matrix setRectToRect实现标准scaleType中心缩放centerCrop&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http:…

The First项目报告:深度解读Layer 2生态zkSync

zkSync发币了&#xff0c;这个无数撸毛党心心念念数年之久的项目终于要来了&#xff0c;zkSync 是由Matter Labs 于2019 年推出的以太坊Layer 2 扩容解决方案&#xff0c;作为L2龙头项目之一&#xff0c;与其同属一个层次的L2四大天王之三Optimism、Arbitrum、zkSync、StarkNet…

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

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

网关助力边缘物联网

网关助力边缘物联网 在探讨网关如何助力边缘物联网&#xff08;IoT&#xff09;的议题时&#xff0c;我们不得不深入分析这一技术交汇点的复杂性与潜力。边缘计算与物联网的融合&#xff0c;通过将数据处理与分析能力推向网络边缘&#xff0c;即数据生成的地方&#xff0c;极大…

127.0.0.1与本机IP地址的区别

大家好&#xff0c;今天我们来聊聊一个在网络世界中常常被提及&#xff0c;但可能对于非专业人士来说还有些模糊的概念——127.0.0.1与本机IP地址。这两个地址在网络通信中都扮演着重要的角色&#xff0c;但它们之间又有着怎样的区别呢&#xff1f;让我们一起来探究一下。 一、…

java 面试题--基础

文章目录 基础java SE 、 EE 、 ME 的区别jdk 和 jre 区别&#xff1f;java 的日志级别基本数据类型 特性关键字finalabstractsuperswitchfortry catch 接口和抽象类的区别接口抽象类适用场景 类的加载循序静态代码块 传参问题访问修饰符运算符 反射java 里的应用为什么反射的性…

Vue62-配置代理-方式一

一、业务场景 有两个服务器&#xff1a; 二、可用的ajax请求 推荐使用&#xff1a;axios。 三、axios发送请求 报错原因&#xff1a;跨域&#xff0c;违背了同源策略&#xff1a;协议名&#xff0c;主机名&#xff0c;端口号&#xff01; 四、同源策略 4-1、跨域请求问题…

SpringMVC系列四: Rest-优雅的url请求风格

Rest请求 &#x1f49e;Rest基本介绍&#x1f49e;Rest风格的url-完成增删改查需求说明代码实现HiddenHttpMethodFilter机制注意事项和细节 &#x1f49e;课后作业 上一讲, 我们学习的是SpringMVC系列三: Postman(接口测试工具) 现在打开springmvc项目 &#x1f49e;Rest基本介…

云徙科技助力竹叶青实现用户精细化运营,拉动全渠道销售额增长

竹叶青茶以其别具一格的风味与深厚的历史底蕴&#xff0c;一直被誉为茶中瑰宝。历经千年的传承与创新&#xff0c;竹叶青不仅坚守着茶叶品质的极致追求&#xff0c;更在数字化的浪潮中&#xff0c;率先打破传统&#xff0c;以科技力量赋能品牌&#xff0c;成为茶行业的领军者。…

甘特图如何画以及具体实例详解

甘特图如何画以及具体实例详解 甘特图是一种常见的项目管理工具又称为横道图、条状图(Bar chart)。是每一位项目经理和PMO必须掌握的项目管理工具。甘特图通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。但是多项目经理和PMO虽然考了各种证…

ElasticSearch学习篇13_《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…

Git的下载安装及可视化工具小乌龟

一、 Git 的下载 第1步&#xff1a;下载Git&#xff0c;下载地址&#xff1a;Git for Windows 这个就需要去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com或者gitforwindows.org&#xff0c;或者阿里镜像&#xff08;感谢评论区的星悸迷航同学&#…

Linux之旅: 基础知识点的终极指南

文章目录 1、Linux的目录结构2、ls命令3、管理文件和目录4、linux命令使用细节和技巧5、权限管理基本命令6、搜索命令7、管道符与重定向8、压缩和解压命令9、用户及vim编辑器10、用户和用户组管理一、Linux系统用户账号的基本管理二、Linux系统用户组的管理 1、Linux的目录结构…

【Docker安装】Ubuntu系统下部署Docker环境

【Docker安装】Ubuntu系统下部署Docker环境 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、部署Docker环境4.1 安装Docker4.2 检查Docker版本4.3 配置Docker镜像加速4.4 启动Doc…

yolov9-pytorch 深度学习目标检测算法模型

YOLOv9 论文 https://arxiv.org/abs/2402.13616 模型结构 YOLOv9将可编程梯度信息 (PGI) 概念与通用 ELAN (GELAN)架构相结合而开发&#xff0c;代表了准确性、速度和效率方面的重大飞跃。 算法原理 Yolov9将可编程梯度信息&#xff08;PGI&#xff09;和GLEAN&#xff08…

分数限制下,选好专业还是选好学校

目录 1.概述 1.1.综合考虑 1.2.个人经验分享 2.专业解析 2.1. 计算机科学与技术 2.2. 英语 2.3. 法学 2.4.专业VS学校 2.5.建议 3.名校效应分析 3.1. 名校声誉&#xff08;品牌效应&#xff09; 3.2. 资源获取 3.3. 学术氛围 3.4. 就业优势 3.5.小结 4.好专业和…

VPC Access Connector 介绍 - 让 Non-VPC product 也可以访问VPC Network内的资源

什么是VPC product 和 非 VPC product 在GCP 上&#xff0c; VPC product 指的是属于某个制定的vpc subnet, 具有至少1个 该 subnet 的内网ip的产品 常见的例如: compute engine / MIG &#xff08;managed instances group)某些dataflow job (指定了 可选参数subnet )Cloud …

python基础语法学习(工程向)-Stage3-数据可视化

json 是一种轻量的数据交互格式&#xff0c;可以按照json指定的格式去组织和封装数据&#xff0c;而本质上是一个带有特定格式的字符串。 功能 json是在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言之间的数据传递和交互。 格式 json的格式要求较为严格&#…