`

(转)JDK工具(查看JVM参数、内存使用情况及分析等)

 
阅读更多

 

 https://www.cnblogs.com/z-sm/p/6745375.html

 

在JDK的bin目录下有很多命令行工具:

             

  我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。命令行工具的好处是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程telnet到服务器上都会受到限制。而借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。

常用命令:

这里主要介绍如下几个工具:

1、jps:查看本机java进程信息。

2、jstack:打印线程的信息,制作线程dump文件。

3、jmap:打印内存映射,制作dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台

JAVA Dump:

JAVA Dump就是虚拟机运行时的快照,将虚拟机运行时的状态和信息保存到文件中:

线程dump:包含所有线程的运行状态,纯文本格式

堆dump:包含所有堆对象的状态,二进制格式

java dump可以在任何java环境使用,信息量充足,针对非功能性性的bug,主要为多线程开发、内存泄漏。

1、jps

显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。

执行jps命令,会列出所有正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id,这个id的作用非常大,后面会有相关介绍。

jps -help:

jps -l 输出应用程序main.class的完整package名或者应用程序jar文件完整路径名

jps -v 输出传递给JVM的参数

jps失效

我们在定位问题过程会遇到这样一种情况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

要解释这种现象,先来了解下jps的实现机制:

java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

我们来思考下:如果由于磁盘满了,无法创建这些文件,或者用户对这些文件没哟读的权限。又或者因为某种原因这些文件或者目录被清除,出现以上这些情况,就会导致jps命令失效。

如果jps命令失效,而我们又要获取pid,还可以使用以下两种方法:

1、top | grep java

2、ps -ef |grep java

2、jstack

主要用于生成指定进程当前时刻的线程快照,线程快照是当前java虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。

3、jmap

主要用于打印指定java进程的共享对象内存映射或堆内存细节。

堆Dump是反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,我们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

jmap的用法摘要:

1、jmap pid

打印的信息分别为:共享对象的起始地址、映射大小、共享对象路径的全程。

2、jmap -heap pid:查看堆使用情况

 

3、jmap -histo pid:查看堆中对象数量和大小

打印的信息分别是:序列号、Class实例的数量、内存的占用、类限定名

如果是内部类,类名的开头会加上*,如果加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

 

4、jmap -dump:format=b,file=heapdump pid:将内存使用的详细情况输出到文件

     然后使用jhat命令查看该文件:jhat -port 4000 文件名 ,在浏览器中访问http:localhost:4000/

总结:

该命令适用的场景是程序内存不足或者GC频繁,这时候很可能是内存泄漏。通过以上命令查看堆使用情况、大量对象被持续引用等情况。

4、jstat

主要是对java应用程序的资源和性能进行实时的命令行监控,包括了对heap size和垃圾回收状况的监控。

 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

option:我们经常使用的选项有gc、gcutil

vmid:java进程id

interval:间隔时间,单位为毫秒

count:打印次数

1、jstat -gc PID 5000 20

S0C:年轻代第一个survivor的容量(字节)

S1C:年轻代第二个survivor的容量(字节)

S0U:年轻代第一个survivor已使用的容量(字节)

S1U:年轻代第二个survivor已使用的容量(字节)

EC:年轻代中Eden的空间(字节)

EU:年代代中Eden已使用的空间(字节)

OC:老年代的容量(字节)

OU:老年代中已使用的空间(字节)

PC:永久代的容量

PU:永久代已使用的容量

YGC:从应用程序启动到采样时年轻代中GC的次数

YGCT:从应用程序启动到采样时年轻代中GC所使用的时间(单位:S)

FGC:从应用程序启动到采样时老年代中GC(FULL GC)的次数

FGCT:从应用程序启动到采样时老年代中GC所使用的时间(单位:S)

2、jstat -gcutil PID 5000 20

s0:年轻代中第一个survivor已使用的占当前容量百分比

s1:年轻代中第二个survivor已使用的占当前容量百分比

E:年轻代中Eden已使用的占当前容量百分比

O:老年代中已使用的占当前容量百分比

P:永久代中已使用的占当前容量百分比

5、jhat

主要用来解析java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。

生成dump文件的方法前面已经介绍了,这边主要介绍如何解析java堆转储文件,并启动一个web server

jhat heapdump

这个命令将heapdump文件转换成html格式,并且启动一个http服务,默认端口为7000。

如果端口冲突,可以使用以下命令指定端口:jhat -port 4000 heapdump

下面我们来访问下:ip:port

6、jinfo

jinfo可以用来查看正在运行的java运用程序的扩展参数,甚至支持在运行时动态地更改部分参数。

基本使用语法如下: jinfo -< option > < pid > ,其中option可以为以下信息:

-flag< name >: 打印指定java虚拟机的参数值

-flag [+|-]< name >:设置或取消指定java虚拟机参数的布尔值

-flag < name >=< value >:设置指定java虚拟机的参数的值

使用示例

下面的命令显示了新生代对象晋升到老年代对象的最大年龄。在运行程序运行时并没有指定这个参数,但是通过jinfo,可以查看这个参数的当前的值。

下面的命令显示是否打印gc详细信息:

下面的命令在运用程序运行时动态打开打印详细gc信息开关:

注意事项:jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改。

7、jcmd

在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看java进程,导出线程信息,执行GC等。jcmd拥有jmap的大部分功能,Oracle官方建议使用jcmd代替jmap。

使用 jcmd -l 命令列出当前运行的所有虚拟机,示例:

针对每一个虚拟机,可以使用help命令列出该虚拟机支持的所有命令,示例:

其中,

  • VM.native_memory
  • VM.commercial_features
  • GC.rotate_log
  • ManagementAgent.stop
  • ManagementAgent.start_local
  • ManagementAgent.start
  • Thread.print,                         打印线程栈信息
  • GC.class_histogram,              查看系统中类统计信息
  • GC.heap_dump,                    导出堆信息,与jmap -dump功能一样
  • GC.run_finalization,               触发finalize()
  • GC.run,                                触发gc()
  • VM.uptime,                           VM启动时间
  • VM.flags,                              获取JVM启动参数
  • VM.system_properties,          获取系统Properties
  • VM.command_line,                 启动时命令行指定的参数
  • VM.version
  • help
示例:

 

参考资料

http://www.cnblogs.com/dongguacai/p/5910134.html

http://qifuguang.me/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/

分享到:
评论

相关推荐

    JVM监控工具使用入门

    jconsole是一款轻量级的监控工具,主要功能包括查看JVM的状态信息、线程信息、内存使用情况等。虽然它的功能相对较少,但对于初级用户来说已经足够使用。通过jconsole,用户可以直观地看到JVM的CPU使用率、堆内存...

    ha456.jar(IBMHeapAnalyzer)JVM内存分析工具

    也可以使用`jmap`命令(在JDK工具集中)手动生成堆转储。 IBMHeapAnalyzer的运行方式是在命令行环境中进行。首先,确保你已经将ha456.jar文件下载到本地,并且知道其存放位置。接着,打开命令行终端,导航到该jar...

    jdk工具介绍JVM垃圾回收23种设计模式

    5. `jmap`:提供内存映射和堆转储功能,有助于分析内存使用情况。 6. `jhat`:与`jmap`配合使用,分析堆转储文件,找出内存泄漏等问题。 7. `jconsole` 和 `jvisualvm`:可视化工具,用于监控JVM的性能和内存状态。 ...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 #### 结语 合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理...

    openjdk8u60+jvm jdk源码+jvm源码

    HotSpot 是 Oracle JDK 和 OpenJDK 使用的默认 JVM 实现,它的名字来源于其“热点代码”检测技术,能够识别并优化经常执行的代码段。 在 OpenJDK 8u60 中,我们可以找到以下关键知识点: 1. **类加载器(Class ...

    java内存分析工具dumpAnalyzer

    总的来说,dumpAnalyzer是Java开发者的重要工具,它能帮助我们有效地管理和优化应用的内存使用,提升系统的稳定性和性能。通过深入理解和熟练运用这个工具,我们可以更有效地诊断和修复内存相关的问题,为我们的Java...

    jdk,jvm源码

    了解JVM源码可以帮助我们深入理解Java程序的运行过程,优化内存使用,提升程序性能,排查故障。例如,通过阅读垃圾回收器的源码,我们可以学习如何调整参数以适应不同的应用场景;通过分析类加载机制,可以实现...

    jvm crash的崩溃日志详细分析及注意点

    分析JVM崩溃日志时,重点是定位问题所在的代码行,了解触发错误的操作,以及查看是否有内存管理问题,如堆溢出或栈溢出。同时,还要检查堆栈跟踪,确定哪些线程或方法在崩溃时刻正在执行,并结合Java堆、方法区、元...

    JVM-内存管理 2012-12.pdf

    这些工具可以用来监控堆内存的使用情况,识别内存泄漏,分析内存使用趋势,帮助开发者进行性能调优。 总结而言,JVM内存管理涉及多个层面,包括内存结构的划分、内存空间的分配与回收机制、以及内存分析工具的使用...

    JVM内存空间分配笔记

    - **工具介绍**:JConsole是一款强大的性能监控工具,它可以显示Java应用程序的内存使用情况、线程活动、类装载等信息。 - **使用步骤**: 1. 运行JConsole。 2. 运行需要监控的Java程序。 3. 使用JConsole连接到...

    jvm工具、参数调优&调试技巧(补充+修正版)

    1. JVisualVM:集成在JDK中的多合一工具,可以提供内存分析、线程监控、CPU剖析等功能,方便开发者实时查看JVM状态。 2. JConsole:同样内置于JDK,提供GUI界面来监控Java应用程序的性能和资源消耗。 3. JProfiler:...

    JVM 监控 调优 工具

    1. **JConsole**:这是Java SDK自带的一个图形化监控工具,可以查看JVM的内存使用情况、线程状态、类加载情况等。 2. **VisualVM**:功能更为强大的多合一JVM分析工具,提供CPU和内存分析、线程快照、方法Profiling...

    关键业务系统JVM参数推荐

    ### 关键业务系统JVM参数推荐 #### 一、引言 在关键业务系统中,除了追求高吞吐量和低延迟之外,系统的稳定性和问题排查的便捷性同样至关重要。因此,选择合适的JVM参数变得尤为重要。本文将详细介绍一些常用的JVM...

    java—JDK内置工具使用技巧详解

    - **功能**:jconsole 是一个基于 JMX(Java Management Extensions)技术的图形化监控工具,能够实时显示 JVM 的内存使用情况、垃圾回收状态等信息。 - **使用场景**:适用于需要实时监控 Java 应用程序资源使用...

    设置Eclipse的JVM参数

    还可以通过命令行工具启动Eclipse时指定JVM参数。例如,在Windows环境下: ```bat eclipse -vm C:\Program Files\Java\jdk1.8.0_251\bin\javaw.exe -vmargs -Xms128m -Xmx712m -XX:MaxPermSize=128m ``` ##### 3. ...

    vmmap 观察jvm内存 监控jvm jvm线程

    - `vmmap`虽然不能直接展示线程详情,但通过查看内存使用情况,可以间接推断线程的状态。比如,大量线程可能导致栈内存占用增大。 - 结合`jstack`工具,可以获取JVM内部线程的详细信息,包括线程状态、阻塞原因等...

    JAVA JVM内存监控工具总结

    Java JVM内存监控是优化Java应用程序性能的关键环节,而VisualVM作为一款集成多种JDK命令行工具的可视化平台,提供了强大的分析功能。它包含的工具如jps、jstat、jmap、jinfo、jstack和JConsole,都是JDK的标准组成...

    JVM性能监测及调优实战

    通过 jstat 命令,我们可以监测到 JVM 的内存使用情况,包括堆内存信息、垃圾回收信息等。 在 JVM 性能监测及调优中,我们需要使用多种工具和方法来监测和优化 JVM 的性能,包括 Linux 命令行工具和 JDK 工具。这...

    JVM高级特性与最佳实践第二版+JDK1.8_API_DOC

    JVM的性能优化主要涉及内存调优、垃圾收集器选择、JVM参数调整等方面。例如,合理设置堆大小、新生代与老年代的比例、存活对象的阈值等,可以有效避免OutOfMemoryError。选择合适的垃圾收集器(如Serial、Parallel、...

Global site tag (gtag.js) - Google Analytics