【JVM】命令行工具的基本使用--JVM常用指令

news2024/11/25 5:44:20

文章目录

  • 背景
  • 一、Java 性能诊断工具简介
  • 二、简单命令行工具
    • 2.1、jps
    • 2.2、jinfo
    • 2.3、jstat
    • 2.4、jstack
    • 2.5、jmap
    • 2.6、jhat
  • 三、图形化综合诊断工具
    • 3.1、JVisualvm
    • 3.2、JProfiler
    • 3.3、JConsole

背景

性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要了定位这些问题,一款优秀的性能诊断工具必不可少。本文将介绍 Java 性能诊断过程中的常用指令。

一、Java 性能诊断工具简介

在 Java 的世界里,有许多诊断工具可供选择,既包括像 jmap、jstat 这样的简单命令行工具,又包括 JVisualvm、JProfiler 等图形化综合诊断工具,同时还有 SkyWalking、ARMS 这样的针对分布式应用的性能监控系统。下面分别对其进行介绍。

二、简单命令行工具

JDK 内置了许多命令行工具,它们可用来获取目标 JVM 不同方面、不同层次的信息。

  • jinfo - 用于实时查看和调整目标 JVM 的各项参数。
  • jstack - 用于获取目标 Java 进程内的线程堆栈信息,可用来检测死锁、定位死循环等。
  • jmap - 用于获取目标 Java 进程的内存相关信息,包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
  • jstat - 一款轻量级多功能监控工具,可用于获取目标 Java 进程的类加载、JIT 编译、垃圾收集、内存使用等信息。
  • jcmd - 相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间等信息。

2.1、jps

jps(java process status tool), 用于查看java进程及相关信息,如果你想找到一个java进程的pid,可以使用jps命令代替linux的ps命令。

命令格式: jps 【options】 【hostid】
options参数:

  • -l : 显示进程ID, 显示主类全名或jar路径
  • -q :显示进程ID
  • -m :显示进程ID, 显示JVM启动时传给main() 函数的参数
  • -v : 显示进程ID,显示JVM启动参数

hostid : 主机或其他服务器IP, 不写默认查看本机

2.2、jinfo

jinfo是用来查看jvm参数和动态修改部分jvm参数的命令

jinfo 【options】 <pid>

options参数解释:

no options :输出所有的系统属性和参数

  • -flag :打印指定名称的参数
  • -flag [+|-] : 打开或关闭参数
  • -flag = 设置参数值
  • -flags 打印所有参数
  • -sysprops 打印系统配置

pid代表进程id, 是必传参数

使用示例:

# 查看jvm参数和系统配置
jinfo 1234
jinfo -flags 1234
jinfo -sysprops 1234
 
# 查看打印GC日志参数
jinfo -flag PrintGC 1234
jinfo -flag PrintGCDetail 1234
 
# 打开/关闭 GC日志
jinfo -flag +PrintGC 1234
jinfo -flag -PrintGCDetail 1234
 
# 设置或自改参数值
jinfo -flag -Xms10m 1234

2.3、jstat

jstat命令主要用于查看jvm运行时状态信息, 包括内存状态、垃圾回收等

命令格式: jstat 【options】 <PID> 【interval】 【count】
interval 是打印间隔时间(ms), count 是打印次数, 默认一直打印

options参数解释:

  • -class : classLoader的行为统计
  • -complier : hotSpot JIT编译器行为统计
  • -gc : 垃圾回收堆的行为统计
  • -gccapacity: 各个垃圾回收容量和他们响应空间的统计
  • -gcutil: 垃圾回收统计概述
  • -gccause:垃圾收集统计概述, 附加最近两次垃圾回收事件的原因
  • -gcnew:新生代行为统计
  • -gcnewcapacity:新生代与其响应的内存空间的统计
  • -gcold:老年代与永久代行为统计
  • -gcoldcapacity:老年代行为统计
  • -printcompliation: hotSpot编译方法统计

