【Java虚拟机】JVM常见诊断命令和调试工具

news2024/11/16 20:33:18

1.JVM常用命令行参数jps和jinfo实操

  • 准备测试代码
/**
 * @author lixiang
 * @date 2023/5/4 20:53
 */
public class JVMTest {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(1000000);
    }
}

(1)命令jps:全称 java process Status Tool, Java版的ps命令,查看java进程及其相关的信息的pid则可以用这个命令,和linux的ps类似

  • 格式: jps [options] [hostid]

    • 参数解释

      • -l:显示进程id,显示主类全名或这jar路径
      • -q : 显示进程id
      • -m : 显示进程id, 显示JVM启动时传递给main()的参数
      • -v : 显示进程id,显示JVM启动时显示指定的JVM参数
      • hostid : 主机或其他服务器ip
    • 常用案例

      • jps -l 输出jar包路径,类的全名

      在这里插入图片描述

      • jps -v 输出JVM参数

      在这里插入图片描述

(2)命令jinfo:全称 Configuration Info for Java ,可以用来查看jvm参数和动态修改部分jvm参数的命令

  • 启动java程序,不会指定所有的Java虚拟机参数,如果开发人员想知道某一个具体的Java虚拟机参数的默认值则可以使用

  • 还可以在运行时修改部分参数,且立即生效,但注意并非所有参数都支持动态修改,被标记 manageable的才可以动态修改

  • 格式 jinfo [options] <pid>

    • 参数解释

      • no options :输出所有的系统属性和参数
      • -flag <具体参数> pid: 查看具体参数的值
      • -flag [+|-] : 打开或关闭参数
      • -flag = 设置参数值
      • -flags 打印所有参数
      • -sysprops 打印系统配置
    • 常用案例

      • jinfo -flags pid 查看曾经赋过值的参数值

      在这里插入图片描述

      • jinfo -flag <具体参数> pid 查看具体参数的值

      在这里插入图片描述

      • jinfo 动态进行参数修改

      • 查看哪些可以动态修改参数 java -XX:+PrintFlagsFinal -version | grep manageable

      在这里插入图片描述

      • 修改方式

        • 布尔类型: jinfo -flag ±参数 pid

        • 非布尔类型: jinfo -flag 参数名=参数值 pid

        • jinfo -flag +HeapDumpAfterFullGC 11190

      在这里插入图片描述

2.JVM高频命令行参数jstat案例实操

