命令行:html
可视化工具:java
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
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的栈,能够反映以下信息:
频繁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
略