zoukankan      html  css  js  c++  java
  • 第七章 JVM性能监控与故障处理工具(1)

    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页面,来查看线程堆栈信息,代码如下:

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8" import="java.util.Map"%>
     3 <!DOCTYPE html>
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>jstack</title>
     8 </head>
     9 <body>
    10 <% 
    11     for(Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()){
    12         Thread thread = (Thread)stackTrace.getKey();
    13         StackTraceElement[] elements = (StackTraceElement[])stackTrace.getValue();
    14         
    15         /* if(thread.equals(Thread.currentThread())){
    16             continue;
    17         } */
    18         out.println("
    线程:"+thread.getName()+"
    ");
    19         for(StackTraceElement ele : elements){
    20             out.println("	"+ele+"
    ");
    21         }
    22     }
    23 %>
    24 </body>
    25 </html>
    View Code

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

    总结:

    • 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:输出到文件
  • 相关阅读:
    「NOI2017」蔬菜 解题报告
    线性代数
    idea创建maven的web工程
    logback和slf4j的使用之logger使用
    英雄之言 罗隐
    论英雄
    英雄--偶得佳文不知出处
    日志
    延迟加载线程安全的单例--最佳方式,通过内部类
    linux下安装jdk8
  • 原文地址:https://www.cnblogs.com/java-zhao/p/5184485.html
Copyright © 2011-2022 走看看