【JVM】常用命令

图片

一、前言

Java虚拟机(JVM)是Java程序运行的基础设施,它负责将Java字节码转换为本地机器代码并执行。在开发过程中,我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令:jps、jstat、jmap、jhat、jstack和jinfo。

二、命令:jps

jps 命令用于列出当前系统中所有正在运行的Java进程及其主类名。它可以帮助我们快速找到我们需要调试或监控的Java进程。

命令格式:

jps [options] [hostid]

option参数:

  • -l : 输出主类全名或jar路径

  • -q : 只输出LVMID

  • -m : 输出JVM启动时传递给main()的参数

  • -v : 输出JVM启动时显示指定的JVM参数

使用示例:

[root@hope ~]# jps -v
11072 Jps -Denv.class.path=.:/home/jdk-11.0.12/lib:/home/jdk-11.0.12/jre/lib: -Dapplication.home=/home/jdk-11.0.12 -Xms8m -Djdk.module.main=jdk.jcmd
27219 Elasticsearch -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=SPI,COMPAT -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/tmp/elasticsearch-13871375846251346330 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=536870912 -Des.path.home=/usr/local/elasticsearch-7.9.3 -Des.path.conf=/usr/local/elasticsearch-7.9.3/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true

三、命令:jstat

jstat 命令用于收集和报告关于Java虚拟机(JVM)的各种统计信息。这些信息可以帮助我们了解JVM的性能状况,例如垃圾回收情况、内存使用情况等。

命令格式:

jstat 【options】 <PID> 【interval】 【count】

 命令参数说明:

  • Options,一般使用 -gcutil 或  -gc 查看gc 情况

  • pid,当前运行的 java进程号 

  • interval,间隔时间,单位为秒或者毫秒 

  • count,打印次数,如果缺省则打印无数次

Options 参数如下:

  • -gc:统计 jdk gc时 heap信息,以使用空间字节数表示

  • -gcutil:统计 gc时, heap情况,以使用空间的百分比表示

  • -class:统计 class loader行为信息

  • -compile:统计编译行为信息

  • -gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况

  • -gccause:统计引起 gc的事件

  • -gcnew:统计 gc时,新生代的情况

  • -gcnewcapacity:统计 gc时,新生代 heap容量

  • -gcold:统计 gc时,老年代的情况

  • -gcoldcapacity:统计 gc时,老年代 heap容量

  • -gcpermcapacity:统计 gc时, permanent区 heap容量

使用示例1:

jstat -gc 15 5000 5

每5秒一次显示进程号为15的java进程的GC情况,每5S生成异常,一共生成5次。

图片

我可以计算出如下核心数据:

  • 第一个幸存区的大小S0C:300M

  • 第二个幸存区的大小S1C:300M

  • 伊甸园区的大小EC:2400M

  • 老年代大小OC:5000M

  • 方法区大小MC:236M

  • 年轻代垃圾回收消耗时间YGCT:531.164(单位?)

  • 老年代垃圾回收消耗时间FGCT:6.874(单位?)

我们再看输出的GC日志:


Heap before GC invocations=6641 (full 10):par new generation   total 2764800K, used 2492979K [0x00000005cc000000, 0x0000000687800000, 0x0000000687800000)eden space 2457600K, 100% used [0x00000005cc000000, 0x0000000662000000, 0x0000000662000000)from space 307200K,  11% used [0x0000000674c00000, 0x0000000676e8cc90, 0x0000000687800000)to   space 307200K,   0% used [0x0000000662000000, 0x0000000662000000, 0x0000000674c00000)concurrent mark-sweep generation total 5120000K, used 3462278K [0x0000000687800000, 0x00000007c0000000, 0x00000007c0000000)Metaspace       used 209218K, capacity 229352K, committed 241360K, reserved 1265664Kclass space    used 20538K, capacity 24038K, committed 26120K, reserved 1048576K
343501.719: [GC (Allocation Failure) 343501.719: [ParNew: 2492979K->24333K(2764800K), 0.0261186 secs] 5955257K->3486700K(7884800K), 0.0262698 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]

可以计算出如下核心数据:

  • 第一个幸存区的大小S0C:300M

  • 第二个幸存区的大小S1C:300M

  • 伊甸园区的大小EC:2400M

  • 老年代大小OC:从这里计算不出来

  • 方法区大小MC:从这里计算不出来

  • GC耗时:30ms

配置的JAVA_OPTS参数如下:

-Xmx8000M -Xms8000M -Xmn3000M -XX:PermSize=1000M -XX:MaxPermSize=1000M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=69 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:/home/work/logs/applogs/gc.log -javaagent:/home/work/app/prometheus/jmx_prometheus_javaagent-0.12.0.jar=3010:/home/work/app/prometheus/jmx-exporter.yml

使用示例2:

jstat -gccapacity 15

同-gc,不过还会输出Java堆各区域使用到的最大、最小空间


NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
819200.0 819200.0 819200.0 273024.0 273024.0 273152.0  5324800.0  5324800.0  5324800.0  5324800.0      0.0 1251328.0 223560.0      0.0 1048576.0  22716.0    174     8