(1)命令jstat:Java Virtual Machine statistics monitoring tool, 对Java应用程序的资源进行实时监控,包括堆和垃圾回收状况的监控

  • 格式 jstat [-option] [vmid] [间隔时间/毫秒] [查询次数]

    • 参数选项

      • vmid:Virtual Machine ID( 进程的 pid)
      • interval:执行每次的间隔时间,单位为毫秒
      • count:用于指定输出多少次记录,缺省则会一直打印
    • option说明

      • -class 查看类加载情况的统计
      • -compiler 查看HotSpot中即时编译器编译情况的统计
      • -gc 查看JVM中堆的垃圾收集情况的统计
      • -gccapacity 查看新生代、老生代及持久代的存储容量情况
      • -gcmetacapacity 显示metaspace的大小
      • -gcnew 查看新生代垃圾收集的情况
      • -gcnewcapacity 用于查看新生代存储容量的情况
      • -gcold 查看老生代及持久代垃圾收集的情况
      • -gcoldcapacity 用于查看老生代的容量
      • -gcutil 显示垃圾收集信息
      • -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
      • -printcompilation 输出JIT编译的方法信息
    • 常用命令

      • jstat -class pid 查看类加载情况的统计
        • Loaded:加载类的数量
        • Bytes:加载类的size,单位为Byte
        • Unloaded:卸载类的数目
        • Bytes:卸载类的size,单位为Byte
        • Time:加载与卸载类花费的时间

      在这里插入图片描述

      • jstat -gc pid 查看JVM中堆的垃圾收集情况的统计,输出实际的值
        • S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
        • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
        • S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
        • S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
        • EC:年轻代中Eden(伊甸园)的容量 (字节)
        • EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
        • OC:Old代的容量 (字节)
        • OU:Old代目前已使用空间 (字节)
        • MC:metaspace(元空间)的容量 (字节)
        • MU:metaspace(元空间)目前已使用空间 (字节)
        • CCSC:当前压缩类空间的容量 (字节)
        • CCSU:当前压缩类空间目前已使用空间 (字节)
        • YGC:从应用程序启动到采样时年轻代中gc次数
        • YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
        • FGC:从应用程序启动到采样时Full GC 的次数
        • FGCT:从应用程序启动到采样时Full GC 所用时间(s)
        • GCT:从应用程序启动到采样时垃圾回收消耗总时(s)

      在这里插入图片描述

      • jstat -gcutil pid 时间间隔 打印次数 显示垃圾收集信息,和-gc类似,不过是百分比展示, 每隔2000毫秒打印一次,打印3次

        • S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

        • S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

        • E 年轻代中Eden(伊甸园)已使用的占当前容量百分比

        • O 老年代已使用的占当前容量百分比

        • M 元数据区已使用的占当前容量百分比

        • CCS 压缩使用百分比

        • YGC 年轻代垃圾回收次数

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

        • FGC Full GC垃圾回收次数

        • FGCT Full GC垃圾回收消耗时间

        • CGC: 并发GC次数

        • CGCT: 并发GC总耗时

        • GCT 垃圾回收消耗总时间

      在这里插入图片描述

      • jstat -gccause pid 显示垃圾回收的相关信息,最后一次或当前正在发生的垃圾回收的诱因

      在这里插入图片描述

      • LGCC:最后一次GC原因,常见是 Allocation Failure 申请内存失败
      • GCC:当前GC原因(No GC 为当前没有执行GC)

3.JVM命令jstack讲解及案例分析

(1)命令 jstack:Java堆栈跟踪工具, 可以打印出Java应用程序中所有线程的堆栈信息,包括线程状态、调用栈信息、锁信息等

  • 用于诊断线程死锁、死循环、内存泄漏等问题

  • 格式 jstack [ options ] pid

    • option 参数说明

      • -l 打印关于锁的附加信息,如持有锁的线程、等待锁的线程等
    • 常用案例

      • jstack -l pid 查看线程堆栈信息
      • 开头是线程名称,即main 线程,后面的为线程信息,线程状态如下
        • NEW
        • RUNNABLE
        • BLOCKED#进入synchronized之前
        • WAITING#已经进入synchronized,调用了wait()
        • TIMED_WAITING#已经进去synchronized,调用了sleep()
        • TERMINATED#线程结束
      • #1 表示当前线程ID,从 main线程开始,JVM 根据线程创建的顺序为线程编号
      • priopriority优先级的缩写,代表当前线程的优先级,范围为[1-10]默认为 5,数值越低越优先获取到计算资源
      • cpu=60.91ms 表示进程在CPU上的运行时间为60.91毫秒
        • 指的是进程实际占用CPU的时间,
      • elapsed=13.05s 表示进程已经运行13.05秒
        • 进程从开始运行到当前时刻所经过的时间,包括进程等待时间和实际运行时间
      • os_prio为线程对应系统的优先级
      • tid 表示Java内的线程ID,同样在Thread类中(可以不管)
      • nid
        • 本地线程编号NativeID的缩写, 表示操作系统级别的线程ID,
        • 对应JVM 虚拟机中线程映射在操作系统中的线程编号,是十六进制

      在这里插入图片描述

(2)案例分析

  • 生产环境JVM中,会出现由于代码问题导致CPU占用过高,需要诊断出来具体是哪个java代码导致
  • 分析CPU占用过高的java线程案例
  • 测试代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CpuTest {

    private static ExecutorService executorService = Executors.newFixedThreadPool(5);

    public static void main(String[] args) {

        Task task1 = new Task();
        Task task2 = new Task();
        executorService.execute(task1);
        executorService.execute(task2);
    }

    public static Object lock = new Object();

    static class Task implements Runnable{
        @Override
        public void run() {
            synchronized (lock){
                long sum = 0L;
                while (true){
                    sum += 1;
                }
            }
        }
    }

}
  • 运行代码,top命令找出CPU过高的进程。

