JVM经常使用命令解析

命令行:html

  1. jps:虚拟机进程情况工具
  2. jstat:虚拟机统计信息监视工具
  3. jinfo:java配置信息工具
  4. jmap:java内存映射工具
  5. jhat:虚拟机堆转储快照分析工具
  6. jstack:java堆栈跟踪工具
  7. hsdis:jit生成代码反编汇
  8. 目录:D:\Program Files\jdk1.8.0_05\bin
  9. strace命令

可视化工具:java

  1. jconsole:java监视与管理控制台
  2. visualvm:多合一故障处理工具

 

1、jpsc++

http://www.javashuo.com/article/p-mcdyfjuq-gh.html服务器

 jps是jdk提供的一个查看当前java进程的小工具, 能够看作是JavaVirtual Machine Process Status Tool的缩写。很是简单实用。网络

       命令格式:jps [options ] [ hostid ] 多线程

       [options]选项 :框架

-q:仅输出VM标识符,不包括classname,jar name,arguments in main method jvm

-m:输出main method的参数 ide

-l:输出彻底的包名,应用主类名,jar的彻底路径名 工具

-v:输出jvm参数 

-V:输出经过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 

-Joption:传递参数到vm,例如:-J-Xms512m

        [hostid]:

[protocol:][[//]hostname][:port][/servername]

        命令的输出格式 :

lvmid [ [ classname| JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]

 

注意:若是须要查看其余机器上的jvm进程,须要在待查看机器上启动jstatd。

 

2、jstat

定义:

https://blog.csdn.net/zhaozheng7758/article/details/8623549

参数:

l  class (类加载器) 

l  compiler (JIT) 

l  gc (GC堆状态) 

l  gccapacity (各区大小) 

l  gccause (最近一次GC统计和缘由) 

l  gcnew (新区统计)

l  gcnewcapacity (新区大小)

l  gcold (老区统计)

l  gcoldcapacity (老区大小)

l  gcpermcapacity (永久区大小)

l  gcutil (GC统计汇总)

l  printcompilation (HotSpot编译统计)

 

jstat -gc 统计GC信息

一些术语的中文解释: 

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

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

S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) 

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) 

EC:年轻代中Eden(伊甸园)的容量 (字节) 

EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) 

OC:Old代的容量 (字节) 

OU:Old代目前已使用空间 (字节) 

PC:Perm(持久代)的容量 (字节) 

PU:Perm(持久代)目前已使用空间 (字节) 

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

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 

FGC:从应用程序启动到采样时old代(全gc)gc次数 

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 

GCT:从应用程序启动到采样时gc用的总时间(s) 

 

jstat -gccapacity <pid>:

能够显示,VM内存中三代(young,old,perm)对象的使用和占用大小

 

 

 

指定java程序运行内存大小

-Xms -Xmx -Xmn 等,而后观察jstat的结果

 

增长gc参数,java程序自动输出gc日志

vm option: -Xms20M -Xmx20M -Xmn10M

-verbose:gc -XX:+PrintGCDetails -XX:SurvivorRatio=8

说明:

-XX:+PrintGCDetails参数用于告诉虚拟机在发生垃圾收集行为时打印内存回收日志,而且在进程退出的时候输出当前内存的各区域分配状况。

输出日志:

[GC (System.gc()) [PSYoungGen: 7497K->64K(236032K)] 35038K->27604K(1022464K), 0.0022938 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC (System.gc()) [PSYoungGen: 64K->0K(236032K)] [ParOldGen: 27540K->27540K(786432K)] 27604K->27540K(1022464K), [Metaspace: 40881K->40881K(1087488K)], 0.0429459 secs] [Times: user=0.09 sys=0.00, real=0.04 secs]

 

https://www.cnblogs.com/xuezhiyizu1120/p/6237510.html

使用jinfo动态修改程序gc参数,协助调试

jinfo -flag +PrintGCDetails <pid>

jinfo -flag +PrintGC <pid>

jinfo -flag +PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

jinfo -flag +PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

jinfo -flag +PrintHeapAtGC 在进行GC的先后打印出堆的信息

jinfo -flag -Xloggc:../logs/gc.log 日志文件的输出路径

-verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log

 

-Xms100m -Xmx100m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -verbose:gc -Xloggc:/usr/local/e6atlasbus/canbus/canbus-server/gc_logs/gc.log

 

更改gc参数

https://www.cnblogs.com/gouge/p/9112782.html

 

3、jinfo

jinfo 是jdk自带的一个工具,它能够用来查看正在运行的java应用程序的扩展参数(JVM中-X标示的参数);甚至支持在运行时修改部分参数。

jinfo 223536 > tmp/jinfo.txt 获取jvm进程的全部信息

关键字:VM Flags

动态修改命令:

经过如下的命令你便能看到JVM中哪些flag能够被jinfo动态修改:

java -XX:+PrintFlagsFinal -version | grep manageable

 

https://blog.csdn.net/liuxiao723846/article/details/72701414

 

4、jmap

jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。

 

jmap命令能够得到运行中的jvm的堆的快照,从而能够离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的建立,检查系统中什么对象最多,各类对象所占内存的大小等等。可使用jmap生成Heap Dump。 

java memory = direct memory(直接内存) + jvm memory(MaxPermSize +Xmx)

 

JVM直接内存:

直接内存区并非 JVM 管理的内存区域的一部分,而是其以外的。该区域也会在 Java 开发中使用到,而且存在致使内存溢出的隐患。

https://blog.csdn.net/leaf_0303/article/details/78961936

