JVM监控工具

news2024/11/13 20:39:51

JVM监控工具

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 14188

 num     #instances         #bytes  class name
----------------------------------------------
   1:        131071       49867776  [B
   2:        241900       26780880  [C
   3:         19253       16120104  [I
   4:        130495        3131880  java.lang.String
   5:         22646        1339888  [Ljava.lang.Object;
   6:         54772        1152528  [Ljava.lang.Class;
   7:         12544        1103872  java.lang.reflect.Method
   8:          6356         704152  java.lang.Class
   9:         10415         583240  jdk.internal.org.objectweb.asm.Item
   ...
   ...
   ...
   3445:             1             16  sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
   3446:             1             16  sun.util.resources.LocaleData
   3447:             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-b12

using thread-local object allocation.
Parallel GC with 10 thread(s)
//堆的配置信息
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 8547991552 (8152.0MB) //最大堆内存
   NewSize                  = 178257920 (170.0MB)   //新生代空间
   MaxNewSize               = 2848980992 (2717.0MB) //最大的新生代空间 (默认新生代占1/3,老年代占2/3)
   OldSize                  = 356515840 (340.0MB)   //老年代空间
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 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区1
   capacity = 22020096 (21.0MB)
   used     = 0 (0.0MB)
   free     = 22020096 (21.0MB)
   0.0% used
To Space:   //SURVIVOR区2
   capacity = 22020096 (21.0MB)
   used     = 0 (0.0MB)
   free     = 22020096 (21.0MB)
   0.0% used
PS Old Generation
   capacity = 240648192 (229.5MB)
   used     = 15842152 (15.108253479003906MB)
   free     = 224806040 (214.3917465209961MB)
   6.583116984315428% used

14390 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 21208
 S0C    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.coloradmin.cn/o/1535072.html

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

相关文章

Python使用PaddleSpeech实现语音识别(ASR)、语音合成(TTS)

目录 安装 语音识别 补全标点 语音合成 参考 PaddleSpeech是百度飞桨开发的语音工具 安装 注意&#xff0c;PaddleSpeech不支持过高版本的Python&#xff0c;因为在高版本的Python中&#xff0c;飞桨不再提供paddle.fluid API。这里面我用的是Python3.7 需要通过3个pip…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

基于python+vue灾害应急救援平台flask-django-php-nodejs

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

python银行柜台管理系统flask-django-php-nodejs

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低银行的运营人员成本&#xff0c;实现了银行柜台的标准化、制度化、程序化的管理&#xff0c;有效地防止了银行柜台的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地查询…

Linux:Prometheus+Grafana+睿象云告警平台(3)

在上一章我进行了Prometheus和Grafana的基础搭建以及部署 Linux&#xff1a;Prometheus的源码包安装及操作&#xff08;2&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136855988?spm1001.2014.3001.5501 1.注册 在监控中必不可少的就是监控告警&am…

螺旋卫星通信天线设计与有限元分析matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 卫星搭载用于通讯的螺旋型天线&#xff0c;卫星尺寸&#xff1a; 10cm*10cm*30cm&#xff1b;天线类型&#xff1a;螺旋&#xff1b;天线UHF&#xff08;约1GHz – 3GHz&#…

【精彩回顾】百度智能云千帆产品3月21日发布会

3月21日&#xff0c;AI Cloud Day&#xff1a;百度智能云千帆产品发布会在北京举办。会议聚焦百度智能云千帆大模型平台最新进展&#xff0c;分享思考与实践。百度智能云在发布会期间宣布&#xff1a; >>满足企业“效价比”核心诉求&#xff0c;千帆ModelBuilder大模型服…

clickhouse sql使用

1、arrayMap(fun1,arr1)使用 第一个参数是一个 lambda 函数&#xff0c;第二个参数是一个集合 eg、select arrayMap(x->x1,[1,2,3]) 对集合中每个数1 2、arrayJoin(arr1) 将集合由行转列 eg、 select arrayJoin([1,2,3]) eg、select arrayJoin(arrayMap(x->x1,[1,2,3])) …

学工系统0day挖掘-危害拉满

前言: 21年的挖的漏洞了 漏洞均已提交且均已修复,这里文章只做技术交流 正文: 漏洞挖掘过程: 起因是这样的 20年简单挖了一下这个学校,但是没把shell拿了 后面随着学习21年又回来看了看这个系统,果然发觉了很多新的东西,脱敏了就写文章下。 漏洞1:未授权批量挖掘:…

【C++】---string的模拟

【C】---string的模拟 一、string类实现1.string类的构造函数2.swap&#xff08;&#xff09;函数3.拷贝构造函数4.赋值运算符重载5.析构6.迭代器7.operator[ ]8.size9.c_str&#xff08;&#xff09;10.reserve&#xff08;&#xff09;11.resize&#xff08;&#xff09;12.p…

BetterDisplay Pro:让屏幕管理更高效、更便捷

BetterDisplay Pro是一款功能强大的显示器管理软件&#xff0c;适用于Windows和Mac操作系统。其主要功能包括显示器校准、自动校准、多种预设模式、手动校准以及可视化数据等。 具体而言&#xff0c;这款软件可以根据用户的需求和环境条件调整显示器的颜色、亮度和对比度等参数…

Java项目:68 ssm0校园美食交流系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 主要功能包括管理员&#xff1a;首页、个人中心、美食分类管理、美食信息管理、用户管理、管理员管理、论坛中心、系统管理。 前台首页&#xff1a;首…

【SpringBoot】登录校验之会话技术、统一拦截技术

真正的登录功能应该是&#xff1a; 登陆后才能访问后端系统页面&#xff0c;不登陆则跳转登陆页面进行登陆。 当我们没有设置登录校验&#xff0c;可以直接通过修改地址栏直接进入管理系统内部&#xff0c;跳过登录页。而后端系统的增删改查功能&#xff0c;没有添加判断用户是…

Redis进阶(持久化、复制、集群、多线程、缓存)

Redis进阶 1.Redis持久化1.1 什么是Redis持久化&#xff1f;为什么需要持久化&#xff1f;1.2 Redis持久化方式——RDB(Redis DataBase)1.2.1 什么是RDB&#xff1f;1.2.2 备份文件位置1.2.3 触发RDB的方式1.2.3.1 自动触发1.2.3.2 手动触发1.2.3.3 其他触发方式 1.2.4 RDB优缺…

(Ubuntu中调用相机花屏)Astra plus深度相机--rgb彩色图像花屏解决方法之一

在调试深度相机的过程中只能能调出深度图像和红外图像 在rviz的image的topic中选择彩色图像的话题不显示图像 1、查看相机的usb序列号 lsusb如上图所示&#xff0c;此相机的USB序列号是2bc5:050f,2bc5:060f 其中050f是显示彩色图像的 在这里可通过拔插相机来确定序列号是哪几…

经典Bug永流传---每周一“虫”(四十五)

如果有人错过机会&#xff0c;多半不是机会没来&#xff0c;而是因为机会过来时&#xff0c;没有一伸手抓住它。 大写W惹的祸 前提&#xff1a; A账号已登录 步骤&#xff1a; 打开某商品链接&#xff0c;然后在商品的评论区任意一条评论&#xff0c;点击回复&#xff0c;回…

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器&#xff1f; 3D元宇宙编辑器是全新3DVR交互渲染创作工具&#xff0c;集3D建模、虚拟展厅、AI数字人等能力&#xff0c;渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点&#xff0c;可广泛应用于展会、展厅、博物馆、可视化园…

Unity 粒子在UI中使用时需要注意的地方

最近项目中要在UI中挂载粒子特效,美术给过来的粒子直接放到UI中会有一些问题,查询一些资料后,总结了一下 一: 粒子的大小发生变化,与在预制件编辑中设计的大小不同 在预制件编辑模式下,大小正常 实际使用的时候特别大或者特别小 经过检查,发现预制件编辑模式下,默认画布的Rend…

[Semi-笔记] 2023_TIP

目录 概要一&#xff1a;Conservative-Progressive Collaborative Learning&#xff08;保守渐进式协作学习&#xff09;挑战&#xff1a;解决&#xff1a; 二&#xff1a;Pseudo Label Determination for Disagreement&#xff08;伪标签分歧判定&#xff09;挑战&#xff1a;…

基于Spring Boot+Vue的车辆管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…