在项目中遇到OOM(Out of Memory)的问题,为了分析内存和JVM的垃圾回收器GC问题,一并把JVM相关的一些工具也研究了一下:

  1. jps:Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多
  2. jstat:Java内存使用情况监控工具
  3. jmap:输出JVM内存中对象的工具

这些工具位于JAVA_HOME/bin目录下

?

一,jps (Java Virtual Machine Process Status Tool) JVM进程状态工具

jps用来查看host上运行的所有java进程的pid(lvmid),一般情况下使用这个工具的目的只是为了找出运行的jvm进程ID,即lvmid,然后可以进一步使用其它的工具来监控和分析JVM,因此可以说这个工具并没有太多的功能。

如我本地只启动了visualVM,jps可以看到

? TEXT

 
1
2
2156 Jps
1932 Main

常用的几个参数:

-l 输出java应用程序的main class的完整包

-q 仅显示pid,不显示其它任何相关信息

-m 输出传递给main方法的参数

-v 输出传递给JVM的参数。在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置

如使用 jps -l -v 命令可以输出如下

? TEXT

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Oracle\Middleware\jdk160_05\bin>jps -l -v
5780 sun.tools.jps.Jps
-Dapplication.home=C:\Oracle\Middleware\jdk160_05 -Xms8m
 
1932 org/netbeans/Main -Xms24m -Xmx192m
-Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense
-Dsun.jvmstat.perdata.syncWaitMs=10000
-Djdk.home=C:/Oracle/Middleware/jdk160_05
-Dnetbeans.home=D:\Arone.Zhang\jvm\visualvm_111\platform9
-Dnetbeans.dirs=D:\Arone.Zhang\jvm\visualvm_111\visualvm;D:\Arone.Zhang\jvm\visualvm_111\profiler3
-Dnetbeans.user=C:\Users\Arone.Zhang\AppData\Roaming\.visualvm\1.1.1
-Dnetbeans.system_http_proxy=DIRECT
-Dnetbeans.system_http_non_proxy_hosts=
-Dsun.awt.keepWorkingSetOnMinimize=true

?

jps的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

?

二,jstat (Java Virtual Machine Statistics Monitoring Tool) JVM统计信息监控工具

jstat根据lvmid来实时监控Java应用程序的资源和性能,包括jvm的heap size和GC的回收状况,比起jps工具jstat要强大得多,同时使用起来也较复杂。

?

jstat有如下的生成结果选项(通过 jstat –options 来查看),jstat需要列出lvmid的统计信息,因此需要和jps配合使用

-class :显示加载类和卸载类的数量、所占空间大小和加载类和卸载类所花的时间

-compiler:显示VM实时编译的统计信息,包括编译任务执行的数量、编译任务失败的数量、变为无效的编译任务数量、执行编译任务所花费的时间等等

-gc:显示GC的堆信息,包括存活区、新生代区、永久区、发生GC的次数和所花费的时间

-gccapacity:显示JVM内存池中三代(young、old、perm)对象的使用和占用能力

-gccause:这个和-gcutil选项一样都是显示GC统计信息的汇总信息,只是包括了最后GC事件和当前GC事件

-gcnew:显示新生代对象的统计信息

-gcnewcapacity:显示新生代对象的信息和占用量

-gcold:显示老一代对象的统计信息

-gcoldcapacity:显示老一代对象的信息和占用量

-gcpermcapacity:显示永久代对象的信息和占用量

-gcutil:显示GC统计信息的汇总信息

-printcompilation:打印当前VM执行的信息

?

此工具中涉及到的永久代、老一代和新生代的概念和jdk的GC算法有密切的关系,关于GC的内容请查看Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

jstat使用的除了上面生成结果选项之外,还有收集统计信息的时间间隔和统计的次数,同时还可以控制输出结果的列标题如何出现。

? TEXT

 
1
2
3
4
5
6
7
8
C:\Oracle\Middleware\jdk160_05\bin>jstat -gcnew -t -h3 1932 30 5
Timestamp S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
26638.9 192.0 192.0 0.0 192.0 1 15 96.0 1728.0 1472.7 12737 17.803
26639.0 192.0 192.0 0.0 192.0 1 15 96.0 1728.0 1472.7 12737 17.803
26639.0 192.0 192.0 0.0 192.0 1 15 96.0 1728.0 1472.7 12737 17.803
Timestamp S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
26639.0 192.0 192.0 0.0 192.0 1 15 96.0 1728.0 1472.7 12737 17.803
26639.1 192.0 192.0 0.0 192.0 1 15 96.0 1728.0 1472.7 12737 17.803

?

上面的 -t 选项是用来打印timestamp,-hN选项是用来控制打印列标题,这个选项对于多屏输出结果的时候比较有用,因此上面的jstat -gcnew -t -h3 1932 30 5 代表针对lvmid为 1932 的Java进程收集新生代对象统计信息:包括打印时间戳、每隔3行打印一次标题、30ms统计一次、共统计5次

每个选项输出列的含义请查看官方文档,jstat的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

虽然jstat提供了监控GC状态的强大功能,但是由于它是命令行,在实际问题的分析过程中难度比较高,因此市场上面出现了很多基于此命令的可视化工具,开源工具visualVM就是其中的佼佼者,JDK1.6之后,它已经包括在jdk中了。

?

