JVM调优(一)——JVM调优诊断工具详解

        最近项目要生产上线,正在做压测性能测试,开始进行一些性能瓶颈分析,记得上一次做性能分析优化,还是国网项目,针对Kafka,Canal,ES,服务,数据库等一系列的排查分析,后面打算补一下总结内容,感兴趣的可以看我后期的总结。本次先总结一下最基础的相关命令及详解

        常用到的命令主要有jstack、jstat、jmap、jinfo等

1、jinfo命令

        jinfo全称Configuration Info for Java,是用来查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。开发人员可能不知道某一个具体的Java虚拟机参数的默认值。通过 jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。

        jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值, 甚至可以在运行时修改部分参数,并使之立即生效。并不是所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。这个修改能力是极其有限的。

        下面简单介绍一下常用命令:

 1)  jinfo flags <PID>

 jinfo flags <PID>

可以看到不主动配置JVM参数时,系统默认的一些配置信息,然后我们指定配置后查看

 -Xms512m  -Xmx1024m

 jinfo –flags <PID>

 2)  jinfo -sysprops <PID>

jinfo -sysprops <PID>

查看java系统参数 

2、jmap命令 

        jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。如果给定的进程运行在64位虚拟机上,则必须指定 -J-d64选项,例如jmap -J-d64 -heap pid。

        参数说明

        <no option>

当不使用选项时,jmap打印共享对象映射。

对于加载到目标JVM中的每个共享对象,将打印其开始地址、映射大小和共享对象文件的完整路径。如图:

1)  -dump

-dump:[live],format=b,file=<filename>.hprof  <PID> 

将Java堆以hprof二进制格式转储到filename文件中。live是可选参数,如果指定,则只转储堆中的活动对象。

可以使用jhat (Java Heap Analysis Tool)工具来读取分析生产dump文件。启动jhat服务器 

 

 访问显示如图:

 Jhat分析内容,下次有机会再说明,先往下走

2)  -finalizerinfo <PID>

jmap -finalizerinfo <PID>

 打印等待结束的对象的信息。

3)  -heap <PID>

 jmap -heap <PID>

 打印堆摘要

这个命令相对用的较多,具体说明记录一下

使用的gc垃圾收集器

一、Heap Configuration(堆的配置)

Heap Configuration(堆的配置)
MinHeapFreeRatio

空闲堆空间的最小百分比,值的区间为0到100,默认值为 40。

计算公式为:HeapFreeRatio =(CurrentFreeHeapSize / CurrentTotalHeapSize) * 100。

如果当前HeapFreeRatio < MinHeapFreeRatio,则需要进行堆扩容,扩容的时机应该在每次垃圾回收之后。

MaxHeapFreeRatio

空闲堆空间的最大百分比,值的区间为0到100,默认值为 70。

计算公式为:HeapFreeRatio =(CurrentFreeHeapSize / CurrentTotalHeapSize) * 100。

如果HeapFreeRatio > MaxHeapFreeRatio,则需要进行堆缩容,缩容的时机应该在每次垃圾回收之后。

MaxHeapSize堆空间允许的最大值。
NewSize新生代堆空间的默认值。
MaxNewSize新生代堆空间允许的最大值。
OldSize老年代堆空间的默认值。
NewRatio新生代(2个Survivor区和Eden区 )与老年代(不包括永久区)的堆空间比值。
SurvivorRatio两个Survivor区和Eden区的堆空间比值,默认是8,表示 S0 : S1 :Eden = 1:1:8。
MetaspaceSize元空间的默认值
CompressedClassSpaceSize压缩类空间大小
MaxMetaspaceSize元空间允许的最大值
G1HeapRegionSize在使用 G1 垃圾回收算法时,JVM会将Heap空间分隔为若干个Region,该参数用来指定每个 Region 空间的大小

 

  1. 二、Heap Usage(堆的使用情况)
  2. Heap Usage(堆的使用情况)
    PS Young Generation (Eden + 1 Survivor Space)新生代的使用情况
    Eden Space

    Eden区的使用情况

    From SpaceFrom Survivor区的使用情况
    To Spaceto Survivor区的使用情况
    PS Old Generation老年代的使用情况

    说明:

    capacity表示该区域的总容量

    used表示已使用的容量

    free表示该区域还剩余容量

    used表示该区域的使用比例

4)  -histo[:live] <PID> 

jmap -histo <PID> 

打印堆的直方图。对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定类名。VM内部类名以'*'前缀打印,即打印出来的类名前带*的是VM的内部类。如果指定了live子选项,则只统计活动对象。可以输出到文件中打开。

 

num:序号

instances:实例数量

bytes:占用空间大小

class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] 

5)  -clstats <PID>

jmap -clstats <PID>