使用示例:

jstat -gcutil 1234 1000 3   # 查看进程1234的垃圾回收信息, 没1s打印一次, 打印三次

在这里插入图片描述

字段解释:

  • S0: s0区使用百分比
  • S1:s1区使用百分比
  • E : Eden区使用百分比
  • O : old区使用百分比
  • M: 元数据区使用百分比
  • CCS:压缩使用百分比
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:Full GC垃圾回收次数
  • FGCT:FullGC 垃圾回收消耗时间
  • GCT: 垃圾回收消耗总时间
jstat -gc 1234 1000 3

-gc与-gcutil类似, 只不过输出的不是百分比,而是实际的值

在这里插入图片描述

字段解释:

  • S0C: so区大小
  • S1C:S1区大小
  • S0U:s0已使用大小
  • S1U:S1已使用大小
  • EC: Eden区大小
  • EU: Eden区已使用大小
  • OC: 老年代大小
  • OU:老年代已使用大小
  • MC: 方法区大小
  • MU: 方法区已使用大小
  • CCSC: 压缩类空间大小
  • CCSU: 压缩类空间已使用大小
  • YGC: 年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC: Full GC次数
  • FGCT: Full GC消耗时间
  • GCT:垃圾回收消耗总时间

2.4、jstack

jstack是用来查看jvm线程快照的命令, 线程快照是当前jvm线程正在执行的方法堆栈集合。 使用jstack命令可以定位线程出现长时间卡顿的原因, 如死锁、死循环等。 jstack还可以查看程序崩溃时生成的core文件中的stack信息。

命令格式: jstack 【options】 【pid】
options参数解释:

  • -F : 当使用jstack无响应时,强制输出线程堆栈
  • -m:同时输出java堆栈和c/c++ 堆栈信息
  • -l : 除了输出堆栈信息外, 显示关于锁的附加信息

2.5、jmap

jmap可以生成java程序的dump文件, 也可以查看堆内对象示例的统计信息、查看classLoader的信息以及finalizer队列

命令格式: jmap 【options】 <pid>
options参数解释 :

  • no options 如果使用不带选项参数的jmap打印共享对象映射, 将会打印目标虚拟机中加载的每个对象的起始地址、映射大小及共享对象文件的路径全称。(很占资源, 一般不会使用)
  • -heap: 打印java heap 摘要
  • -histo[:live] : 打印堆中的java对象统计信息
  • -clstats : 打印类加载器统计信息
  • -finalizerinfo:打印在f-queue中等待执行finalizer方法的对象
  • -dump: 生成java堆的dump文件, dump-options:
    • live : 只转储存活的对象,如果没有指定则转储所有对象
    • format=b: 二进制格式
    • file=[Path] : 将文件转储到指定文件中

使用示例:

jmap -dump:live,format=b,file=/dump.bin 1234   #将java堆中存活的对象信息转储到/dump.bin文件中

我们来看一下堆信息:

jmap -heap 1234

输出:

Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
 