在这里插入图片描述

  • 当前这个java进程CPU的使用率已经到达百分之99,确认进程ID
  • 将十进制的进程ID转化成十六进制 printf "%x\n" 线程id

在这里插入图片描述

  • 定位问题线程堆栈信息,一般会生成快照到文本文件里面进行分析 jstack -l [PID] >/tmp/log.txt
  • 查看log.txt文件内容,这里存在一个死锁

在这里插入图片描述

4.新版JDK11命令jmap案例实操

(1)命令jmap:Memory Map for Java , 用于生成Java堆转储快照(heap dump),分析Java应用程序的内存使用情况

  • 包括 堆的使用情况、对象的数量和类型、每个对象的大小、对象的地址、对象的引用关系等

  • 格式 jmap [option] pid

  • option参数说明

    • -heap: 打印java heap 摘要

    • -histo[:live] : 打印堆中的java对象统计信息

    • -clstats : 打印类加载器统计信息

    • -finalizerinfo:打印在f-queue中等待执行finalizer方法的对象

    • -dump: 生成java堆的dump文件, dump-options 参数如下

      • live : 只转储存活的对象,如果没有指定则转储所有对象
      • format=b: 二进制格式
      • file=[Path] : 将文件转储到指定文件中
  • 常用案例

  • jmap -heap 进程id 查看堆信息, 这个命令会让JVM 是暂停服务的,所以对线上的运行会产生影响,不推荐该方式

    • JDK9 及以上版本使用jmap -heap pid命令查看当前heap使用情况时,发现报错,提示需要使用jhsdb jmap来替代,我本地是JDK11

在这里插入图片描述

  • jhsdb jmap --pid 进程id --heap
[mac@localhost lixiang ~]# jhsdb jmap --pid 3110235  --heap
Attaching to process ID 3110235, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.8+10-LTS

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40 #最小堆空闲比例。
   MaxHeapFreeRatio         = 70 #最大堆空闲比例。
   MaxHeapSize              = 1979711488 (1888.0MB) #最大堆大小。
   NewSize                  = 1363144 (1.2999954223632812MB) #新生代大小。
   MaxNewSize               = 1186988032 (1132.0MB) #最大新生代大小。
   OldSize                  = 5452592 (5.1999969482421875MB) #老年代大小。
   NewRatio                 = 2 #新生代和老年代的比例。
   SurvivorRatio            = 8 #新生代中eden区和survivor区的比例。
   MetaspaceSize            = 21807104 (20.796875MB) #元空间大小。
   CompressedClassSpaceSize = 1073741824 (1024.0MB) #压缩类空间大小。
   MaxMetaspaceSize         = 17592186044415 MB  #最大元空间大小。
   G1HeapRegionSize         = 1048576 (1.0MB) //G1垃圾收集器每个Region大小

Heap Usage:
G1 Heap:
   regions  = 1888  #堆中区域数量
   capacity = 1979711488 (1888.0MB) #堆的总容量
   used     = 12332544 (11.76123046875MB)  #堆已使用的容量
   free     = 1967378944 (1876.23876953125MB) #堆未使用的容量
   0.6229465290651484% used #堆的使用率。
G1 Young Generation:  #G1垃圾收集器中的年轻代。

Eden Space: #年轻代中的Eden区域。
   regions  = 8
   capacity = 75497472 (72.0MB)
   used     = 8388608 (8.0MB)
   free     = 67108864 (64.0MB)
   11.11111111111111% used
