系统在生产运行过程中最重要的工作莫过于监控与问题的处理,监控是预防问题产生很重要的手段。在监控过程中可以发现那些模块或进程出现了问题,出现问题后会及时通知问题负责人。
实现监控的手段非常多,有系统级别监控系统,也有监控小工具等等。Java 就已经自带了一些监控工具,可以不借助外部软件的情况下简单、快速查看相应监控信息。
这些监控工具存放在jdk/bin 目录下,bin 目录下有我们熟悉的javac、java、rmic等编译工具,如图:
下面就分别介绍这些监控工具的使用及作用。
1.jps
用来显示本地的java进程,以及进程号,进程启动的路径等。
用法提示:
usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]
jps实例:
(1)显示运行中的Java进程:
jps #显示结果: 8564 Jps 6844 1364 HelloWorld
(2)显示完整包名:
jps -l #显示结果: 6844 8196 sun.tools.jps.Jps 1364 com.helloworld.hello.HelloWorld
(3)输出Java进程的命令行输入参数:
jps -m #显示结果: 8708 Jps -m 6844 1364 HelloWorld
(4)显示相应Java进程的完整的JVM参数:
jps -v #显示结果: 7296 Jps -Denv.class.path=.;C:\Program Files\Java\jdk1.6.0_38/lib/dt.jar;C:\Prog ram Files\Java\jdk1.6.0_38/lib/tools.jar -Dapplication.home=C:\Program Files\Ja va\jdk1.6.0_38 -Xms8m 6844 -Xmx512m -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=64m 1364 HelloWorld -Dfile.encoding=UTF-8
2.jinfo
jinfo可观察运行中java程序的运行环境参数,参数包括Java System属性和JVM命令行参数;也可从core文件里面知道崩溃的Java应用程序的配置信息。
用法提示:
Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: -flag <name> to print the value of the named VM flag -flag [+|-]<name> to enable or disable the named VM flag -flag <name>=<value> to set the named VM flag to the given value -flags to print VM flags -sysprops to print Java system properties <no option> to print both of the above -h | -help to print this help message
jinfo实例:
首先,通过jps 命令获取Java程序HelloWorld 的进程号1364。(以下均以此为例)
(1)显示所有与该进程相关的信息,如下所示:
jinfo 1364 #显示结果: Attaching to process ID 1364, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.13-b02 Java System Properties: java.runtime.name = Java(TM) SE Runtime Environment sun.boot.library.path = C:\Program Files\Java\jdk1.6.0_38\jre\bin java.vm.version = 20.13-b02 java.vm.vendor = Sun Microsystems Inc. ........(此处省略部分信息) java.vendor = Sun Microsystems Inc. file.separator = \ java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi sun.io.unicode.encoding = UnicodeLittle sun.cpu.endian = little sun.desktop = windows sun.cpu.isalist = amd64 VM Flags: -Dfile.encoding=UTF-8
(2)当然并不是所有信息都是我们需要的,还可以运行"jinfo -flag jvm参数 pid"显示相应jvm参数信息,例如:
jinfo -flag PermSize 1364 #显示结果: -XX:PermSize=21757952 jinfo -flag MaxPermSize 1364 #显示结果: -XX:MaxPermSize=134217728 jinfo -flag AllowUserSignalHandlers 1364 #显示结果: -XX:-AllowUserSignalHandlers
JVM 具体有哪些参数他们的意义都是什么可以参照我的另一篇文章。
3.jstat
jstat 利用了JVM 内建的指令对Java 应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size 和垃圾回收状况的监控等。
用法提示:
Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] Definitions: <option> 选项,我们一般使用 -gcutil 查看gc情况 <vmid> VM的进程号,即当前运行的java进程号 <lines> Number of samples between header lines. <interval> 刷新间隔时间,单位为秒或者毫秒, 格式:<n>["ms"|"s"] 实例:1000ms/1s <count> 刷新次数,默认持续刷新 -J<flag> Pass <flag> directly to the runtime system.
常用option:
-class:统计class loader行为信息 -compile:统计编译行为信息 -gc:统计jdk gc时heap信息 -gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况 -gccause:统计gc的情况,(同-gcutil)和引起gc的事件 -gcnew:统计gc时,新生代的情况 -gcnewcapacity:统计gc时,新生代heap容量 -gcold:统计gc时,老年区的情况 -gcoldcapacity:统计gc时,老年区heap容量 -gcpermcapacity:统计gc时,permanent区heap容量 -gcutil:统计gc时,heap情况
jstat实例:
(1)jstat -gcutil
统计gc heap情况,此选项是较常用的一个选项:
jstat -gcutil 1364 #显示结果: S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000
上面的命令没有刷新时间与刷新次数的参数,所以默认只打印出1行数据内容。
加入刷新间隔:1000ms或1s;刷新次数:5,得到如下结果:
jstat -gcutil 1364 1000ms/1s 5 #显示结果: S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000 0.00 0.00 8.00 0.00 26.07 0 0.000 0 0.000 0.000 #参数含义: S0 — Heap上的 Survivor space 0 区已使用空间的百分比 S1 — Heap上的 Survivor space 1 区已使用空间的百分比 E — Heap上的 Eden space 区已使用空间的百分比 O — Heap上的 Old space 区已使用空间的百分比 P — Perm space 区已使用空间的百分比 YGC — 从应用程序启动到采样时发生 Young GC 的次数 YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) FGC — 从应用程序启动到采样时发生 Full GC 的次数 FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
当去掉次数限制后,控制台会不断刷新内容并一直显示。
(2)jstat -class
显示加载class的数量,及所占空间等信息:
jstat -class 1364 #显示结果: Loaded Bytes Unloaded Bytes Time 696 1351.4 0 0.0 0.21
(3)jstat -compiler
显示VM实时编译的数量等信息:
jstat -compiler 1364 #显示结果: Compiled Failed Invalid Time FailedType FailedMethod 26 0 0 0.10 0
(4)jstat –gccapacity
可以显示JVM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用大小。
jstat -gccapacity 1364 #显示结果: NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 43584.0 697664.0 43584.0 5440.0 5440.0 32704.0 87168.0 1395392.0 87168.0 87168.0 21248.0 83968.0 21248.0 21248.0 0 0
4.jmap
观察运行中的JVM 物理内存的占用情况,包括Heap size , Perm size 等。
用法提示:
Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> to print same info as Solaris pmap -heap 显示jvm heap的情况 -histo[:live] 显示jvm heap的直方图; 如果使用"live"参数则只显示存活对象的情况 -permstat 显示permanent generation heap情况 -finalizerinfo to print information on objects awaiting finalization -dump:<dump-options> to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified , all objects in the heap are dumped. format=b binary format file=<file> dump heap to <file> Example: jmap -dump:live,format=b,file=heap.bin <pid> -F force. Use with -dump:<dump-options> <pid> or -histo to force a heap dump or histogram when <pid> does not respond. The "live" suboption is not supported in this mode. -h | -help to print this help message -J<flag> to pass <flag> directly to the runtime system
jmap实例:
(1)jmap pid
显示运行中Java进程:
jmap 1364 #显示结果: Attaching to process ID 1364, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.13-b02 0x0000000000400000 188K C:\Program Files\Java\jdk1.6.0_38\bin\javaw.exe 0x000000006d450000 156K C:\Program Files\Java\jdk1.6.0_38\jre\bin\java.dll 0x000000006d830000 56K C:\Program Files\Java\jdk1.6.0_38\jre\bin\verify.dll 0x000000006d880000 72K C:\Program Files\Java\jdk1.6.0_38\jre\bin\zip.dll 0x000000006d8c0000 7916K C:\Program Files\Java\jdk1.6.0_38\jre\bin\server\jvm.dll 0x00000000712e0000 308K D:\Program Files\AVAST Software\Avast\snxhk64.dll 0x0000000077640000 1000K C:\Windows\system32\USER32.dll 0x0000000077740000 1148K C:\Windows\system32\KERNEL32.dll 0x0000000077860000 1700K C:\Windows\SYSTEM32\ntdll.dll 0x000007fefb6d0000 236K C:\Windows\system32\WINMM.dll 0x000007fefd6f0000 428K C:\Windows\system32\KERNELBASE.dll 0x000007fefda70000 124K C:\Windows\SYSTEM32\sechost.dll 0x000007fefda90000 412K C:\Windows\system32\GDI32.dll 0x000007fefde40000 804K C:\Windows\system32\USP10.dll 0x000007fefe3d0000 876K C:\Windows\system32\ADVAPI32.dll 0x000007fefe590000 184K C:\Windows\system32\IMM32.DLL 0x000007fefe640000 1060K C:\Windows\system32\MSCTF.dll 0x000007fefe7d0000 56K C:\Windows\system32\LPK.dll 0x000007fefe7e0000 1204K C:\Windows\system32\RPCRT4.dll 0x000007fefeb80000 636K C:\Windows\system32\msvcrt.dll
(2) jmap -heap
显示JVM HEAP情况:
jmap -heap 1364 #显示结果: Attaching to process ID 1364, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.13-b02 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 2143289344 (2044.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 33488896 (31.9375MB) used = 669792 (0.638763427734375MB) free = 32819104 (31.298736572265625MB) 2.0000420437866926% used From Space: capacity = 5570560 (5.3125MB) used = 0 (0.0MB) free = 5570560 (5.3125MB) 0.0% used To Space: capacity = 5570560 (5.3125MB) used = 0 (0.0MB) free = 5570560 (5.3125MB) 0.0% used PS Old Generation capacity = 89260032 (85.125MB) used = 0 (0.0MB) free = 89260032 (85.125MB) 0.0% used PS Perm Generation capacity = 21757952 (20.75MB) used = 3071056 (2.9287872314453125MB) free = 18686896 (17.821212768554688MB) 14.11463725997741% used
(3) jmap -histo
显示JVM资源直方图:
jmap -histo 1364 #将结果输出至jmap.log文件中,这样做的好处是方便查看 jmap -histo pid>jmap.log #显示结果: num #instances #bytes class name ---------------------------------------------- 1: 382046 18338208 java.nio.HeapCharBuffer 2: 4914 673360 <methodKlass> 3: 4914 609488 <constMethodKlass> 4: 8256 512216 <symbolKlass> 5: 406 484728 [I 6: 327 377520 <constantPoolKlass> 7: 300 255328 <constantPoolCacheKlass> 8: 327 237800 <instanceKlassKlass> 9: 1606 208208 [C ......(省略部分内容) 162: 1 16 java.lang.String$CaseInsensitiveComparator 163: 1 16 sun.misc.Launcher 164: 1 16 java.util.Collections$EmptyList 165: 1 16 java.util.Hashtable$EmptyIterator 166: 1 16 java.io.File$1 167: 1 16 java.util.Collections$ReverseComparator Total 408629 22067640
(4)jmap -histo:live
显示活动状态对象JVM资源直方图:
jmap -histo:live 1364 #显示结果: num #instances #bytes class name ---------------------------------------------- 1: 4896 670912 <methodKlass> 2: 4896 607584 <constMethodKlass> 3: 8232 511056 <symbolKlass> 4: 326 376192 <constantPoolKlass> 5: 300 255392 <constantPoolCacheKlass> 6: 326 237216 <instanceKlassKlass> 7: 1576 206720 [C 8: 393 77144 [B 9: 1583 50656 java.lang.String 10: 396 41184 java.lang.Class ......(省略部分内容) 161: 1 16 java.net.UnknownContentHandler 162: 1 16 [Ljava.lang.StackTraceElement; 163: 1 16 sun.misc.Launcher 164: 1 16 java.util.Collections$EmptyList 165: 1 16 java.util.Hashtable$EmptyIterator 166: 1 16 java.util.Collections$ReverseComparator 167: 1 16 java.nio.charset.CoderResult$1 Total 26383 3235456
(5)jmap -dump:live,format=b,file=heap.bin pid
将dump信息保存至heap.bin中
jmap -dump:live,format=b,file=heap.bin 1346
5.jstack
可以观察到jvm中当前所有线程的运行情况和线程当前状态。
用法提示:
Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message
jstack实例:
jstack pid
jstack 7644 2013-08-09 15:38:59 Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.13-b02 mixed mode): "Low Memory Detector" daemon prio=6 tid=0x0000000006adb800 nid=0x18a4 runnable [ 0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=10 tid=0x0000000006ad0800 nid=0x1e34 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=10 tid=0x0000000006a85000 nid=0x1e70 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE .......(省略部分内容) JNI global references: 882
相关推荐
本篇将详细介绍JDK自带的几个主要调试工具,包括`jmap`、`jstack`、`jconsole`,以及相关的文档资源。 1. `jmap`:这是一个用于诊断堆内存状况的工具。通过`jmap`,我们可以获取到堆内存的详细映射,包括对象分配...
### JConsole:JDK 自带的监控工具 #### 一、简介 JConsole是一款由Sun Microsystems(现已被Oracle收购)开发并集成于JDK 1.5及以上版本中的图形化监控工具。它能够帮助开发者及运维人员监测和诊断运行中的Java...
综上所述,JDK 自带的 VM 分析工具 jps、jstat、jmap 和 jconsole 提供了丰富的功能,可以帮助开发者有效地监控和诊断 Java 应用程序的性能问题。掌握这些工具的使用方法,不仅有助于提升开发效率,还能显著提高应用...
5. **jconsole**:Java可视化监控工具,可以实时监控Java应用程序的资源使用情况,如CPU、内存、线程等。 6. **jmap**:内存映射工具,用于获取堆内存的详细信息,包括对象分配、垃圾收集等。 7. **jhat**:Java堆...
JConsole是一款基于JMX(Java Management Extensions)的监控工具,可以实时监控Java应用程序的性能和资源消耗情况,包括内存使用、线程状态、类加载情况等。通过这个工具,开发者可以及时发现并解决性能瓶颈。 **7...
Java Diary - JDK自带的Java数据库,这里主要讨论的是Apache Derby,一个完全的关系型数据库系统,它也是Java开发环境中的一部分。Derby,原名Cloudscape,由IBM开发并贡献给了Apache软件基金会,现在作为Apache的一...
13. **jvisualvm综合监测工具**:集成了许多JDK自带的监测工具,提供更友好的图形界面,可以进行性能分析、内存检测、线程检查等。 这些工具是Java开发者的日常利器,通过深入理解和熟练运用,能够提高开发效率,...
本文将详细介绍如何开启Tomcat的JMX(Java Management Extensions)功能,以及如何使用JDK自带的JVisualVM工具来连接JVM进行性能分析。 **1. Tomcat开启JMX功能** JMX是一种标准的Java技术,它允许开发人员管理并...
首先,我们要了解JDK自带的一些监控工具。`jconsole`是一个图形化的JVM监控工具,可以实时查看内存、线程、类加载等信息,以及进行简单的性能调整。`jvisualvm`是另一个强大的多合一工具,除了基本的监控功能,还...
而JDK自带的日志系统则为开发者提供了一种记录和跟踪程序运行情况的工具。掌握这两项技术,对于提升Java应用的稳定性和性能至关重要。在实际项目中,还需要结合具体需求,灵活调整和优化连接池配置以及日志记录策略...
1. **JVisualVM**:这是JDK自带的一个多用途工具,可以提供实时的性能数据,包括CPU使用率、内存消耗、线程状态等。它还支持JVM配置调整,能够进行堆dump分析,帮助开发者识别内存泄漏问题。通过查看对象分配和存活...
2. **VisualVM**: VisualVM也是JDK自带的一款强大工具,它整合了多种监控和诊断功能。除了基本的JConsole功能外,VisualVM还支持CPU和内存快照,以及线程堆栈跟踪,帮助开发者定位性能瓶颈。 3. **JProfiler**: ...
VisualVM是一款强大的Java应用程序性能分析工具,它是JDK自带的一部分,可以用来监控和诊断Java应用程序。VisualVM提供了丰富的功能,包括内存分析、线程检查、CPU使用率监测、类加载和垃圾收集信息等,帮助开发者...
本文将详细介绍JDK自带的一些强大的JVM监控工具,包括jconsole、jvisualvm以及Oracle JRockit Mission Control (JRMc),并指导如何利用这些工具进行本地和远程JVM监控。 #### 监控工具介绍 ##### jconsole ...
Java开发者可以使用JDK自带的`jconsole`、`jvisualvm`或第三方工具如`VisualVM`进行Java应用的线程监控。 查找异常线程的步骤: 1. **识别问题**:首先,你需要确定存在什么样的问题,比如程序无响应、频繁卡顿或...
- 问题排查:利用JDK自带的JConsole、jmap、jstack等工具进行问题诊断。 总的来说,JDK 1.8 64位为Windows平台上的Java开发提供了强大而稳定的基础。其新特性不仅提升了开发效率,还为大型项目提供了更好的性能...
管理员可以使用JConsole、VisualVM等JDK自带的工具连接到Tomcat的JMX端口,查看和操作各种监控数据。 2. **管理界面**: Tomcat默认开启了一个管理Web应用,通过访问`http://localhost:8080/manager/html`(需配置...
6. **性能调优**:利用JDK自带的JVisualVM或JProfiler等工具进行性能监控和分析。 **四、JDK 11.0.2 的持续学习与进阶** 深入学习JDK 11.0.2,不仅要理解其新特性,还需掌握如何有效地利用这些特性来编写高质量的...
- **性能调优**:使用JDK自带的工具监控CPU、内存和GC(垃圾回收)状态,优化服务器性能。 - **安全更新**:定期关注Oracle发布的JDK安全更新,确保系统的安全性。 - **多版本共存**:有时需要在同一台服务器上安装...
4. 调试与监控:利用JDK自带的JConsole、VisualVM等工具进行性能监控和问题排查。 总之,JDK 1.8.0_91是Java 8的一个重要版本,其特性如Lambda表达式、Stream API和新的日期时间API极大地提升了Java的生产力和代码...