NGCMN Minimum new generation capacity (KB).
NGCMX Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).
S0C Current survivor space 0 capacity (KB).
S1C Current survivor space 1 capacity (KB).
EC Current eden space capacity (KB).
OGCMN Minimum old generation capacity (KB).
OGCMX Maximum old generation capacity (KB).
OGC Current old generation capacity (KB).
OC Current old space capacity (KB).
PGCMN Minimum permanent generation capacity (KB).
PGCMX Maximum Permanent generation capacity (KB).
PGC Current Permanent generation capacity (KB).
PC Current Permanent space capacity (KB).
YGC Number of Young generation GC Events.
FGC Number of Full GC Events.

四、命令:jmap

jmap命令用于生成Java堆内存快照文件(heap dump)。这些文件可以用于分析内存泄漏问题,或者进行性能调优。

命令格式: 

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] :将文件转储到指定文件中

使用示例1:

将java堆中存活的对象信息转储到/dump.bin文件中

jmap -dump:live,format=b,file=/dump.bin 0813

我们来看一下堆信息: 

jmap -heap 0813

输出: 

Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02using 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 Generationcapacity = 52428800 (50.0MB) //老年代容量used     = 28325712 (27.013504028320312MB) //老年代已使用free     = 24103088 (22.986495971679688MB) //老年代空闲54.027008056640625% used //老年代使用比率15884 interned Strings occupying 2075304 bytes.

输出存活对象信息 : 

jmap -histo:live 0813 | more

图片

使用示例2:

jmap -histo:live 10 | more

打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 ),仅打印前10行。