using thread-local object allocation.
Parallel GC with 4 thread(s)
 
Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio  = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio  = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize= 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize    = 22020096 (21.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的新生代的默认大小
   MaxNewSize = 357564416 (341.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的新生代的最大大小
   OldSize    = 45088768 (43.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的老年代的大小
   NewRatio   = 2 //对应jvm启动参数-XX:NewRatio=:新生代和老生代的大小比率
   SurvivorRatio     = 8 //对应jvm启动参数-XX:SurvivorRatio=设置新生代中Eden区与Survivor区的大小比值
   MetaspaceSize     = 21807104 (20.796875MB) // 元数据区大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB) //类压缩空间大小
   MaxMetaspaceSize  = 17592186044415 MB //元数据区最大大小
   G1HeapRegionSize  = 0 (0.0MB) //G1垃圾收集器每个Region大小
 
Heap Usage: //堆内存使用情况
PS Young Generation 
Eden Space: //Eden区内存分布
   capacity = 17825792 (17.0MB) //Eden区总容量
   used     = 12704088 (12.115562438964844MB) //Eden区已使用
   free     = 5121704 (4.884437561035156MB) //Eden区剩余容量
   71.26801434685203% used //Eden区使用比率
 
From Space: //其中一个Survivor区的内存分布
   capacity = 2097152 (2.0MB)
   used     = 1703936 (1.625MB)
   free     = 393216 (0.375MB)
   81.25% used
To Space: //另一个Survivor区的内存分布
   capacity = 2097152 (2.0MB)
   used     = 0 (0.0MB)
   free     = 2097152 (2.0MB)
   0.0% used
PS Old Generation
   capacity = 52428800 (50.0MB) //老年代容量
   used     = 28325712 (27.013504028320312MB) //老年代已使用
   free     = 24103088 (22.986495971679688MB) //老年代空闲
   54.027008056640625% used //老年代使用比率
 
15884 interned Strings occupying 2075304 bytes.

输出存活对象信息 :

jmap -histo:live 1234 | more

在这里插入图片描述

2.6、jhat

jhat 用来分析jmap生成dump文件的命令, jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一般用于离线分析

命令格式: jhap 【options】 【dumpfile】

option参数解释:

  • -stack false : 关闭对象分配调用堆栈的跟踪
  • -refs false: 关闭对象引用的跟踪
  • -port: HTTP服务器端口, 默认是7000
  • -debug: debug级别
  • -version: 分析报告版本

三、图形化综合诊断工具

使用上述命令行工具或组合能帮您获取目标 Java 应用性能相关的基础信息,但它们存在下列局限:

  1. 无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。
  2. 要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。
  3. 分析数据通过终端输出,结果展示不够直观。

下面介绍几款图形化的综合性能诊断工具。

3.1、JVisualvm

JVisualvm 是 JDK 内置的可视化性能诊断工具,它通过 JMX、jstatd、Attach API 等方式获取目标 JVM 的分析数据,包括 CPU 使用率、内存使用量、线程堆栈信息等。此外,它还能直观地展示 Java 堆中各对象的数量和大小、各 Java 方法的调用次数和执行时间等。

更多可参考我之前写的文章:【JVM 监控工具】JVisualVM的使用

3.2、JProfiler

性能诊断–JProfiler的使用

3.3、JConsole

使用JConsole监控进程、线程、内存、cpu、类情况

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

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

相关文章

few-shot / one shot / zero shot object counting论文汇总

文章目录 2021OBJECT COUNTING: YOU ONLY NEED TO LOOK AT ONE 2022Scale-Prior Deformable Convolution for Exemplar-Guided Class-Agnostic CountingCounTR: Transformer-based Generalised Visual CountingFew-shot Object Counting with Similarity-Aware Feature Enhance…

python+vue企业高校文档管理系统的设计与实现

开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 在这个推荐个性化的时代&#xff0c;采用新技术开发一个文档系统来分享和展示内容是一个…

编程语言/文件系统/网络协议存在的那些编码

前面的文章介绍了URL编码&#xff0c;UTF8编码&#xff0c;base64&#xff0c;gzip等多种编解码的方式&#xff0c;这里&#xff0c;本节对字符和编码一些杂项进行梳理&#xff0c;相信你会感兴趣。 Python 中的字符和编码 为什么要强调字符编号和字符编码分离这样⼀个概念呢…

A100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

02队列及代码实现

队列介绍 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。、遵循先入先出的原则。 &#xff08;先存入队列的数据&#xff0c;要先取出。后存入的要后取出&#xff09; 数组模拟队列 队列本身是有序列表&#xff0c;若使用数组的结构来存储队列的数据&#xff0c;则…

【6月比赛合集】42场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用赛&#xff08;39场比赛&#xff09;数据分析赛&…

MySQL—SQL优化详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

万物的算法日记|第三天

笔者自述&#xff1a; 一直有一个声音也一直能听到身边的大佬经常说&#xff0c;要把算法学习搞好&#xff0c;一定要重视平时的算法学习&#xff0c;虽然每天也在学算法&#xff0c;但是感觉自己一直在假装努力表面功夫骗了自己&#xff0c;没有规划好自己的算法学习和总结&am…

FasterTransformer 001 start up

FasterTransformer Faster Transformer是一个Transformer单层前向计算的高效实现。一个函数由多个OP组合实现。每一个基本OP都会对应一次GPU kernel的调用&#xff0c;和多次显存读写。OP融合可以降低GPU调度和显存读写&#xff0c;进而提升性能。在Faster Transformer&#x…

位姿估计 | 目标体坐标系相对于相机坐标系的位姿估计及其Python代码

目录 引言技术流程1. PNP介绍2. ICP介绍a. 利用ICP求解目标相对相机的位姿b. 利用ICP求解相机帧间运动 Python代码 引言 本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容&#xff0c;希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章&#xff1a;位…

Redis 之Jedis 加springboot整合Redis

Jedis API 文档 在线文档: https://www.mklab.cn/onlineapi/jedis/ Jedis 介绍 Jedis 工作示意图 Java 程序操作Redis 的工具 示意图 Jedis 操作Redis 数据 快速入门 创建maven 项目 注意二步是路径配置自己想放哪里 三步是 定义包的层次结构 嫌弃麻烦的也可以不设置 …

chatgpt赋能python:Python编程技巧:如何横着打印差数列

Python编程技巧&#xff1a;如何横着打印差数列 随着互联网时代的到来&#xff0c;SEO已成为企业推广和营销的重要手段。而作为一名具有10年Python编程经验的工程师&#xff0c;我发现Python编程技巧的学习和应用也可以帮助企业优化SEO排名。本文将从实际项目需求出发&#xf…

如何实现Http请求报头的自动转发之设计

HeaderForwarder组件不仅能够从当前接收请求提取指定的HTTP报头&#xff0c;并自动将其添加到任何一个通过HttpClient发出的请求中&#xff0c;它同时也提供了一种基于Context/ContextScope的编程模式是我们可以很方便地将任何报头添加到指定范围内的所有由HttpClient发出的请求…

基于Java家政服务网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

opencv人与摄像头距离、角度检测

参考&#xff1a; https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法&#xff0c;单独重新cv2.VideoCapture() https://b…

新《终结者》电影剧本或交由 ChatGPT 书写

据外媒报道&#xff0c;詹姆斯・卡梅隆透露他正在创作下一部《终结者》电影的剧本&#xff0c;他同时表示新剧本的灵感得益于 OpenAI 的 ChatGPT。 打开豆瓣&#xff0c;1984年10月上映的那部「终结者」评分依然在8分以上。而后&#xff0c;终结者系列的电影不断上新&#xff…

基于Java房屋租售网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

考研计算机组成思维导图总结(408,833,834)

需要思维导图文件和图片的可以去我的Github上寻找&#xff0c;这份思维导图参考23年王道机组&#xff0c;同时添加了一部分833&#xff0c;834需要知识点。 注意&#xff1a;最后的机组知识点仍要以学院进行对照&#xff0c;这里只是提供参考 思维导图pdf和知识点图片 文章目…

<Linux> 《SUSE Linux 中SSH安全加固》

《SUSE Linux 中SSH安全加固》 1 说明2 安全加固2.1 更改 ssh 默认端口2.2 限制 ROOT 远程登陆2.3 修改默认登录时间2.4 升级旧版本2.5 当用户处于非活动时断线2.6 修改加密协议版本2.7 限制 IP 登录2.8 允许或禁止指定用户和组登录2.9 限制监听 IP2.10 最后修改配置文件的属性…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具&#xff0c;要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具&#xff0c;你就可以监控到java虚拟机的gc过程了 那么&#xff0c;这么强大的工具怎么下载呢&…