Survivor Space: #年轻代中的survivor区域
   regions  = 2
   capacity = 2097152 (2.0MB)
   used     = 2097152 (2.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation: #G1垃圾收集器中的老年代。
   regions  = 2
   capacity = 46137344 (44.0MB)
   used     = 1846784 (1.76123046875MB)
   free     = 44290560 (42.23876953125MB)
   4.002796519886363% used #老年代的使用率。

5.JVM可视化分析JConsole案例实操

  • Java Monitoring and Management Console,虚拟机自带的一种监控和管理工具
  • 可以通过图形化界面展示Java应用程序的运行状态和性能指标,包括内存使用情况、线程状态、类加载情况、GC情况等
  • JConsole的主要用途包括:
    • 监控Java应用程序的运行状态
      • 实时展示Java应用程序的运行状态和性能指标,包括CPU使用率、内存使用情况、线程状态、类加载情况、GC情况
    • 诊断Java应用程序的问题
      • 提供详细的诊断信息,帮助开发人员分析和解决Java应用程序的问题,如内存泄漏、死锁等。
    • 监控远程Java应用程序
      • 可以通过JMX(Java Management Extensions)协议监控远程Java应用程序,远程管理和监控Java应用程序。
    • 执行JMX操作
      • JConsole可以执行JMX操作,如调用Java应用程序中的方法、修改Java应用程序的配置等。
  • 使用方式 命令行输入 jconsole 启动即可,选择自己的类进程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【exgcd】牛客练习赛 D-青蛙兔子的约会

D-青蛙兔子的约会_牛客练习赛111 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 感觉和那个青蛙的约会比较像 就是列了个方程&#xff1a; a*xb*yn 考虑用exgcd解方程 然后看x在[L,R]有没有解 做法就是先把x的最小整数解求出来&#xff0c;然后考虑它的通解 xx0b/…

2023年五一数学建模 B 题过程与结果

文章目录 第一问第二问数据时序分析Auto-ARIMA第二问求解解的情况A->Q:D-> AQ-V总快递数 第三问第四问遗传算法求解 第五问SARIMA 模型拟合季节性规律 第一问 见 2023 年 五一杯 B 题过程 代码&#xff08;第一问&#xff09; 第二问 第二问考虑是一个时序预测问题&a…

图像生成论文阅读:Latent Diffusion算法笔记

标题&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models 会议&#xff1a;CVPR2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9878449/ 官方代码&#xff1a;https://github.com/CompVis/latent-diffusion 作者单位&#xff1a;慕尼…

数字乡村建设与示范项目可行性研究报告(word可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 5.1 “三平台”&#xff1a;建设支撑农业发展农村治理惠民服务的三大应用平 台 5.3.1 建设智慧农业综合服务平台 夯实数字农业基础&#xff0c;推进重要农产品全产业链大数据…

redis服务搭建,C++实现redis客户端,redis远程可视化工具

目录 redis简介redis服务搭建redis常用命令C实现redis客户端redis远程可视化工具:Another Redis DeskTop Manager redis简介 官方网址&#xff1a;https://redis.io/ 开源地址&#xff1a;https://github.com/redis 中文文档&#xff1a;http://www.redis.cn/documentation.ht…

造轮子系列】面试官问:你能手写Vuex吗(一)?

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 Vuex 是 Vue.js 的状态管理模式&#xff0c;它主要解决了组件之间共享状态时的问题。在本文…

网络原理之传输层

网络原理&#xff0c;进一步了解网络是如何工作的~~ 按照网络协议这几个层次来展开分为五点&#xff1a; 应用层&#xff08;重点介绍&#xff09;传输层&#xff08;重点介绍&#xff09;网络层&#xff08;跳过&#xff09;数据链路层&#xff08;跳过&#xff09;物理层&a…

JavaScript,

JS-引入方式JS-基础语法 书写语法变量数据类型&#xff0c;运算符&#xff0c;控制语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"…

Abstract Expressionist

古董地图画集 10大最有名的抽象艺术家 抽象表现主义是现代许多不同艺术思想和表达流派中最奇特的艺术运动之一。这场运动开始从社会变革中涌现出来&#xff0c;恰逢第二次世界大战的最后几周和几个月。 这一次&#xff0c;来自世界各地的人们开始欢迎在经历了多年有史以来最致…

【JavaWeb 用户认证】Cookie、Session、Token、JWT、Interceptor、SpringBoot、Spring Security

Token基本了解&#xff1a;【详细阐述Token的来源】公钥私钥基本了解&#xff1a;【理解公钥】 文章目录 一、Cookie 经典介绍以及使用案例二、Session 经典介绍以及拦截登录案例三、Token MySQL 的基本介绍及其基本使用四、JWT 基本介绍及其基本讲解五、SpringBoot 使用拦截器…

使用PyQt5设计一款简单的计算器

目录 一、环境配置&#xff1a; 二、代码实现 三、主程序 四、总结 本文使用PyQt5设计一款简单的计算器&#xff0c;可以通过界面交互实现加减乘除的功能&#xff0c;希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。…

LeetCode 牛客单链表OJ题目思路分享

目录 反转链表合并两个有序链表链表分割 反转链表 链接: link 题目描述&#xff1a; 题目思路&#xff1a; 方法1&#xff1a;改变链表链接的方向 方法1思路&#xff1a; 这力我们需要三个指针n1 n2 n3方便我们进行迭代 初始化n1指向NULL&#xff0c;n2指向第一个节点&…

云原生时代崛起的编程语言Go常用标准库实战

文章目录 基础标准库简述字符串-string底层结构函数长度格式化输出 模版-templatetext/templatehtml/template 正则表达式-regexp编码-encodingBase64JSONXML 时间-time网络-netURLHTTP客户端和服务端 加密IO操作读写文件环境变量命令行 数据库排序-sort测试和基准测试 基础标准…

OpenLDAP安装报错

tip:基于centos7&#xff0c;OpenLDAP使用2.4.44版本 只要有succeeded就可以。error可以忽略 配置base.ldif文件&#xff0c;下面的空行是必须的。 dn: dcts,dccom o: ts com dc: ts objectClass: top objectClass: dcObject objectclass: organizationdn: cnManager,dcts,d…

leveldb自定义env

leveldb自定义env 未完待续。。。 由于项目需求&#xff0c;需要自定义LevelDB的env&#xff0c;也就是以块接口实现env中各个文件接口&#xff0c;在网上没找到类似的代码&#xff0c;就打算自己参照util/env_posix.cc实现一个简单的demo&#xff0c;等到功能实现差不多的时候…

ADRV9002官方例程开发过程中遇到的问题

开发环境&#xff1a;Vivado2021.2 HDL版本&#xff1a;hdl_2021_r2 GitHub - analogdevicesinc/hdl at hdl_2021_r2 no-OS版本&#xff1a;no_OS-2021_R2 GitHub - analogdevicesinc/no-OS at 2021_R2 &#xff08;PS&#xff1a;也可以用Vivado2019.1开发&#xff0c…

【漏洞复现】Joomla未授权访问漏洞(CVE-2023-23752)

文章目录 前言声明一、漏洞简介二、影响版本三、环境搭建四、漏洞分析五、漏洞复现六、修复建议前言 Joomla是一套全球知名的内容管理系统(CMS),其使用PHP语言加上MySQL数据库所开发,可以在Linux、Windows、MacOSX等各种不同的平台上运行。 声明 本篇文章仅用于漏洞复现与…

华为OD机试真题-密码强度等级【2023】【JAVA】

一、题目描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 1、密码长度&#xff1a; 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 2、字母&#xff1a; 0 分: 没有字母 10 分: 密码里的字母全都是小&#xff08;…

电脑硬盘磁盘不小心被格式化了?如何一键恢复操作教程

Easyrecovery是一款功能齐全的数据恢复软件&#xff0c;恢复内容包括&#xff1a;硬盘数据恢复、手机数据恢复、U盘数据恢复、Mac数据恢复、恢复删除文件及高级数据恢复等。当用户发生数据丢失问题时&#xff0c;第一时间想到的就是使用数据恢复软件来恢复已经丢失的文件。在众…

【机器学习】集成学习解读(ensemble learning)

【机器学习】集成学习解读&#xff08;ensemble learning&#xff09; 文章目录 【机器学习】集成学习解读&#xff08;ensemble learning&#xff09;1. 集成学习(ensemble learning)1.1 前言1.2 什么是集成学习 2. 如何得到若干个个体学习器2.1 集成学习之 Bagging2.2 集成学…