num     #instances         #bytes  class name
----------------------------------------------1:        938552      113143448  [C2:        983711       31478752  java.util.HashMap$Node3:        930339       22328136  java.lang.String4:         61854       21628224  [B5:        215981       19006328  java.lang.reflect.Method6:        200183       18164992  [Ljava.lang.Object;7:        121341       16297048  [Ljava.util.HashMap$Node;8:        511306       12919376  [Ljava.lang.String;9:        169168        9391000  [I10:        165488        6619520  java.util.LinkedHashMap$Entry11:        131563        6315024  org.hibernate.hql.internal.ast.tree.Node12:        122202        5865696  java.util.HashMap13:        320105        5121680  java.lang.Integer14:        204087        4898088  java.util.ArrayList15:        138888        4444416  java.util.concurrent.ConcurrentHashMap$Node... ...

xml class name是对象类型,说明如下:


B  byte
C  char
D  double
F  float
I  int
J  long
Z  boolean
[数组,如[I表示int[]
[L+类名 其他对象

五、命令:jhat

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

命令格式: 

jhap 【options】 【dumpfile】

option参数解释: 

  • -stack false :关闭对象分配调用堆栈的跟踪

  • -refs false:关闭对象引用的跟踪

  • -port:HTTP服务器端口, 默认是7000

  • -debug:debug级别

  • -version:分析报告版本

使用示例:

jhat dump.hprof

执行结果:

图片

可以通过Http://localhost:7000访问:

图片

具体排查时需要结合代码,观察是否大量应该被回收的对象在一直被引用或者是否有占用内存特别大的对象无法被回收。一般情况,会down到客户端用工具来分析。

六、命令:jstack

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

命令格式: 

jstack 【options】 【pid】

options参数解释: 

  • -F :当使用jstack无响应时,强制输出线程堆栈

  • -m:同时输出java堆栈和c/c++ 堆栈信息

  • -l :除了输出堆栈信息外, 显示关于锁的附加信息

使用示例:

jstack -l 5073|more

执行结果:

图片

七、命令:jinfo

jinfo命令用于显示Java虚拟机(JVM)的配置信息,包括系统属性、Java版本、可用的JVM选项等。这可以帮助我们了解JVM的配置和使用情况。

命令格式:

jinfo 【options】 <pid>

options参数解释:

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

  • -flag :打印指定名称的参数

  • -flag [+|-] :打开或关闭参数

  • -flag = 设置参数值

  • -flags 打印所有参数

  • -sysprops 打印系统配置

使用示例:


# 查看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

图片

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

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

相关文章

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

创新与竞争:Facebook如何在社交媒体市场站稳脚跟

社交媒体市场一直都是激烈的竞争场地&#xff0c;而Facebook凭借其创新的战略一直站稳脚跟&#xff0c;不断引领行业潮流。本文将深入探讨Facebook是如何通过创新与竞争策略&#xff0c;在社交媒体市场中牢牢占据领导地位的。 多元化产品布局 Facebook并非只是一家单一产品的公…

[Java刷算法]牛客—剑指offer第一天

&#x1f9db;‍♂️个人主页&#xff1a;杯咖啡&#x1f4a1;进步是今天的活动&#xff0c;明天的保证&#xff01;✨目前正在学习&#xff1a;SSM框架,算法刷题&#x1f64c;牛客网&#xff0c;刷算法过面试的神级网站&#xff0c;用牛客你也牛。 &#x1f449;免费注册和我一…

我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台&#xff0c;中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题&#xff0c;按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。 最终经过内部讨论决定用Apac…

云服务器部署Stable Diffusion Webui从0到1总结:反复重启+循环debug

文章目录 在学校服务器部署Stable Diffusion Webui&#xff08;一&#xff09;准备工作&#xff08;二&#xff09;环境配置&#xff08;三&#xff09;git拉取项目到本地&#xff08;四&#xff09;运行项目 遇到的问题&#xff1a;&#xff08;一&#xff09;使用git clone时…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

如何解决csgo搬砖饰品买了跌价的问题

大家好&#xff0c;我是阿阳。 经常有粉丝问&#xff1a;近期是该买还是该抛&#xff0c;每次买了就跌&#xff0c;抛了就涨&#xff0c;太揪心了。 在这聊聊阿阳自己对这个问题的看法&#xff0c;首先大家都知道csgo游戏搬砖从饰品持有时间长短&#xff0c;可以分为两类&…

【Python学习】Python学习20- 面向对象(1)

目录 【Python学习】Python学习20- 面向对象&#xff08;1&#xff09; 前言面向对象技术简介类的创建实例&#xff1a;创建实例对象访问属性 Python内置类属性完整代码输出 参考 文章所属专区 Python学习 前言 本章节主要说明Python的面向对象的处理。Python从设计之初就已经…

【Python学习】Python学习19- 异常处理

目录 【Python学习】Python学习19- 异常处理 前言python标准异常异常处理带异常类型语法不带异常类型语法使用except而带多种异常类型try-finally 语句触发异常 参考 文章所属专区 Python学习 前言 本章节主要说明Python的异常处理。 python标准异常 BaseException 所有异常…

中级Python面试问题

文章目录 专栏导读1、xrange 和 range 函数有什么区别&#xff1f;2、什么是字典理解&#xff1f;举个例子3、元组理解吗&#xff1f;如果是&#xff0c;怎么做&#xff0c;如果不是&#xff0c;为什么&#xff1f;4、 列表和元组的区别&#xff1f;5、浅拷贝和深拷贝有什么区别…

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…

OWASP漏洞原理启航(第一课)

OWASP Top 10 2021 介紹 漏洞原理启航介绍 OWASP 定义&#xff1a; AI介绍 OWASP (开放Web应用程序和安全项目) 是一个全球性的社区&#xff0c;致力于提供关于Web应用程序安全性的信息、教育和支持。OWASP是一个非盈利组织&#xff0c;由志愿者驱动&#xff0c;旨在提高Web应…

从“精益思想“看机器人的开发与应用:一场科技与效率的完美融合

在科技飞速发展的今天&#xff0c;机器人已经深入到我们的生活和工作之中&#xff0c;成为了提高效率、提升质量的重要工具。然而&#xff0c;如何让机器人的开发和利用更有效率、更精细&#xff0c;这是摆在我们面前的一道难题。此时&#xff0c;"精益思想"的出现&a…

记ubuntu2004通过NetworkManager修改网络的优先级

这里写自定义目录标题 前言步骤 前言 起因在于万恶的校园网&#xff0c;突然台式有线死活没法认证&#xff08;感觉是IP冲突了&#xff1f;另外一台电脑同样的系统就没有问题&#xff0c;连路由器WIFI也是可以的&#xff0c;路由器设置的是桥接模式&#xff0c;有没有大佬提供…

不分青红皂白,美杜莎勒索软件攻击慈善饮用水机构Water for People

据The Record网站消息&#xff0c;1月11日&#xff0c;勒索软件组织美杜莎&#xff08;Medusa&#xff09;在其暗网受害名单网站上列出了 Water for People——一家专为贫困地区提供清洁饮用水的非盈利组织。 美杜莎向该组织索要30万美元赎金&#xff0c;否则将公布被盗信息。W…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…

操作系统复习 九-十二 章

操作系统复习 九-十二 章 文章目录 操作系统复习 九-十二 章第九章 单处理器调度调度的概念调度的时机、切换与过程进程调度方式调度的基本准则进程的挂起态与七状态模型典型的调度算法 第十一章 I/O管理和磁盘调度I/O 设备I/O控制方式I/O子系统的层次结构IO子系统概述IO调度概…

【电子取证篇】蘇小沐的电子取证工具合集在线文档

【电子取证篇】蘇小沐的电子取证工具合集在线文档 弄成了在线表格&#xff0c;记得及时保存&#xff1b;工具永远只是辅助&#xff0c;但不要过多依赖自动化&#xff0c;有难度说明可以提升&#xff0c;既要不断学习也要不停思考&#xff0c;知行合一—【蘇小沐】 【腾讯文档…

解决防爬虫机制方法(二)

最近为了完成学校的大数据的作业&#xff0c;老师要我们爬一个的网站&#xff0c;里面有还算不错的防爬机制&#xff0c;忙活了几天&#xff0c;总结出一些常见的防爬机制的应对方法&#xff0c;方法均来自个人实战总结&#xff0c;非专业爬虫角度分析 承接上一次讲的方法解决…