【JVM】常用命令

这篇具有很好参考价值的文章主要介绍了【JVM】常用命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【JVM】常用命令,JVM,Java,jvm,java

一、前言

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次。

【JVM】常用命令,JVM,Java,jvm,java

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

  • 第一个幸存区的大小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 1265664K
  class 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-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 0813 | more

【JVM】常用命令,JVM,Java,jvm,java

使用示例2:

jmap -histo:live 10 | more

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


num     #instances         #bytes  class name
----------------------------------------------
   1:        938552      113143448  [C
   2:        983711       31478752  java.util.HashMap$Node
   3:        930339       22328136  java.lang.String
   4:         61854       21628224  [B
   5:        215981       19006328  java.lang.reflect.Method
   6:        200183       18164992  [Ljava.lang.Object;
   7:        121341       16297048  [Ljava.util.HashMap$Node;
   8:        511306       12919376  [Ljava.lang.String;
   9:        169168        9391000  [I
  10:        165488        6619520  java.util.LinkedHashMap$Entry
  11:        131563        6315024  org.hibernate.hql.internal.ast.tree.Node
  12:        122202        5865696  java.util.HashMap
  13:        320105        5121680  java.lang.Integer
  14:        204087        4898088  java.util.ArrayList
  15:        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

执行结果:

【JVM】常用命令,JVM,Java,jvm,java

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

【JVM】常用命令,JVM,Java,jvm,java

具体排查时需要结合代码,观察是否大量应该被回收的对象在一直被引用或者是否有占用内存特别大的对象无法被回收。一般情况,会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

执行结果:

【JVM】常用命令,JVM,Java,jvm,java

七、命令: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

【JVM】常用命令,JVM,Java,jvm,java文章来源地址https://www.toymoban.com/news/detail-790814.html

到了这里,关于【JVM】常用命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://blog.csdn.net/weixin_40381772/article/details/135599525

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[JVM]——JVM参数

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 jdk1.7: jdk1.8: 面试题 :给定-Xms Xmx -Xmn 问 最大的eden区域是多少M。 常用JVM参数 怎么对jvm进行调优?通过 参数配置 参数 备注 -Xms 初始堆大小。只要启动,就占用的堆大小,默认是内存的1/64 -Xmx 最大堆大小。默认是内存

    2024年02月11日
    浏览(12)
  • java八股文面试[JVM]——JVM内存结构

    参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构:   方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是

    2024年02月12日
    浏览(12)
  • java-JVM内存区域&JVM运行时内存

    JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部

    2024年02月12日
    浏览(9)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(28)
  • JVM(Java虚拟机)-史上最全、最详细JVM笔记

    一、JVM概述 1、1为什么要学习JVM 1、2虚拟机 1、3JVM作用 1、4JVM整体组成部分  二、JVM结构--类加载器 2、1类加载子系统 2、2类加载过程 2、2、1加载 2、2、2链接 2、2、3初始化 2、3类加载器分类 2.3.1 引导类加载器(启动类加载器 BootStrap ClassLoader) 2.3.2 扩展类加载器(Extension ClassL

    2024年02月03日
    浏览(13)
  • Java虚拟机快速入门 | JVM引言、JVM内存结构、直接内存

    目录 一:JVM引言 1. 什么是 JVM ? 2. 常见的 JVM 3. 学习路线 二:JVM内存结构 1. 程 序 计 数 器(PC Register) 2. 虚 拟 机 栈(JVM Stacks) 3. 本 地 方 法 栈(Native Method Stacks) 4. 堆(Heap) 5. 方 法 区(Method Area) 三:直接内存 tips: 首先给大家推荐两款好用的免费软件:动图抓取软

    2024年02月05日
    浏览(23)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(13)
  • jvm深入研究文档--java中的堆--详解!--jvm底层探索(1)

    JVM的内存分区包括以下几个部分: 堆区(Heap) - 这是JVM的主要部分,用于存储实例对象和大多数Java对象,如数组和用户定义的类。 方法区(Method Area) - 这是线程私有的,用于存放类对象(加载好的类)。 栈区(Stack) - 这是线程私有的,包括虚拟机栈和本地方法栈。虚拟

    2024年02月07日
    浏览(11)
  • JVM | Java内存区域

    以上笔记基于JavaGuide整理 JDK 1.8: 线程私有 的:程序计数器,虚拟机栈,本地方法栈 线程共享 的:堆,方法区(元空间),直接内存 (非运行时数据区的一部分) 程序计数器有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而 实现代码的流程控制 ,如:顺

    2024年02月08日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包