深刻理解JVM之JVM内存区域与内存分配

http://www.javashuo.com/article/p-zzsvwufz-o.html

 

经常使用命令:

jmap -heap <pid> 查看堆内存

jmap -histo:live <pid> 查看对内对象

jmap -dump:live,format=b,file=/f/dump.dat <pid> 导出堆快照

jhat /f/dump.dat 分析dump文件

 

https://www.cnblogs.com/kongzhongqijing/articles/3621163.html

 

dump文件分析

jvisualvm

OQL 分析dump文件 https://www.aliyun.com/jiaocheng/299417.html

select x from com.e6yun.preprocessor.processor.jcmd.JCmdObject x

 

dump文件中的线程分析->jstack命令

 

总结

1.若是程序内存不足或者频繁GC,颇有可能存在内存泄露状况,这时候就要借助Java堆Dump查看对象的状况。

2.要制做堆Dump能够直接使用jvm自带的jmap命令

3.能够先使用jmap -heap命令查看堆的使用状况,看一下各个堆空间的占用状况。

4.使用jmap -histo:[live]查看堆内存中的对象的状况。若是有大量对象在持续被引用,并无被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。

5.也可使用 jmap -dump:format=b,file=<fileName>命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容

6.在内存出现泄露、溢出或者其它前提条件下,建议多dump几回内存,把内存文件进行编号归档,便于后续内存整理分析。

7.在用cms gc的状况下,执行jmap -heap有些时候会致使进程变T,所以强烈建议别执行这个命令,若是想获取内存目前每一个区域的使用情况,可经过jstat -gc或jstat -gccapacity来拿到。

 

5、jhat

jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,能够将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html

 

jhat /f/dump.dat 分析dump文件

使用jvisualvm可视化工具替代

 

6、jstack

jstack命令主要用生成java虚拟机当前时刻的线程快照,来查看Java线程的调用堆栈的,能够用来分析线程问题(如死锁)。

http://www.cnblogs.com/kongzhongqijing/articles/3630264.html

 

命令格式:

jstack [ option ] pid

jstack [ option ] executable core

jstack [ option ] [server-id@]remote-hostname-or-IP

 

经常使用参数说明

1)options: 

executable Java executable from which the core dump was produced.(多是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 惟一id,假如一台主机上多个远程debug服务 

2)基本参数:

-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息,若是直接jstack无响应时,用于强制jstack),通常状况不须要使用

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差不少倍,好比普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。通常状况不须要使用

-m 打印java和native c/c++框架的全部栈信息.能够打印JVM的堆栈,显示上Native的栈帧,通常应用排查不须要使用

-h | -help 打印帮助信息

pid 须要被打印配置信息的java进程id,能够用jps查询.

 

线程状态:

NEW

未启动的。不会出如今Dump中。

RUNNABLE

在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,代表它得到了某把锁。

BLOCKED

受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。

WATING

无限期等待另外一个线程执行特定操做。等待某个condition或monitor发生,通常停留在park(), wait(), sleep(),join() 等语句里。

TIMED_WATING

有时限的等待另外一个线程的特定操做。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

TERMINATED

已退出的。

 

Monitor

在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协做的主要手段,它能够当作是对象或者 Class的锁。每个对象都有,也仅有一个 monitor。这就是wait,notify等方法在Object类的缘由。

 

调用修饰

表示线程在方法调用时,额外的重要的操做。线程Dump分析的重要信息。修饰上方的方法调用。

locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。

waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。

waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。

parking to wait for <地址> 目标

 

线程动做,线程状态产生的缘由

runnable:状态通常为RUNNABLE。

in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。

waiting for monitor entry:进入区等待,状态为BLOCKED。

waiting on condition:等待区等待、被park。

sleeping:休眠的线程,调用了Thread.sleep()。

 

jstack 解决问题实例

http://www.iteye.com/topic/1114219

http://note.youdao.com/noteshare?id=4e05478b110f1d22fbaeb3a740671a00

 

分析问题入手点总结:

wait on monitor entry: 被阻塞的,确定有问题

runnable : 注意IO线程

in Object.wait(): 注意非线程池等待

 

分析经验:

对于jstack作的ThreadDump的栈,能够反映以下信息:

  1. 若是某个相同的call stack常常出现, 咱们有80%的以上的理由肯定这个代码存在性能问题(读网络的部分除外);
  2. 若是相同的call stack出如今同一个线程上(tid)上, 咱们很很大理由相信, 这段代码可能存在较多的循环或者死循环;
  3. 若是某call stack常常出现, 而且里面带有lock,请检查一下这个lock的产生的缘由, 多是全局lock形成了性能问题;
  4. 在一个不大压力的群集里(w<2), 咱们是不多拿到带有业务代码的stack的, 而且通常在一个完整stack中, 最多只有1-2业务代码的stack,
  5. 若是常常出现, 必定要检查代码, 是否出现性能问题。
  6. 若是你怀疑有dead lock问题, 那么请把全部的lock id找出来,看看是否是出现重复的lock id。

 

频繁GC问题或内存溢出问题

1、使用jps查看线程ID

2、使用jstat -gc 3331 250 20 查看gc状况,通常比较关注PERM区的状况,查看GC的增加状况。

3、使用jstat -gccause:额外输出上次GC缘由

4、使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

5、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆状况。

6、结合代码解决内存溢出或泄露问题。

 

死锁问题

1、使用jps查看线程ID

2、使用jstack 3331:查看线程状况

 

6、hsdis

相关文章
相关标签/搜索