1、定位系统问题

  • 依据

    • GC日志
    • 堆转储快照(heapdump/hprof文件)
    • 线程快照(threaddump/javacore文件)
    • 运行日志
    • 异常堆栈
  • 分析依据的工具
    • jps:显示指定系统内的所有JVM进程
    • jstat:收集JVM各方面的运行数据
    • jinfo:显示JVM配置信息
    • jmap:形成堆转储快照(heapdump文件)
    • jhat:分析heapdump文件
    • jstack:显示JVM的线程快照
    • jconsole
    • visualVM

说明:后边两种是具有图形化界面的。

2、jps(是其他所有命令的基础)

作用:列出所有的JVM虚拟机进程。

格式:jps -l

3、jstat(是没有GUI界面的情况下,在运行期定位JVM性能问题的首选)

作用:查看gc数据和类加载卸载数据

格式:jstat option PID interval count

意义:每隔interval毫秒做一次option,一共做count次

说明:S0(from区)使用了41.74%;S1(to区)使用了0;E(Eden区)使用了54.35%;O(Old,年老代)使用了62.41%;P(Perment,永久代)使用了99.63%;YGC(Young GC)了32次,YGCT(Young GC Time)花销0.132秒;FGC(Full GC)了1次,FGCT(Full GC Time)花销0.102秒;GCT(GC Time)总花销0.234秒。

分析:其实上边这个查询结果可以直接看出,我们需要加大P(永久代大小)

说明:加载了3683个类,总共占有4355.3字节;卸载了0个类,卸载的类的字节数为0,类的加载与卸载共花销3.16秒

更多的jstat的使用,参看 http://my.oschina.net/skyline520/blog/304805

4、jinfo

作用:查看和运行期修改JVM的配置参数

格式:

  • jinfo -flags PID
  • jinfo -flag parameter PID

说明:查看3732进程下的MaxTenuringThreshold参数值。

说明:修改3732进程下的MaxTenuringThreshold参数值,但是windows下失败。

5、jmap

作用:生成堆转储快照和查看最占内存的元素,用于分析内存泄露问题

格式(生成堆转储快照):jmap -dump:format=b,file=文件名 PID

说明:生成了3732进程的堆转储文件myfile

格式(查看最占内存的元素):jmap -histo PID

说明:结果自己去看,太多了

6、jhat

作用:分析堆转储快照(与jmap配合)

格式:jhat 文件名

说明:执行上述命令后,打开localhost:7000,找到如下红框部分打开,这里才是我们最关注的东西。

注意:该工具是万不得已才用的。

推出命令使用"ctrl+c"

7、jstack

作用:生成线程快照,定位线程长时间卡顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)

格式:jstack -l PID

说明:查看3732进程中的所有线程的堆栈信息

《深入理解Java虚拟机》的作者提供了一个工具jsp页面,使得我们可以在程序运行时,随时运行该jsp页面,来查看线程堆栈信息,代码如下:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Map"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jstack</title>
</head>
<body>
<%
for(Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()){
Thread thread = (Thread)stackTrace.getKey();
StackTraceElement[] elements = (StackTraceElement[])stackTrace.getValue(); /* if(thread.equals(Thread.currentThread())){
continue;
} */
out.println("\n线程:"+thread.getName()+"\n");
for(StackTraceElement ele : elements){
out.println("\t"+ele+"\n");
}
}
%>
</body>
</html>

注意:代码中我注释掉一段,是因为想也查出当前线程的堆栈信息,作者并没有这个注释。

总结:

  • JVM性能相关的6个常用的JDK命令

    • jps:查询JVM中的所有进程,找出将要操作的PID,是所有命令的基础
    • jstat:查看相应JVM进程的gc、类加载卸载信息,是没有GUI界面查看JVM运行数据的首选
    • jinfo:查看和在运行期动态修改JVM配置参数
    • jmap:生成堆转储快照和比较占内存的对象
    • jhat:配合jmap分析堆转储日志,除非没有其他工具可做这个事儿,否则就不用该工具
    • jstack:生成线程快照,定位线程长时间卡顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)
  • 输出gc信息到控制台
    • -XX:+PrintGCDetails:输出GC的详细信息
    • -XX:+PrintGCTimeStamps:输出GC的时间信息
    • -XX:+PrintGCApplicatonStoppedTime:GC造成的应用暂停的时间
  • 输出gc信息到文件

    • 以上三个参数在这里依旧适用
    • -Xloggc:文件路径/gc.log:输出到文件

最新文章

  1. MAVEN学习-第一个Maven项目的构建
  2. Shader 学习笔记
  3. php 验证(检查)日期格式是否正确
  4. 新浪微博AppKey大集合(share)
  5. java轻量级Http Server
  6. java jinfo命令详解
  7. NGUI之渲染DrawCall的合并
  8. 配置Linux系统网卡连接网络
  9. MVC 区域模块
  10. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示
  11. 黑马程序员_static\访问权限\单例模式 大汇总
  12. [cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板
  13. 用Python来实现列举某个文件夹内所有的文件列表
  14. SQL学习入门(一) 概述
  15. 中缀表达式得到后缀表达式(c++、python实现)
  16. 实训任务03: 使用Eclipse创建MapReduce工程
  17. WebApi的好处和MVC的区别
  18. Nginx 网络事件
  19. 创建自己的composer包
  20. BZOJ 4173: 数学

热门文章

  1. Xcode的快捷键及代码格式化
  2. 正规表达式 转 NFA C++
  3. C# 操作 access 数据库
  4. [leetcode greedy]45. Jump Game II
  5. [ 原创 ]学习笔记-Android 学习笔记 Contacts (一)ContentResolver query 参数详解 [转载]
  6. BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
  7. BZOJ.2125.最短路(仙人掌 圆方树)
  8. 如何成为一名优秀的CTO(首席技术官)
  9. 【洛谷】1494:[国家集训队]小Z的袜子【莫队】
  10. hdu 3879 方案选择