zoukankan      html  css  js  c++  java
  • 《深入理解Java虚拟机》读书笔记三

    第四章 虚拟机性能监控与故障处理工具

    1、JDK命令行工具

    jps命令:

    • 作用:列出正在运行的虚拟机进程。
    • 格式:jps [option] [hostid]
    • 选项:-q 只输出LVMID(Local Virtual Machine Identifier)省略主类的名称。

          -m 输出虚拟机进程启动时传递给主类的main函数的参数

          -l 输出主类全名,如果进程执行的时jar包,输出Java路径

            -v 输出虚拟机进程启动的jvm参数,显示指定的参数列表,默认参数无法查看

    jstat命令:

    • 作用:虚拟机统计堆信息监视工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
    • 格式:jstat [option vmid [ interval [ s | ms] [ count ] ] ],option代表用户希望查询虚拟机的内容,主要分为类装载,垃圾收集,运行期编译情况,interval代表查询虚拟机间隔,count代表查询次数,若省略说明只查询一次。
    • 选项:-class 监视类装载,卸载数量,总空间以及类装载所耗费的时间。

            -gc监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代等容量,已用空间,GC时间合计等信息。

    jinfo命令:

    • 作用:Java配置信息工具,实时的查看和调整虚拟机各项参数,包括未被显示指定的参数的默认值,并且加入了运行期间修改参数的能力。
    • 格式:jinfo [option] pid
    • 选项:-flag 输出已命名vm参数的值

    jmap命令:

    • 作用:Java内存映像工具,用于生成堆转储快照(一般称为heapdump或者dump文件),它还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率当前用的是那种收集器等。
    • 格式:jmap [option] vmid
    • 选项:-dump 生成Java堆转储快照。-dump: fomat=b, filename=<filename>

          -finalizerinfo显示出F-Queue中等待Finalizer线程执行finalizer方法的对象,只在Linux、Solaris平台有效。

          -heap显示堆中对象统计信息,只在Linux、Solaris平台有效。

          -histo显示堆中对象统计信息,包括类实例数据,合计容量。

          -F当虚拟机进程对dump选项没有响应时可使用这个选项强制生成dump快照,只在Linux、Solaris平台有效。

    jhat命令:

    • 作用:虚拟机对转储快照分析工具,与jmap配合使用,来分析jmap生成的堆储快照,分析结果默认是以包为单位
    • 格式:jhat filename ,打开浏览器访问http://localhost:7000

    jstack命令:

    • 作用:Java堆栈跟踪工具,用于生成虚拟机当前线程快照,线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合,可以通过jstack来查看各个线程调用堆栈,就可以定位到线程出现停顿的常见原因。
    • 格式:jstack [option] vmid
    • 选项:-F当正常输出不被响应时,强制输出线程堆栈。

          -l除了堆栈外显示有关锁的附加信息。

          -m如果调用本地方法的话,可以显示C/C++的堆栈

    HSDIS插件:

    • 作用:HotSpot虚拟机提供的反汇编插件,是让HotSpot的-XX:+PrintAssembly指令调用他来把动态生成的本地代码来分析问题。

    2、JDK可视化工具

    JConsole:

    • 作用:Java监视与管理控制台
    • 内存标签相当于jstat命令用于监视收收集器管理的虚拟机内存。
      package com.ecut.tool;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class MonitoringTest {
      
          static class OOMObject{
              public byte[] placeholder = new byte[64*1024];
          }
      
          public static void fillHeap(int num) throws InterruptedException {
              List<OOMObject> list = new ArrayList<>();
              for(int i =0; i < num ; i++){
                  Thread.sleep(50);
                  list.add(new OOMObject());
              }
              System.gc();
          }
      
          public static void main(String[] args) throws InterruptedException {
              fillHeap(1000);
          }
      }

      运行结果如下:

    • 线程标签相当于jstack命令遇到线程停顿时可以使用这个页签进行分析。
      package com.ecut.tool;
      
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      
      public class MonitoringThreadTest {
      
      
          /**
           * 死循环
           */
          public static void createBusyThread(){
              Thread thread = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      while (true);
                  }
              },"testBusyThread");
              thread.start();
          }
      
          /**
           * 等待锁
           * @param lock
           */
          public static void createLockThread(final Object lock){
              Thread thread = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      synchronized (lock){
                          try {
                              lock.wait();
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                  }
              },"testLockThread");
              thread.start();
          }
      
          public static void main(String[] args) throws IOException {
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((System.in)));
              bufferedReader.readLine();
              createBusyThread();
              bufferedReader.readLine();
              createLockThread(new Object());
          }
      
      }

       运行结果如下:

    • 停顿的主要原因有等待外部的资源(数据库连接网络资源),死循环锁等待。

    VisualVM插件:

    • 显示虚拟机进程及进程配置环境信息。
    • 监视应用程序的CPU、GC、堆、方法区以及线程信息。
    • dump以及分析堆转储快照。
    • 方法级的程序运行性能分析,找出被调用最多的,运行时间最长的方法。

    源码地址:

    https://github.com/SaberZheng/jvm-test

    转载请于明显处标明出处:

    https://www.cnblogs.com/AmyZheng/p/10525147.html

  • 相关阅读:
    StrBlobPtr类——weak_ptr访问vector元素
    StrBlob类——智能指针作为成员
    关于智能指针类型shared_ptr的计数问题
    桌面计算器——可调用对象练习
    union
    虚析构函数
    条款04 确定对象被使用前已先被初始化
    条款03 尽可能使用const
    Bugku-CTF之web8(txt????)
    Bugku-CTF之各种绕过
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/10525147.html
Copyright © 2011-2022 走看看