打印类加载器的统计信息。对于每个类加载器,它的名称、活动状态、地址、父加载器以及已加载的类的数量和大小都将被打印出来。也会打印出internned string的数量和大小。

 6)  -F

    如果pid没有响应,则使用jmap -dump 或 jmap -histo命令。遇到过不能open file的时候,可以通过加-F,强制输出。

7)  -help or -h

 打印jmap命令的帮助信息。

8)  -J<flag>

将<flag>传递给运行jmap的Java虚拟机

3、jstack命令

        该命令比较常用,用来检测死锁,CPU高等

        用jstack查找死锁

   1)  查找死锁

    jstack -l <PID>

说明:

"Thread-5" 线程名

prio=5 优先级=5

tid= 0x00007fcae8185000线程id

nid= 0xbf8线程对应的本地线程标识nid

runnable 线程状态

可以看到是哪里出现了死锁,所在的类及其行数

2)  远程连接jvisualvm

启动普通的jar程序JMX端口配置:

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8899

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false 

tomcat的JMX配置

JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8899

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false 

jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙

 

3)  输出文件分析

  jstack –l <PID> > jatack.log

  printf "%x\n" <tid>

 根据PID输出快照线程,找到CPU最高的线程,10进制转16进制,找对应的线程 状态分析代码

如:

grep "dca" jstack.log -A 20

4、jstat命令 

     jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]

   1)  垃圾回收统计

 jstat -gc <pid> 

 最常用,可以评估程序内存使用及GC压力整体情况

更多的是使用,多久打印一次,共打印多少次

jstat -gc <pid>  <interval>  <count>

S0C:第一个幸存区的大小

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法区大小(元空间)

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间,单位s

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间,单位s

GCT:垃圾回收消耗总时间,单位s 

2)  堆内存统计 

jstat -gccapacity <PID>

 

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0C:第一个幸存区大小

S1C:第二个幸存区的大小

EC:伊甸园区的大小

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:当前老年代大小

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代gc次数

FGC:老年代GC次数

 

 3)  新生代垃圾回收统计

jstat -gcnew <PID>

 

S0C:第一个幸存区的大小

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

TT:对象在新生代存活的次数

MTT:对象在新生代存活的最大次数

DSS:期望的幸存区大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间 

4)  新生代内存统计 

jstat -gcnewcapacity <PID>

 

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:当前新生代容量

S0CMX:最大幸存1区大小

S0C:当前幸存1区大小

S1CMX:最大幸存2区大小

S1C:当前幸存2区大小

ECMX:最大伊甸园区大小

EC:当前伊甸园区大小

YGC:年轻代垃圾回收次数

FGC:老年代回收次数 

5)  老年代垃圾回收统计 

jstat -gcold <PID>

 

MC:方法区大小

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

OC:老年代大小

OU:老年代使用大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

6)  老年代内存统计

jstat -gcoldcapacity <PID>

 

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:当前老年代大小

OC:老年代大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间 

7)  元数据空间统计

jstat -gcmetacapacity <PID> 

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

 

8)  占比查看

jstat -gcutil <PID> 

 

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

ok,基本上常用的和不常用的都简单记录了下,也不是时时刻刻都在做性能优化,在需要的时候能有个对照就OK了 ,下一个就是针对具体的问题进行查找跟踪分析了,如果不借助工具的情况下,可以通过上述这些命令组合进行分析。

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

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

相关文章

安全和加密常识(6)Base64编码方式

文章目录 什么是 Base64编码原理编解码示例应用什么是 Base64 Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处…

Windows系统下文件夹权限详解

文章目录 问题描述文件夹属性 问题描述 今天在Win10系统下&#xff0c;实现文件夹设置权限&#xff0c;具体的方案的涉及到我们公司内部的一款加密软件&#xff0c;不太方便透漏&#xff0c;借此机会&#xff0c;我也重新的回顾下windows系统下的文件夹权限 文件夹属性 打开…

vue3+Ts封装axios网络请求

1.安装axios npm i axios 在package.json中检查axios是否安装成功 "dependencies": {"axios": "^1.7.2","vue": "^3.4.29","vue-router": "^4.4.0"}, 2.新建文件 新建文件utils/request.ts import…

Java 并发编程常见问题

1、线程状态它们之间是如何扭转的&#xff1f; 1、谈谈对于多线程的理解&#xff1f; 1、对于多核CPU&#xff0c;多线程可以提升CPU的利用率&#xff1b; 2、对于多IO操作的程序&#xff0c;多线程可以提升系统的整体性能及吞吐量&#xff1b; 3、使用多线程在一些场景下可…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputDevice (输入设备)】

输入设备 输入设备管理模块&#xff0c;用于监听输入设备连接、断开和变化&#xff0c;并查看输入设备相关信息。比如监听鼠标插拔&#xff0c;并获取鼠标的id、name和指针移动速度等信息。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&…

