JVM工具使用(jstack + jstat + jmap)

news2024/11/17 7:56:47

jstack:

jstack是java虚拟机自带的一种堆栈跟踪工具

命令格式:

jstack [-l] pid (pid 可以使用jps查看)

例:jstack 44076 &>$(date +%H%M)_44076.jstack.log

线程状态:

  • NEW,未启动的。不会出现在Dump中
  • RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁
  • BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)给block住了
  • WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(), join() 等语句里
  • TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)
  • TERMINATED,已退出的


以下表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。修饰上方的方法调用。

  • locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
  • waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。
  • waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。
  • parking to wait for <地址> 目标


线程状态产生的原因:

  • runnable:状态一般为RUNNABLE
  • in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING
  • waiting for monitor entry:进入区等待,状态为BLOCKED
  • waiting on condition:等待区等待、被park
  • sleeping:休眠的线程,调用了Thread.sleep()

jstat

jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;

特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。

命令格式:

jstat -gcutil pid interval(ms)

举例:

jstat -gcutil  16361 1000

线上服务器的GC情况如下:

参数说明如下:

  • S0: 新生代中Survivor space 0区已使用空间的百分比
  • S1: 新生代中Survivor space 1区已使用空间的百分比
  • E: 新生代已使用空间的百分比
  • O: 老年代已使用空间的百分比
  • P: 永久带已使用空间的百分比

  • YGC: 从应用程序启动到当前,发生Yang GC 的次数
  • YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
  • FGC: 从应用程序启动到当前,发生Full GC的次数
  • FGCT: 从应用程序启动到当前,Full GC所用的时间
  • GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

参考:jstat -gcutil 命令使用-CSDN博客


jmap

jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有“对象”的情况(如:产生那些对象,及其数量)

命令格式:

jamp -heap pid:查看java堆使用情况

jmap -histo pid:查看堆内存中的对象数量,大小

jmap -histo:live pid:可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -histo:live 这个命令 JVM会先触发gc,然后再统计信息

jmap -finalizerinfo pid:打印正在等候回收的对象信息

 

jmap -dump:live,format=b,file=a.log pid

内存信息dump到a.log文件中,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用

案例:

jmap -heap 15

结果
Attaching to process ID 15, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.262-b10

using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC  ##同步并行垃圾回收

Heap Configuration:  ##堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
   MinHeapFreeRatio         = 40  ##最小堆使用比例
   MaxHeapFreeRatio         = 70  ##最大堆可用比例
   MaxHeapSize              = 536870912 (512.0MB)  ##最大堆空间大小
   NewSize                  = 268435456 (256.0MB)  ##新生代分配大小
   MaxNewSize               = 268435456 (256.0MB)  ##最大可新生代分配大小
   OldSize                  = 268435456 (256.0MB)  ##老年代大小
   NewRatio                 = 2  ##新生代比例
   SurvivorRatio            = 8  ##新生代与suvivor的比例
   MetaspaceSize            = 21807104 (20.796875MB)  ##元空间大小 元空间本质跟永久代类似,元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存,因此,元空间大小仅受本地内存限制
   CompressedClassSpaceSize = 1073741824 (1024.0MB)  
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:  ##堆使用情况【堆内存实际的使用情况】
New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区Eden区 + 幸存区survior(1+2)空间)
   capacity = 241631232 (230.4375MB)  ##伊甸区容量
   used     = 191127136 (182.27304077148438MB)  ##已经使用大小
   free     = 50504096 (48.164459228515625MB)  ##剩余容量
   79.09868869931516% used  ##使用比例
Eden Space:  ##伊甸区
   capacity = 214827008 (204.875MB)
   used     = 170204912 (162.32005310058594MB)
   free     = 44622096 (42.55494689941406MB)
   79.22882396611882% used
From Space:  ##survior1区
   capacity = 26804224 (25.5625MB)
   used     = 20922224 (19.952987670898438MB)
   free     = 5882000 (5.6095123291015625MB)
   78.05569749006723% used
To Space:  ##survior2 区
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation:  ##老年代使用情况
   capacity = 268435456 (256.0MB)
   used     = 146936152 (140.12923431396484MB)
   free     = 121499304 (115.87076568603516MB)
   54.73798215389252% used

36399 interned Strings occupying 4146712 bytes.

