JVM监控工具

JVM监控工具

文章目录

    • JVM监控工具
      • jps
      • jmap
        • jmap -histo 进程id
        • jmap -heap 进程id (查看堆信息)
        • jmap -dump:format=b,file=filename.hprof 进程id (将堆当前时刻快照信息dump到文件中)
      • JSTACK
        • jstack 查看死锁信息
        • jstack找出占用cpu最高的线程堆栈信息
      • jinfo
        • 查看jvm参数
        • 查看java系统参数
      • jstat
        • 垃圾回收统计
        • 堆内存统计
        • 新生代内存统计
        • 老年代垃圾回收统计
        • JVM运行情况预估
          • 年轻代对象增长的速率
          • Young GC的触发频率和每次耗时
          • 每次Young Gc后有多少对象存活和进入老年代
          • FuIl GC的触发频率和每次耗时
      • JVISUALVM
      • arthas

jps

查看系统中运行的java进程id

PS D:\practise\test> jps
22672 Jps
13688 RemoteMavenServer36
1068 
14188 TestApplication
PS D:\practise\test> 

jmap

用来查看进行内存信息,实例个数以及占用内存大小

jmap -histo 进程id
PS D:\practise\test> jmap -histo 14188num     #instances         #bytes  class name
----------------------------------------------1:        131071       49867776  [B2:        241900       26780880  [C3:         19253       16120104  [I4:        130495        3131880  java.lang.String5:         22646        1339888  [Ljava.lang.Object;6:         54772        1152528  [Ljava.lang.Class;7:         12544        1103872  java.lang.reflect.Method8:          6356         704152  java.lang.Class9:         10415         583240  jdk.internal.org.objectweb.asm.Item.........3445:             1             16  sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter3446:             1             16  sun.util.resources.LocaleData3447:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
  • instances:对应对象的实例个数

  • bytes:占用内存大小

  • class name:对应的class名称,其中 [B [C [I 代表 byte[],char[], int[]

如 4: 130495 3131880 java.lang.String

代表String对象共有130495个,共张红3131880个字节大小。

jmap -heap 进程id (查看堆信息)
PS D:\practise\test> jmap -heap 14188 Attaching to process ID 14188, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12using thread-local object allocation.
Parallel GC with 10 thread(s)
//堆的配置信息
Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 8547991552 (8152.0MB) //最大堆内存NewSize                  = 178257920 (170.0MB)   //新生代空间MaxNewSize               = 2848980992 (2717.0MB) //最大的新生代空间 (默认新生代占1/3,老年代占2/3)OldSize                  = 356515840 (340.0MB)   //老年代空间NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)//元空间大小CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MB     //元空间最大大小,元空间有动态伸缩机制,可以无限大。G1HeapRegionSize         = 0 (0.0MB)             //G1垃圾收集器region大小
//堆使用信息
Heap Usage:
PS Young Generation
Eden Space:capacity = 134217728 (128.0MB)used     = 98601000 (94.03324127197266MB)free     = 35616728 (33.966758728027344MB)73.46346974372864% used
From Space:  //SURVIVOR区1capacity = 22020096 (21.0MB)used     = 0 (0.0MB)free     = 22020096 (21.0MB)0.0% used
To Space:   //SURVIVOR区2capacity = 22020096 (21.0MB)used     = 0 (0.0MB)free     = 22020096 (21.0MB)0.0% used
PS Old Generationcapacity = 240648192 (229.5MB)used     = 15842152 (15.108253479003906MB)free     = 224806040 (214.3917465209961MB)6.583116984315428% used14390 interned Strings occupying 1282064 bytes.
jmap -dump:format=b,file=filename.hprof 进程id (将堆当前时刻快照信息dump到文件中)
PS D:\practise\test> jmap -dump:format=b,file=test.hprof 14188
Dumping heap to D:\practise\test\test.hprof ...
Heap dump file created
PS D:\practise\test>

利用jvisualvm命令,文件,装入文件,将dump出的文件进行分析
在这里插入图片描述

在这里插入图片描述

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导致导出失败)

-XX: +HeapDumpOnOutOfMemoryError

-XX: +HeapDumpPath=./(导出路径)

public class OomTest {public static List<Object> list = new ArrayList<>();/*** -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump* @param args*/public static void main(String[] args) {while(true){list.add(new Object());}}
}

将oom导出dump文件通过jvisualvm装入打开

在这里插入图片描述

可以看出异常线程

在这里插入图片描述

JSTACK

jstack 进程id

打印java进程详细的堆栈跟踪信息

jstack 查看死锁信息
public class DeadLock {private static final Object lock1 = new Object();private static final Object lock2 = new Object();public static void main(String[] args) {new  Thread(() -> {synchronized (lock1) {try {System.out.println("thread1 begin");Thread.sleep(5000);} catch (InterruptedException e){}synchronized (lock2){System.out.println("thread1 end");}}}).start();new  Thread(() -> {synchronized (lock2) {try {System.out.println("thread2 begin");Thread.sleep(5000);} catch (InterruptedException e){}synchronized (lock1){System.out.println("thread2 end");}}}).start();}
}
PS D:\code-base\code-base\code-base> jps
15984 RemoteMavenServer36
1780 
20516 Launcher
7476 Jps
7508 DeadLock
20812 Main
PS D:\code-base\code-base\code-base> jstack 7508
2024-03-12 10:22:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode):"JMX server connection timeout 19" #19 daemon prio=5 os_prio=0 tid=0x0000016e833bd000 nid=0x4edc in Object.wait() [0x00000001d89ff000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)- locked <0x0000000717fab328> (a [I)at java.lang.Thread.run(Thread.java:748)
...
...JNI global references: 339//发现一个java级别的死锁
Found one Java-level deadlock:
=============================
"Thread-1"://thread-1等待0x0000016efff21d48的监控锁,被thread-0持有waiting to lock monitor 0x0000016efff21d48 (object 0x000000071644d0a8, a java.lang.Object),which is held by "Thread-0"
"Thread-0"://thread-0等待0x0000016efff1f4b8的监控锁,被thread-1持有waiting to lock monitor 0x0000016efff1f4b8 (object 0x000000071644d0b8, a java.lang.Object),which is held by "Thread-1"Java stack information for the threads listed above:
===================================================
"Thread-1":at cn.axj.jvm.memory.DeadLock.lambda$main$1(DeadLock.java:42)- waiting to lock <0x000000071644d0a8> (a java.lang.Object)- locked <0x000000071644d0b8> (a java.lang.Object)at cn.axj.jvm.memory.DeadLock$$Lambda$2/1747585824.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)
"Thread-0":at cn.axj.jvm.memory.DeadLock.lambda$main$0(DeadLock.java:24)- waiting to lock <0x000000071644d0b8> (a java.lang.Object)- locked <0x000000071644d0a8> (a java.lang.Object)at cn.axj.jvm.memory.DeadLock$$Lambda$1/1096979270.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)Found 1 deadlock.
jstack找出占用cpu最高的线程堆栈信息
1. TOP -p <pid> //查看占用cpu最高的java进程
2. 按H查看详细的线程信息,找出占用最高cpu的线程id
3. 将线程id转换成16进制(由于jstack命令展示的线程id是16进制)
4. jstack 线程id | grep -A 10 16进制的线程id ,查看详细的堆栈信息

jinfo

查看正在运行的java应用程序的扩展参数

查看jvm参数
jinfo -flags <pid>
PS D:\workspace> jinfo -flags 21208
Attaching to process ID 21208, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=534773760 -XX:+ManagementServer -XX:MaxHeapSize=8547991552 -XX:MaxNewSize=2848980992 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=178257920 -XX:OldSize=356515840 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56474,suspend=y,server=n -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -javaagent:C:\Users\aoxiaojun\AppData\Local\JetBrains\IntelliJIdea2023.1\captureAgent\debugger-agent.jar=file:/C:/Users/aoxiaojun/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8
查看java系统参数
jinfo -sysprops <pid>

jstat

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

jstat [-命令选项][vmid][间隔时间(毫秒)][查询次数]
垃圾回收统计
jstat -gc <pid> 最常用,可以评估程序内存使用及GC压力整体情况
PS D:\workspace> jstat -gc 21208S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
36864.0 34816.0  0.0   27523.8 929280.0 794497.3  428544.0   68908.8   81560.0 78200.9 9640.0 8981.8     15    0.239   3      0.228    0.467
S0CS1CS0US1UECEUOCOUMCMUCCSCCCSUYGCYGCTFGCFGCTGCT
36864.034816.00.027523.8929280.0794497.3428544.068908.881560.078200.99640.08981.8150.23930.2280.467

S0C: SUVIVOR区0的容量

S1C: SUVIVOR区1的容量

S0U: SUVIVOR区0的使用量

S1U: SUVIVOR区1的使用量

EC: eden的容量

EU: eden的使用量

OC: OLD的容量

OU: OLD的使用量

MC: 元空间的容量

MU: 元空间的使用量

CCSC,CCSU: 压缩指针

YGC: youngGC的次数(从启动开始)

YGCT: youngGCTime ,总共花费了多少时间

FGC: FULL GC次数

FGCT: FULL GC花费的总时间

GCT: 总的GC花费的时间(YGCT + FGCT)

堆内存统计
jstat -gccapacity <pid>
新生代内存统计
jstat -gcnewcapacity <pid>
老年代垃圾回收统计
jstat -gcold <pid>
JVM运行情况预估

用 jstat gc -pid 命令可以计算出如下一些关键数据,有了这些数据就可以采用之前介绍过的优化思路,先给自己的系统设置一些初始性的JVM参数,比如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值等。

年轻代对象增长的速率

可以执行命令 jstat -gc pid 1000 10(每隔1秒执行1次命令,共执行10次),通过观察EU(eden区的使用)来估算每秒eden大概新增多少对象,如果系统负载不高,可以把频率1秒换成1分钟,甚至10分钟来观察整体情况。注意,一般系统可能有高峰期和日常期,所以需要在不同的时间分别估算不同情况下对象增长速率。

Young GC的触发频率和每次耗时

知道年轻代对象增长速率我们就能推根据eden区的大小推算出Young GC大概多久触发一次,Young GC的平均耗时可以通过 YGCT/YGC 公式算出,根据结果我们大概就能知道``系统大概多久会因为Young GC的执行而卡顿多久。`

每次Young Gc后有多少对象存活和进入老年代

这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令jstat -gc pid 300000 10,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC 后进去老年代大概多少对象,从而可以推算出老年代对象增长速率

FuIl GC的触发频率和每次耗时

知道了老年代对象的增长速率就可以推算出Full GC的触发频率了,Full GC的每次耗时可以用公式 FGCT/FGC 计算得出。

优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里,尽量别让对象进入老年代。尽量减少FuIl GC的频率,避免频繁Full GC对JVM性能影响。

JVISUALVM

java进程可视化监视工具,集成上面的命令

在生产环境中禁用,而且JVISUALVM远程链接生产服务器会多开端口,可能会带来安全问题。

arthas

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

官方文档地址

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

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

相关文章

Perfetto Trace抓取

1. Perfetto简介 Perfetto 是一个用于 Android 系统的性能跟踪工具&#xff0c;可以帮助开发者分析系统性能和调试问题。 Perfetto 是 Android 10 中引入的全新平台级跟踪工具。这是适用于 Android、Linux 和 Chrome 的更加通用和复杂的开源跟踪项目。 在低于Android R的版本上…

量子计算新“尺度”:用经典计算机评估复杂量子系统!

未来的量子计算机有望在计算机科学、医疗、商业、化学、物理学等多个领域解决难题&#xff0c;从而超越传统计算机。然而&#xff0c;目前的量子计算机仍存在局限&#xff0c;主要是由于它们固有的错误率。为此&#xff0c;研究者正致力于降低这些错误率。 一种研究量子计算机误…

Linux系统部署Paperless-Ngx文档管理系统结合内网穿透实现公网访问

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使用。它内置…

机械硬盘与固态硬盘究竟该适合选用哪种,看完本文你就了解了!

随着科技的发展,计算机存储技术经历了从传统的机械硬盘(HDD)到现代固态硬盘(SSD)的革新变迁。在这篇文章中,我们将深入探讨机械硬盘与固态硬盘在功能特点上的显著区别,帮助用户更好地理解这两种存储设备的核心优势与不足。 一、存储原理与结构差异 1. 机械硬盘(HDD) …

Midjourney AI绘图工具介绍及使用

介绍 Midjourney是一款目前被誉为最强的AI绘图工具。只要输入想到的文字&#xff0c;就能通过人工智能产出相对应的图片。 官网只是宣传和登录入口&#xff0c;提供个人主页、订阅管理等功能&#xff0c;Midjourney实际的绘画功能&#xff0c;是在另外一个叫discord的产品中实…

网络电视盒子哪个品牌好?2024畅销电视盒子排行榜

电视盒子的品牌和产品非常多&#xff0c;让新手在选购时难度增大&#xff0c;大部分消费者在此时会选择参考销量排名情况&#xff0c;小编这次结合各个电商平台的销量和用户评价整理了电视盒子排行榜&#xff0c;想买电视盒子不知道网络电视盒子哪个品牌好可以收藏。 TOP 1.泰捷…

论文导读 | 漫谈图神经网络

本文主要介绍图神经网络相关内容&#xff0c;包括图神经网络的基本结构以及近期研究进展。 背景 在实际生活中&#xff0c;许多数据都可以用图的形式表达&#xff0c;比如社交网络、分子模型、知识图谱、计算机网络等。图深度学习旨在&#xff0c;显式利用这些数据中的拓扑结…

3.18_C++_day6_作业

作业要求&#xff1a; 程序代码&#xff1a; #include <iostream>using namespace std;class Animal { private:string name;string color;int *age; public://无参构造函数Animal(){cout << "Animal::无参构造函数" << endl;}//有参构造函数Anim…

[Linux初阶]which-find-grep-wc-管道符命令

目录 一.which 二.find a.-name b.-size 三.grep 四.wc 五.管道符(|) 五.总结 一.which 语法格式: which [命令] Linux中的一个个命令,本体上就是一个个的二进制可执行程序(相当于windows中的.exe文件). 在Linux中,一切皆文件. which命令:用于查看指定命令的可执行…

【JS进阶】第3天

JavaScript 进阶 - 第3天笔记 理论较多&#xff0c;主要讲解原型对象和对象原型 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 了解面向对象编程的一般特征掌握基于构造函数原…

饼图渲染的关键

1) 创建一个DOM对象,有自定义的高和宽. 2) 引入Echarts软件包并导入到对应文件内 npm i Echarts import 文件.js script src.../文件 3) 初始化一个对象 4) 对象的方法实现饼图渲染 data内的数据,且当一个对象已经渲染一遍,再执行这个,会对setOption的参数进行更新,其…

Adobe Illustrator和Photoshop哪个难学?另一款好用设计软件上位!

当设计开始时&#xff0c;几乎没有人不知道。 Adobe 公司的两大设计软件&#xff1a;Adobe Illustrator 和 Photoshop。虽然 Adobe Illustrator和 Photoshop 很有名&#xff0c;有一定设计经验的设计师在前期探索使用后可以对 Adobe Illustrator和 Photoshop 的使用差异有一个大…

NEC 78K系列MCU概述

一.初识 NEC MCU NEC&#xff0c;即日本电气株式会社&#xff0c; 经营半导体业务。 NEC 倡导“ ALL Flash”&#xff0c;即 MCU 内的程序存储器使用 Flash ROM。 为什么用 Flash ROM&#xff1f; 与掩膜 ROM 微控制器相比&#xff0c; Flash 微控制器加速了系…

理解java进程和多线程

一、进程是什么&#xff0c;线程是什么&#xff1f; (1)理解&#xff1a; 进程是一个主体任务&#xff0c;线程是这个进程下的子任务&#xff0c;下图解释&#xff1a; 描述&#xff1a;一个餐厅好比一个进程&#xff0c;一个餐厅下面有多个职位的厨师&#xff0c;他们分别是…

Java代码基础算法练习-公式求和-2024.03.24

任务描述&#xff1a; 求公式Snaaaaaa…aa…aaa&#xff08;有n个a&#xff09;之值&#xff0c;其中a是一个数字&#xff0c;为2。 例如&#xff0c;n5 时222222222222222&#xff0c;n 由键盘输入(n<5)。 任务要求&#xff1a; package march0317_0331;import java.util.…

React函数组件Hook

问题: 相对于类组件, 函数组件的编码更简单, 效率也更高, 但函数组件不能有state (旧版) 解决: React 16.8版本设计了一套新的语法来让函数组件也可以有state Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 Hook也叫钩子…

Simple negative sampling for link prediction inknowledge graphs

摘要 知识图嵌入方法学习知识图中实体和关系的低维向量表示&#xff0c;便于知识图中的链接预测任务。在学习嵌入过程中&#xff0c;采样负三元组是很重要的&#xff0c;因为KGs只观察到正三元组。据我们所知&#xff0c;均匀随机、基于生成对抗网络(GAN)和nscach、结构感知负…

Linux 系统 快速卸载docker

(卸载前一定要做好相关数据的备份) 卸载&#xff1a; 第一种卸载方法 1、查询docker安装过的包&#xff1a; yum list installed | grep docker 2、删除安装包&#xff1a; yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y 3、删除镜像/容器等 rm -rf /var/lib/dock…

【征稿进行时|见刊、检索快速稳定】2024年教育资源与人文发展国际学术会议(ICERHD 2024)

【征稿进行时|见刊、检索快速稳定】2024年教育资源与人文发展国际学术会议&#xff08;ICERHD 2024&#xff09; 2024 International Conference on Educational Resources and Humanistic Development&#xff08;ICERHD 2024&#xff09; 大会主题&#xff1a; 教育艺术 商…

机器学习周报第33周

目录 摘要Abstract一、文献阅读1.1 论文标题1.2 论文摘要1.3 论文背景1.4 过去研究1.5 论文介绍1.5.1 论文模型1.5.2 时空交互学习模块&#xff08;Spatiotemporal Interactive Learning Module&#xff09;1.5.3 动态图推理模块&#xff08;Dynamic Graph Inference Module&am…