【算法专题--栈】用队列实现栈 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐两个队列实现栈 &#x1f95d;解题思路 &#x1f34d;案例图解 ⭐用一个队列实现栈 &#x1f347;解题思路 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 用队列实现栈 这道题&#xff0c;可以说是--栈…

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

《昇思25天学习打卡营第14天 | 昇思MindSpore基于MindNLP+MusicGen生成自己的个性化音乐》

14天 本节学了基于MindNLPMusicGen生成自己的个性化音乐。 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本。 MusicGen模型基于Transformer结构&#xff0c;可以分解为三个不同的阶段…

⭐ UI自动化工具轻松实现微信消息提醒 ⚡

&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f; 演示效果 &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f; &#x1f605;&#x1f605;&#x1f605;&#x1f605;&#x1f605;&#x1f605; Python安装…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路&#xff0c;可以省略&#xff1b;rst引脚电路&#xff0c;可以省略&#xff0c;boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试&#xff0c;只为了学习istio&#xff0c;更好的理解istio中的控制面和数据面&#xff08;pilot -> proxy&#xff09;是如何交互的&#xff0c;下图的蓝色虚线 先说go-control-plane是什么…

nginx 1024 worker_connections are not enough while connecting to upstream

现象 请求api响应慢&#xff0c;甚至出现504 gateway timeout&#xff0c;重启后端服务不能恢复&#xff0c;但重启nginx可以恢复。 解决方案 worker_connections使用了默认值 1024&#xff0c;当流量增长时&#xff0c;导致连接不够 在nginx.conf中修改连接数就可以了&…

小白学python(第四天)顺序与分支篇

这几天因为个人原因&#xff0c;python篇会更新比较慢&#xff0c;还望大家谅解&#xff0c;那么废话不多说&#xff0c;我们现在就进入正题 顺序篇 这个没啥好说的&#xff0c;就是自上而下&#xff0c;依次执行 分支篇 条件&#xff08;if&#xff09;语句语法格式&#…

【C++】————string基础用法及部分函数底层实现

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月30日 前言&#xff1a; 本文主要介绍STL容器之一 ---- string&#xff0c;在学习C的过程中&#xff0c;我们要将C视为一个语言联邦&#xff08;摘录于Effective C 条款一&#x…

实验6 形态学图像处理

1. 实验目的 ①掌握数字图像处理中&#xff0c;形态学方法的基本思想&#xff1b; ②掌握膨胀、腐蚀、开运算、闭运算等形态学基本运算方法&#xff1b; ③能够利用形态学基本运算方法&#xff0c;编程实现图像去噪&#xff0c;边界提取等功能。 2. 实验内容 ①调用Matlab /…

PMBOK® 第六版 结束项目或阶段

目录 读后感—PMBOK第六版 目录 不论是阶段的收尾还是项目整体的收尾&#xff0c;都应是令人振奋的事。然而&#xff0c;在实际生活中&#xff0c;收尾工作却相当艰难。会遭遇负责人调离、换任&#xff0c;导致不再需要已购产品&#xff1b;项目收尾时对照招标文件或合同&…

51-61 CVPR 2024 最佳论文 | Rich Human Feedback for Text-to-Image Generation

23年12月&#xff0c;加州大学圣地亚哥、谷歌研究院、南加州大学、剑桥大学联合发布Rich Human Feedback for Text-to-Image Generation论文。 作者受大模型中RLHF技术的启发&#xff0c;用人类反馈来改进Stable Diffusion等文生图模型&#xff0c;提出了先进的RichHF-18K数据…

足球虚拟越位线技术FIFA OT(一)

此系列文章用于记录和回顾开发越位线系统的过程&#xff0c;平时工作较忙&#xff0c;有空时更新。 越位线技术 越位技术已被用于图形化分析足球中潜在的越位情况。 自 2018 年将视频助理裁判 &#xff08;VAR&#xff09; 引入比赛规则以来&#xff0c;人们越来越关注准确确…

完美世界|单机版合集(共22个版本)

前言 我是研究单机的老罗&#xff0c;今天给大家带来的是完美世界的单机版合集&#xff0c;一共22个版本。本人亲自测试了一个版本&#xff0c;运行视频如下&#xff1a; 完美世界|单机版合集 先看所有的版本的文件&#xff0c;文件比较大&#xff0c;准备好空间&#xff0c;差…

Transformer详解encoder

目录 1. Input Embedding 2. Positional Encoding 3. Multi-Head Attention 4. Add & Norm 5. Feedforward Add & Norm 6.代码展示 &#xff08;1&#xff09;layer_norm &#xff08;2&#xff09;encoder_layer1 最近刚好梳理了下transformer&#xff0c;今…