histo的参数说明:

                instances(实例数)、bytes(大小)、classs name(类名)

它基本是按照使用使用大小逆序排列的

jmap -histo:live 15

 num     #instances         #bytes  class name
----------------------------------------------
   1:         11717       55996520  [Ljava.util.HashMap$Node;
   2:        142072       17500168  [C
   3:         20197       16779088  [B
   4:        141493        3395832  java.lang.String
   5:        104965        3358880  java.util.concurrent.ConcurrentHashMap$Node
   6:         50269        2495760  [Ljava.lang.Object;
   7:         51898        2491104  java.util.HashMap
   8:         20599        2270160  java.lang.Class
   9:         24224        2131712  java.lang.reflect.Method
  10:         12309        1717872  [I
  11:         52769        1266456  java.util.ArrayList
  12:         29598        1183920  java.util.LinkedHashMap$Entry
  13:           434         987264  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  14:         51193         819088  java.lang.Object
...
Total       1189759      129611872
#instance 是对象的实例个数 
#bytes 是总占用的字节数 
#class name 对应的就是 Class 文件里的 class 的标识 
B 代表 byte
C 代表 char
D 代表 double
F 代表 float
I 代表 int
J 代表 long
Z 代表 boolean
前边有 [ 代表数组, [I 就相当于 int[]
对象用 [L+ 类名表示

注意:

(1)jmap -histo命令 只知道某个class name占用了那么大的内存,但不知道由什么对象创建的。下一步需要将其他dump出来,使用内存分析工具进一步明确它是由谁引用的、由什么对象。

(2)jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

  • -F 强迫.在pid没有响应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  • -h | -help 打印辅助信息
  • -J 传递参数给jmap启动的jvm

 jmap使用举例:

  1. 使用jps查看线程ID
  2. 使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
  3. 使用jstat -gccause pid:额外输出上次GC原因
  4. 使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

内存泄露定位过程(Memory Analyzer Tool :MAT)

打dump:jmap -dump:format=b file=yarn.dump.log 1590   

之后用MemoryAnalyzer.exe分析(Memory Analyzer Tool)

利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露_java内存泄露分析插件-CSDN博客​

参考:利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露_java内存泄露分析插件-CSDN博客

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

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

相关文章

LIO-SAM算法解析

文章目录 简介算法概述1.点云去畸变1.1 主要功能1.2 主要流程 2.特征提取3.IMU预积分4.地图优化5.算法评估 简介 LIO-SAM在lego-loam的基础上新增了对IMU和GPS的紧耦合&#xff0c;采用一个因子图对位姿进行优化&#xff0c;包括IMU因子&#xff0c;激光里程计因子&#xff0c…

企业如何选择设备管理系统?

1、需求为王&#xff0c;列出你的需求清单 每个企业的设备都不尽相同&#xff0c;自然对设备管理系统的需求也不一样。因此&#xff0c;需要充分明确自己的需求和目标&#xff0c;清晰地列出需求清单&#xff0c;然后再逐一对照供应商的产品功能&#xff0c;看是否满足自身各业…

leetCode 76. 最小覆盖子串 + 滑动窗口 + 图解(详细)

76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻…

【AICFD案例操作】潜艇阻力AI预测分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

3D开发工具HOOPS:助力Navisworks数据处理与3D模型可视化!

在过去的25年中&#xff0c;Tech Soft 3D一直以其卓越的3D技术不断帮助全球600多家客户实现创新&#xff0c;这些客户包括HEXAGON、SolidWorks、SIEMENS、Aras、ANSYS、AVEVA等各行业领军企业。 该公司拥有四款原生产品&#xff0c;分别是&#xff1a;HOOPS Exchange、HOOPS C…

程序员就业时要考虑什么?

要考虑的事情可多了&#xff0c;但很多毕业生都没有这个意识&#xff0c;光想着把自己给卖了。 我还记得自己刚毕业那年&#xff0c;光想着工资高&#xff0c;结果进了熬夜“大班”——一家外包公司。有项目的时候真不是996这么简单&#xff0c;每天是9126&#xff0c;赶上中秋…

jsp获取数据 jsp直接获取后端数据 获取input选中的值 单选 没 checked属性

let str0${showList}; let str1${showList}; 然后可以通过JSON.parse() 转 获取input选中的值 //goodsType 按类别 goods按货品var oneType $("input[ namecriteria1 ] ").val();//count按数量 totalprice按费用var twoType $("input[ namecriteria2 ] &q…

如何选择合适的全渠道智慧收银解决方案?亿发推荐智能收银一体化系统

在数字化时代&#xff0c;品牌面临着越来越多的挑战和机遇。为了更好地适应市场的变化&#xff0c;提高竞争力&#xff0c;越来越多的企业选择引入新零售经营解决方案&#xff0c;以实现定制化的用户运营&#xff0c;沉淀私域流量池&#xff0c;提升流量的高效转化,形成一个完善…

elementUI 特定分辨率(如1920*1080)下el-row未超出一行却换行

在1920*1080分辨率下&#xff0c; el-col 内容未超出 el-col 宽度&#xff0c;el-col 不足以占据一行&#xff0c;el-row 却自动换行了&#xff08;其他分辨率没有这个问题&#xff09;。 截图&#xff1a; 排查&#xff1a; el-col 内容没有溢出&#xff1b;没有多余的 pad…

一次不接受官方建议导致的事故

记录一下 一次Elasticsearch集群事故分析、排查、处理 背景介绍 事故发生的ElasticSearch集群共有7台机器&#xff1a; 10.163.204.19310.163.204.19410.163.204.19510.163.220.7310.163.220.7410.163.220.22010.163.220.221 其中193、194、195的机器配置一样&#xff0c;具…

Boris FX Mocha Pro 2023:Mac/win全能影像处理神器

Boris FX Mocha Pro 2023是一款广受欢迎的影像处理软件&#xff0c;它凭借其强大的功能和卓越的性能&#xff0c;成为了影视后期、广告制作、动画设计等领域的必备工具。无论您是专业的影视制作人员&#xff0c;还是初入行的新手&#xff0c;Boris FX Mocha Pro 2023都能为您的…

医院安全(不良)事件管理系统源代码(B/S架构):事件全程监管 质量持续改进

医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要对象&#xff0c;可以自动、及时、实际地反应医院的安全、不良、近失事件的情况&#xff0c;更好地掌握不良事件的…

三、【常用的几种抠图方式二】

文章目录 橡皮擦魔术橡皮擦背景橡皮擦选择被遮住&#xff08;调整边缘&#xff09;主体抠图 橡皮擦 直接擦除图片的像素&#xff0c;或者填充背景色&#xff0c;适用于要求不高的图片。 魔术橡皮擦 擦出颜色相近的内容&#xff0c;适用于主体跟背景颜色相差较大的情况&#x…

conda 实践

1. 环境部署 1.1. 下载 anaconda 安装包 下面这个网址查找自己需要的版本 https://repo.anaconda.com/archive/ 或者手动下载。 wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh 1.2. 执行安装程序 #安装依赖&#xff1a; sudo yum install bzip2…

手把手教你入门Three.js(初识篇)

Three.js入门篇 一、Three.js和webGL的介绍二、开发和学习环境三、 三个基本概念1. 场景Scene2. 相机Camera3. 渲染器Renderer 四、三维坐标系五、材质Material六、光源1. 点光源2. 环境光3. 平行光: 七、常见几何体八、渲染器-设置设备像素比九、渲染器-锯齿属性 一、Three.js…

8年经验之谈 —— Redis的性能测试与优化!

Redis作为一种高性能的Key-Value数据库&#xff0c;一直受到众多开发者和企业的青睐。然而&#xff0c;在高并发、大数据存储的应用场景中&#xff0c;如何测试并优化Redis的性能&#xff0c;成为了问题。本文将从测试与优化两个方面来讲解如何达到最优的Redis性能。 一、性能…

ae如何去除视频水印?分享三个简单的方法!

ae如何去除视频水印&#xff1f; 去除视频水印可以提高视频的质量、改善视频的流畅度&#xff0c;并减少视频文件的大小&#xff0c;方便观看&#xff0c;那么如何去除视频水印呢&#xff1f;下面是三种方法推荐&#xff0c;一起来看看吧&#xff5e; 方法一&#xff1a;使用A…

NUUO摄像头远程命令执行漏洞复现 [附POC]

文章目录 NUUO 摄像头远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 NUUO 摄像头远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff…

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …