霸道流氓气质 于 2023-06-01 10:26:54 发布
记录JVM中常用工具。
jps(JVM Process Status Tool):虚拟机进程状态工具,可以列出正在运行的虚拟机进程,
并显示虚拟机执行主类(Main Class,main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID。
命令格式:
jps [options] [hostid]
示例:
x[hadoop@localhost hadoop-3.3.4]$ jps18768 SecondaryNameNode18418 NameNode18571 DataNode
[hadoop@localhost hadoop-3.3.4]$ jps -l18768 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode18418 org.apache.hadoop.hdfs.server.namenode.NameNode18571 org.apache.hadoop.hdfs.server.datanode.DataNode选项:
-q 只输出LVMID,省略主类的名称 -m 输出虚拟机进程启动时传递给main()函数的参数 -l 输出主类的全名,如果进程执行的是jar包,输出jar路径 -v 输出虚拟机进程启动时JVM参数
用于监控虚拟机各种运行状态信息的命令行工具。
它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,
它是运行期定位虚拟机性能问题的首选工具。
语法:
jstat -
示例:
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jstat -class 18418Loaded Bytes Unloaded Bytes Time6179 13262.2 0 0.0 1.92
xxxxxxxxxxjstat -gc 18418[hadoop@localhost hadoop-3.3.4]$ jstat -gc 18418S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT11776.0 14336.0 0.0 0.0 180224.0 116100.5 62976.0 27539.9 35416.0 34712.0 4096.0 3944.4 8 0.173 2 0.072 0.245
各属性代表的含义:
xxxxxxxxxxjstat -gcutil 27024 5000 10
以上代表5000毫秒执行一次,一共执行10次,查看id为27024的gcutil对应选项的信息。
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jstat -gcutil 18418 5000 10S0 S1 E O M CCS YGC YGCT FGC FGCT GCT0.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.07 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.57 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.57 43.73 98.01 96.30 8 0.173 2 0.072 0.2450.00 0.00 49.57 43.73 98.01 96.30 8 0.173 2 0.072 0.245
jstat -gcutil 命令用于显示 JVM 的垃圾回收(Garbage Collection)情况
选项:
-class 监视类装载、卸载数量、中空间及类装载所耗费的时间 -gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等容量、已用空间、GC合计时间等信息 -gccapacity 监视内容与-gc基本相同,但输出主要关注java堆各区域使用到的最大和最小空间 -gcutil 监控内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 -gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 -gcnew 监视新生代GC的状况 -gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间 -gcold 监视老年代GC的状况 -gcoldcapacity 监视内容与-gcold基本相同,输出主要关注使用到的最大和最小空间 -gcpermcapacity 输出永久代使用到的最大和最小空间 -compiler 输出JIT编译器编译过的方法、耗时等信息 -printcompilation 输出已被JIT编译的方法
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机的各项参数。
使用jps -v 可以查看虚拟机启动时显示指定的参数列表,但是如果想知道未被显示指定的参数的系统默认值,
除了去找资料外,就只能使用jinfo的-flag选项进行查询了。
命令格式:
jinfo [options] pid
选项:
-flags:查看JVM运行时环境参数; -sysprops:查看JVM系统属性; -classloader:查看JVM中已加载的类加载器信息; -jvmflags:查看JVM启动时的参数; -heap:查看JVM堆内存信息; 啥也不加:查看以上所有
示例:
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jinfo 18418Attaching to process ID 18418, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.202-b08Java System Properties:yarn.log.file = hadoop-hadoop-namenode-localhost.localdomain.logjava.runtime.name = Java(TM) SE Runtime Environmentjava.vm.version = 25.202-b08sun.boot.library.path = /usr/java/jdk1.8.0_202-amd64/jre/lib/amd64hadoop.root.logger = INFO,RFAjava.vendor.url = http://java.oracle.com/java.vm.vendor = Oracle Corporationpath.separator = :file.encoding.pkg = sun.iojava.vm.name = Java HotSpot(TM) 64-Bit Server VMyarn.home.dir = /data/hadoop-3.3.4sun.os.patch.level = unknownsun.java.launcher = SUN_STANDARDuser.country = USuser.dir = /home/hadoopjava.vm.specification.name = Java Virtual Machine Specificationhdfs.audit.logger = INFO,NullAppenderjava.runtime.version = 1.8.0_202-b08java.awt.graphicsenv = sun.awt.X11GraphicsEnvironmentos.arch = amd64java.endorsed.dirs = /usr/java/jdk1.8.0_202-amd64/jre/lib/endorsedline.separator =java.io.tmpdir = /tmphadoop.log.file = hadoop-hadoop-namenode-localhost.localdomain.logjava.vm.specification.vendor = Oracle Corporationos.name = Linuxhadoop.id.str = hadoopsun.jnu.encoding = UTF-8jetty.git.hash = 526006ecfa3af7f1a27ef3a288e2bef7ea9dd7e8java.library.path = /data/hadoop-3.3.4/lib/nativehadoop.home.dir = /data/hadoop-3.3.4java.specification.name = Java Platform API Specificationjava.class.version = 52.0java.net.preferIPv4Stack = trueproc_namenode =sun.management.compiler = HotSpot 64-Bit Tiered Compilersyarn.root.logger = INFO,consoleos.version = 3.10.0-957.el7.x86_64user.home = /home/hadoopuser.timezone = Asia/Shanghaijava.awt.printerjob = sun.print.PSPrinterJobfile.encoding = UTF-8java.specification.version = 1.8user.name = hadoopjava.class.path = /opt/xxxxxx/xxx.jarjava.vm.specification.version = 1.8sun.arch.data.model = 64sun.java.command = org.apache.hadoop.hdfs.server.namenode.NameNodejava.home = /usr/java/jdk1.8.0_202-amd64/jreuser.language = enjava.specification.vendor = Oracle Corporationhadoop.security.logger = INFO,RFASawt.toolkit = sun.awt.X11.XToolkitjava.vm.info = mixed modehadoop.log.dir = /data/hadoop-3.3.4/logsjava.version = 1.8.0_202java.ext.dirs = /usr/java/jdk1.8.0_202-amd64/jre/lib/ext:/usr/java/packages/lib/extsun.boot.class.path = /usr/java/jdk1.8.0_202-amd64/jre/lib/resources.jar:xxxjava.vendor = Oracle Corporationfile.separator = /java.vendor.url.bug = http://bugreport.sun.com/bugreport/yarn.log.dir = /data/hadoop-3.3.4/logssun.io.unicode.encoding = UnicodeLittlesun.cpu.endian = littlehadoop.policy.file = hadoop-policy.xmlsun.cpu.isalist =VM Flags:Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=62914560 -XX:MaxHeapSize=991952896 -XX:MaxNewSize=330301440 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=20971520 -XX:OldSize=41943040 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGCCommand line: -Dproc_namenode -Djava.net.preferIPv4Stack=true -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dyarn.log.dir=/data/hadoop-3.3.4/logs -Dyarn.log.file=hadoop-hadoop-namenode-localhost.localdomain.log -Dyarn.home.dir=/data/hadoop-3.3.4 -Dyarn.root.logger=INFO,console -Djava.library.path=/data/hadoop-3.3.4/lib/native -Dhadoop.log.dir=/data/hadoop-3.3.4/logs -Dhadoop.log.file=hadoop-hadoop-namenode-localhost.localdomain.log -Dhadoop.home.dir=/data/hadoop-3.3.4 -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,RFA -Dhadoop.policy.file=hadoop-policy.xml[hadoop@localhost hadoop-3.3.4]$
jdk安装后会自带一些小工具,jmap命令(Memory Map for Java)是其中之一。
主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,
检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。
格式:
jmap [option] pid
选项:
-dump 生成java堆转储快照,格式为:-dump:[live,]format=b,file=
示例:
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jmap -histo 18418num #instances #bytes class name----------------------------------------------1: 174557 43651752 [B2: 4841 36683344 [I3: 170351 23764912 [C4: 4 13762624 [Lorg.apache.hadoop.util.LightWeightGSet$LinkedElement;5: 68553 1645272 java.lang.String6: 12053 931320 [Ljava.lang.Object;7: 6679 763088 java.lang.Class8: 14064 675072 java.util.HashMap9: 17614 563648 java.util.HashMap$Node......省略......3071: 1 16 sun.util.calendar.Gregorian3072: 1 16 sun.util.locale.provider.AuxLocaleProviderAdapter$NullProvider3073: 1 16 sun.util.locale.provider.CalendarDataUtility$CalendarWeekParameterGetter3074: 1 16 sun.util.locale.provider.SPILocaleProviderAdapter3075: 1 16 sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter3076: 1 16 sun.util.resources.LocaleData3077: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControlTotal 720949 131859416
jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,
包括对象的数量,大小等等,并支持对象查询语言。
使用jmap等方法生成java的堆文件后,使用其进行分析。
使用jmap生成java的堆文件
xxxxxxxxxxjmap -dump:format=b,file=1.hprof 27024然后分析堆文件
xxxxxxxxxxjhat 1.hprof结果:
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jmap -dump:format=b,file=1.hprof 18418Dumping heap to /data/hadoop-3.3.4/1.hprof ...Heap dump file created[hadoop@localhost hadoop-3.3.4]$[hadoop@localhost hadoop-3.3.4]$[hadoop@localhost hadoop-3.3.4]$ jhat 1.hprofReading from 1.hprof...Dump file created Thu May 16 22:33:08 CST 2024Snapshot read, resolving...Resolving 753569 objects...Chasing references, expect 150 dots......................................................................................................................................................Eliminating duplicate references......................................................................................................................................................Snapshot resolved.Started HTTP server on port 7000Server is ready.
成功后访问7000端口

jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息, 如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式:
jstack [-l] pid
主要分为两个功能: 针对活着的进程做本地的或远程的线程dump 针对core文件做线程dump
jstack用于生成java虚拟机当前时刻的线程快照。 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息, 从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。 另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
基本参数:
-F 当’jstack [-l] pid’没有响应的时候,强制打印线程堆栈信息,一般情况不需要使用 -l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用,一般情况不需要使用 -m 打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用 -h | -help打印帮助信息 pid 需要被打印配置信息的java进程id,可以用jps查询
示例:
xxxxxxxxxxjstack -l 27024结果:
xxxxxxxxxx[hadoop@localhost hadoop-3.3.4]$ jstack -l 184182024-05-16 22:37:43Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.202-b08 mixed mode):"Connector-Scheduler-14bdbc74-1" #66 prio=5 os_prio=0 tid=0x00007fd5e03e1000 nid=0x50bb waiting on condition [0x00007fd5ce373000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000000c4f7c488> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Locked ownable synchronizers:- None"Attach Listener" #65 daemon prio=9 os_prio=0 tid=0x00007fd5f8bf9800 nid=0x4f26 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None......省略......
JConsole(java monitoring and management console)是一款基于JMX的可视化监视和管理工具。
使用:
点击JDK/bin 目录下面的“jconsole.exe”即可启动 然后会自动自动搜索本机运行的所有虚拟机进程 选择其中一个进程可开始进行监控
具体流程可参考下文
Java中数据同步-synchronized关键字与Mointor的使用:
Java中数据同步-synchronized关键字与Mointor(jconsole)的使用@taskexceptionmointor霸道流氓气质的博客-CSDN博客
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,
对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、
执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
VisualVM位于{JAVA_HOME}/bin目录中。
点击jvisualvm.exe启动

JMX 是 Java Management Extensions(Java管理扩展) 的缩写,它是 Java 平台上用于管理和监控应用程序、系统和网络资源的一种标准化的管理和监控框架。JMX 提供了一种标准的方式,通过这种方式,开发人员可以暴露应用程序中的各种管理和监控信息,然后可以使用 JMX 客户端工具或应用程序来访问和操作这些信息。
JMX 允许开发人员定义称为 MBeans(Managed Beans)的管理组件,这些组件充当被管理资源的代理,并通过 JMX 接口公开资源的操作和属性。通过 MBeans,您可以监控和管理各种 Java 应用程序和服务器的性能、状态和配置。