关于如何使用visualVM来可视化监控JVM状况,后续将整理相关的文章。

?

三,jmap (Memory Map) JVM内存对象打印工具

jmap根据lvmid来Java进程的内存所有对象

?

首先根据选项打印出Java对象堆的直方图信息,包括Java类、类实例对象数量、在内存中占有量的大小以及类的完整包名,下面是缩减版本的直方图信息:

? TEXT

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\Oracle\Middleware\jdk160_05\bin>jmap -histo 3432
 
num #instances #bytes class name
----------------------------------------------
1: 14644 20883096 [I
2: 69176 7689640
3: 111994 6561320 [C
4: 69176 5542192
5: 1933 4825592 [Ljavax.swing.text.GapContent$MarkData;
6: 100440 4480456
7: 6506 3771008
8: 90461 3618440 org.openide.util.RequestProcessor$Item
9: 90239 3609560 org.openide.util.RequestProcessor$EnqueueTask
......
3315: 1 8 sun.misc.Launcher$Factory
3316: 1 8 org.netbeans.core.windows.WindowSystemImpl
3317: 1 8 javax.swing.filechooser.WindowsFileSystemView
3318: 1 8 org.netbeans.ModuleFactory
Total 1767075 103137272

?

其次是将内存堆的信息dump成为一个二进制文件,供jhat这样的Java内存分析工具来使用,如下降Java内存对象堆dump为heap.bin文件:

? TEXT

 
1
2
3
C:\Oracle\Middleware\jdk160_05\bin>jmap -dump:format=b,file=heap.bin 3432
Dumping heap to C:\Oracle\Middleware\jdk160_05\bin\heap.bin ...
Heap dump file created

命令运行完成之后,在同目录下会生成一个heap.bin二进制内存对象堆文件

?

此工具使用比较简单,但是它对于分析内存溢出问题非常有用,目前有很多用来分析Java内存对象的工具,如收费的工具有:jprofiler,YourKit Java Profiler;而像Eclipse MAT则是优秀的内存对象分析开源工具,后续将整理相关的文章。

几个与JVM相关的JDK工具:jps, jstat, jmap的更多相关文章

  1. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  2. [转]jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  3. JVM调优 — 命令大全(jps jstat jmap jhat jstack jinfo)(转)

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  4. jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 运用jv ...

  5. jvm性能监控(3)-jdk自带工具 jps jstack jmap

    一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id   jstack 查看Java线程      jstack -l pid; 做thread dump ...

  6. jvm 性能调优工具之 jstat 命令详解

    Jstat名称:Java Virtual Machine statistics monitoring tool 官方文档:https://docs.oracle.com/javase/1.5.0/do ...

  7. jvm 性能调优工具之 jstat

    概述 Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建 ...

  8. 【Linux】在linux上java工具jps jstat jinfo等命令找不到怎么办

    一.yum安装方式 1)搜索openjdk-devel相关的安装包 yum search java|grep jdk 2)安装对应的版本 yum install -y java-1.8.0-openj ...

  9. 一、jdk工具之jps(JVM Process Status Tools)命令使用

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

随机推荐

  1. 百度语音识别vs科大讯飞语音识别

    一.结果 从笔者试验的结果来看,科大讯飞的语音识别技术远超百度语音识别 二.横向对比   科大讯飞语音识别 百度语音识别 费用 各功能的前5小时免费 全程免费 转换精准率 非常高 比较低 linux ...

  2. NGS检测ALK融合大起底--转载

    导读: ALK融合是非小细胞肺癌的关键驱动机制之一,在NSCLC患者中发生的频率约为3-7%.针对ALK融合的抑制剂克唑替尼.色瑞替尼以及Alectinib在治疗ALK融合阳性的NSCLC患者中都取得 ...

  3. 解决"No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android"错误

    今天安装了Android Studio 3.2,打开一个旧工程,编译提示"No toolchains found in the NDK toolchains folder for ABI w ...

  4. Java线程状态分析

    Java线程的生命周期中,存在几种状态.在Thread类里有一个枚举类型State,定义了线程的几种状态,分别有: NEW: 线程创建之后,但是还没有启动(not yet started).这时候它的 ...

  5. hdu——1873(优先队列)

    看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. Vue.js组件设计原则

    页面上把每个独立可以交互的区域视为一个组件 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面

  7. hdu 3687 10 杭州 现场 H - National Day Parade 水题 难度:0

    H - National Day Parade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  8. MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门

    [引言] 毕竟现在MongoDB还是出于成长阶段,所以现在网上相关的资料很少,而且大部分还都是针对于MongoDB的老版本的.再加上MongoDB的频繁升级.重大更新等等,导致菜鸟学习的难度增大. 好 ...

  9. java Web 工程servlet中@WebServlet("/HelloServlet") 是怎么工作的

    编写好Servlet之后,接下来要告诉Web容器有关于这个Servlet的一些信息.在Servlet 3.0中,可以使用标注(Annotation)来告知容器哪些Servlet会提供服务以及额外信息. ...

  10. Linux:shell脚本字符显示特殊颜色效果

    shell脚本字符显示颜色和特殊效果 (一) 颜色显示 1)字符颜色显示 #!/bin/bash #字符颜色显示 #-e:允许echo使用转义 #\[:开始位 #\[0m:结束位 #\033等同于\e ...