一、jps:JVM Process Status Tool,查看当前机器上所有JVM进程的状态和启动参数
命令格式:jps [options] [hostid]
我们可以通过“jps --help”来查看相关帮助。如下为允许使用的options:
1)-q:只列出JVM进程的id,不展示进程的其他信息。
> jps -q -v 26582 26586 26301 27983
2)-m:输出传递到main方法的参数列表。
3)-l:输出此启动此继承的main方法所在的全package路径、或者JAR的文件路径。
> jps -l 26582 org.apache.catalina.startup.Bootstrap 27991 sun.tools.jps.Jps 26586 org.jetbrains.jps.cmdline.Launcher 26301 org.jetbrains.plugins.scala.nailgun.NailgunRunner
4)-v:输出JVM进程的系统参数,其中包括-D参数和JAVA_OPTS相关参数。
>jps -v 18381 Bootstrap -Djava.util.logging.config.file=/opt/deploy/sample-tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -XX:NewSize=128m -XX:+DisableExplicitGC -Dlogs=/data/logs -Dcache=/opt/deploy/sample-tomcat/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/vipkid/homework/logs/gc.log -Djava.endorsed.dirs=/opt/tomcat/endorsed -Djava.io.tmpdir=/opt/deploy/sample-tomcat/temp
5)-V:输出那些通过flag文件传递给JVM的参数(-XX:Flags=<filename>)。
整体来说,jps跟linux的“ps”指令很像,从整体查看当前机器上所有的JVM进程。
二、jstat:JVM Statistics Monitoring tool,JVM统计数据监控工具,可以用来查看JVM中GC、类加载等信息。
命令格式:jstat [generalOptions | outputOptions vimd [interval [s|ms] [count]]]
generalOptions没有太大用,我们只需要知道使用“jstat -options”来查看可选参的列表,主要是outputOptions:
1)-class:有关classLoader的行为统计
> jstat -class 26582 Loaded Bytes Unloaded Bytes Time 13401 28013.1 381 574.4 23.57
loaded:已加载类的个数,bytes:已加载类的字节数,unloaded、bytes:已卸载类的个数和字节数,time:类加载和卸载耗时。
2)-compiler:统计Hotspot中JIT(just-in-time)编译器的行为。(比较少用)
3)-gc:堆GC的行为统计,通过此指令我们能了解heap各个区域的内存使用情况。
>jstat -gc 26582 2s 100 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 63488.0 10240.0 0.0 10080.0 520192.0 259699.6 1398272.0 1272911.1 92352.0 89826.6 9984.0 9458.4 1089 24.631 11 25.624 50.255
新生代,有三块:eden、survivor0、survivor1,其中EC、S0C、S1C分别表示上述三个区的compacity(KB),EU、S0U、S1U分表表示上述三个区的已使用空间。OC、OU表示救年老代的空间和使用量,PC、PU表示持久带的情况。YGC、YGCT分别表示新生代GC的次数和总时间,FGC、FGCT表示FULL GC的次数和总时间,GCT表示所有GC的总时间。
通常我们可以根据这些参数来观察,JVM内存分布、GC的情况,以便进行调优。(对于互联网系统,通常YGC与FGC相差数倍,即极少的FGC,但是通常YGC会几分钟就会执行一次)
4)-gccapacity:大体作用同-gc,也可以用来查看堆的各区域内存现状。
5)-gccause:展示内容同上,不过包含两个特殊的列“LGCC”、“GCC”,表示导致上次或者本次GC的原因,通常原因都是“内存分配失败”。
6)-gcnew:展示新生代的gc情况,同上。同类型指令还有-gcold。
7)-gcutil:全局的gc行为统计。基本上是上述几个gc指令的汇总。
我们可以使用jps找到jvm的进程ID,然后使用jstat分析特定ID的堆内存情况。
三、jinfo:查看一个JVM进程的全部配置信息,包括系统变量、加载的lib、JAVA_OPTS信息、JDK(JVM)的版本情况等。可以修改flag值。
四、jmap:JVM Memory Map,JVM内存图,通常可以用来查看当前JVM的内存中对象存活情况、跟踪对象创建过程等。
1)-dump:[live,] format=b,file=<filename>:将JVM堆内存中对象(live表示只dump存活的)dump到执行的文件中,使用hprof格式,此后我们可以使用jhat工具来查看此文件。通常可以使用-dump来分析内存中对象个数和数据状态,比如跟踪某个对象实例的个数,数组的容量变化等。
2)-finalizerinfo:打印出等待finalization的对象信息。如果你的实例有重写终结方法的,可以通过此选项查看。
3)-heap:打印JVM的heap配置信息,比如堆大小、新生代(newSize)等等,以及GC的算法(打印结果的前几行)。这些信息当然也可以通过jstat、jinfo来查看。
>jmap -heap 26832 using thread-local object allocation. Parallel GC with 2 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 536870912 (512.0MB) NewSize = 178782208 (170.5MB) MaxNewSize = 178782208 (170.5MB) OldSize = 358088704 (341.5MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 102760448 (98.0MB) used = 54807000 (52.268028259277344MB) free = 47953448 (45.731971740722656MB) 53.33472271354831% used From Space: capacity = 39321600 (37.5MB) used = 7370120 (7.028694152832031MB) free = 31951480 (30.47130584716797MB) 18.743184407552082% used To Space: capacity = 36700160 (35.0MB) used = 0 (0.0MB) free = 36700160 (35.0MB) 0.0% used PS Old Generation capacity = 358088704 (341.5MB) used = 46609072 (44.44987487792969MB) free = 311479632 (297.0501251220703MB) 13.016068778310304% used
4)-histo[:live]:根据每个java class类型,打印出相应类的实例个数、内存占用空间(bytes)的直方图,live选项表示只打印存活的对象个数(和占用空间);这个指令可以帮助我们关注JVM中某种class的实例个数和占用内存量,对分析内存消耗、OOM排查有很大帮助。
>jmap -histo:live 30402 num #instances #bytes class name ---------------------------------------------- 1: 129824 15193328 [C 2: 7631 13005088 [B 3: 127333 3055992 java.lang.String 4: 22984 1308592 [Ljava.lang.Object; 5: 14557 1281016 java.lang.reflect.Method 6: 39153 1252896 java.util.HashMap$Node 7: 8843 997240 java.lang.Class 8: 7260 982096 [Ljava.util.HashMap$Node;
五、jstack:stack trace,用于打印java线程的调用栈(执行栈,瞬时),包括class全名、方法名、行号等,如果指定-m还会打印native帧;不过对于实际工作情况,我们通常用于追踪多线程任务调度过程、对象lock(或者死锁)、并发同步阻塞、IO线程执行状态等;比如排查某个线程为何wait(假死,阻塞等)。
1)-l:打印出当前JVM所有的线程状态和执行栈,包括locks(java.util.concurrent)。
"http-nio-8080-exec-7" #78 daemon prio=5 os_prio=31 tid=0x00007f876f957000 nid=0x13403 waiting on condition [0x00007000043e8000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000740994e50> (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.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Locked ownable synchronizers: - None
如果有死锁时,大概的错误信息如下:
Found one Java-level deadlock: ============================= "pool-1-thread-2": waiting to lock monitor 0x0237ada4 (object 0x272200e8, a java.lang.Object), which is held by "pool-1-thread-1" "pool-1-thread-1": waiting to lock monitor 0x0237aa64 (object 0x272200f0, a java.lang.Object), which is held by "pool-1-thread-2"
2)-m:混合模式,可以打印native帧。
相关推荐
在Java应用程序的开发和运行过程中,了解JVM的工作原理,监控其状态,以及进行性能调优是至关重要的。本文将深入探讨JVM内存结构、监控工具及其在调优和GC优化中的应用。 **JVM内存机构** JVM内存主要分为以下几个...
本文将详细介绍几种常见的JVM性能调优工具,并通过实际案例帮助读者更好地理解和应用这些工具。 #### 一、jps (Java Virtual Machine Process Status Tool) `jps`是JDK自带的一个简单实用的工具,用于列出当前正在...
在Java应用程序的性能调优过程中,掌握一系列命令行工具是至关重要的。这些工具可以帮助开发者监控应用程序的运行状态,诊断性能瓶颈,并对JVM进行调优。以下是一些常用的Java性能调优命令及其用法和相关知识点。 1...
上述知识和命令涵盖了JVM调优中不可或缺的几个重要方面,从内存分析到故障排查,再到性能监控。掌握这些工具和方法对于解决生产环境中的性能问题至关重要。熟练运用JVM调优工具可以为开发者提供一套强大的问题诊断和...
Java性能监控与调优是Java开发中的重要环节,它涉及到应用程序的稳定性、效率及资源管理。这个名为"monitor_tuning_Demo"的压缩包文件,很显然是为了教授如何使用JDK提供的监控工具以及进行JVM(Java虚拟机)的调优...
Java内存参数调优是优化Java应用程序性能的关键环节,特别是对于大型和高负载的应用,...不过,内存调优是一个细致且需要实践经验的过程,实际应用中可能需要结合监控工具(如VisualVM、JConsole等)进行观察和调整。
综上所述,Java性能测试与调优是一个涉及多个方面的复杂过程,需要考虑JVM配置、应用服务器设置、数据库性能监控以及代码层面的优化。通过细致地分析和调整,可以显著提高Java应用程序的性能和响应速度。文档中的...
在进行Java性能调优之前,理解几个重要的理论概念是非常必要的: 1. **木桶原理**:一个系统的性能往往取决于最弱的部分。在Java性能调优中,这意味着我们需要找到限制系统性能的瓶颈,并对其进行优化。 2. **...
- **运行时分析**:JVM在运行时主要分为几个关键部分,包括类加载器、运行时数据区、执行引擎、本地方法接口和本地库。这些组件协同工作,确保程序的正常执行。其中,堆内存用于存储对象实例,方法区存放类信息,栈...
在排查内存问题时,我们需要关注几个关键点:检查是否存在内存泄漏,分析堆内存快照以定位占用内存的对象,监控JVM的GC行为,以及了解应用的内存分配模式。通过工具如JVisualVM、MAT(Memory Analyzer Tool)或...
- **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及主类的名称或jar文件的名字。 - **常用参数**: - `-q`: 只显示PID,不显示其他信息。 - `...
本文将详细介绍几个常用的JVM性能监控工具及其功能,包括Jinfo、Jstat、Jmap和Jstack。 1. **Jinfo**: Jinfo是一款用于查看和修改Java进程配置参数的命令行工具。它可以帮助开发者了解正在运行的Java应用程序的...
在Java性能调优领域,有以下几个核心知识点: 1. **JVM调优**:Java虚拟机(JVM)是Java程序运行的基础,其性能直接影响应用的响应速度和稳定性。书中会深入讲解JVM内存模型,包括堆内存、栈内存、方法区等,以及...
本篇文章将详细介绍一些常用的GC调优工具,帮助开发者更好地理解和调整Java应用程序的内存管理。 首先,我们要了解JVM的内存模型,它主要分为年轻代、老年代和永久代(在Java 8中被元空间取代)。GC的主要工作就是...
首先,性能测试的目标是评估服务器在特定场景下的表现,主要关注以下几个指标: 1. TPS(Transactions Per Second):每秒事务处理量,衡量系统处理请求的速度。 2. 响应时间:从客户端发起请求到接收到响应的时间...
在IT行业中,性能监控和调优是至关重要的环节,尤其对于服务器端应用如Tomcat、数据库系统MySQL和Oracle,以及Java虚拟机(JVM)来说。这些组件在支撑大规模业务时,性能表现直接影响到系统的响应速度和用户体验。...
调优主要包括以下几个方面: 1. 设置合理的堆大小:过大可能导致内存浪费,过小则可能导致频繁的垃圾收集。可以通过-Xms和-Xmx设置初始堆大小和最大堆大小。 2. 年轻代与老年代的比例:-XX:NewRatio参数可以调整...
性能分析应包括以下几个步骤: 1. 评估系统配置、吞吐量和负载状况。 2. 使用性能测量工具(如Glance/gpm、sar、vmstat等)进行测量。 3. 分析收集到的数据,寻找可能的瓶颈。 4. 一次只修改一个变量,然后重新测量...