세 "에 대한 심층적 인 자바 가상 머신의 이해"연구 노트 - 제 4 장

제 IV VM 성능 모니터링 및 문제 해결 도구

1, JDK 명령 줄 도구

JPS 명령 :

  • 역할 : 프로세스를 실행하는 가상 머신을 나열합니다.
  • 형식 : JPS [옵션] [호스트 ID]
  • 옵션 : -q 출력 만 LVMID (로컬 가상 머신 식별자) 메인 클래스의 이름을 생략.

      가상 기계 프로세스가 시작될 때 파라미터 -m 출력의 메인 클래스의 주요 함수로 전달

      메인 클래스의 전체 이름의 -l 출력, 항아리 패키지의 구현의 과정, 자바 출력 경로의 경우

        가상 기계 프로세스의 출력 -v JVM 파라미터 지정된 파라미터의 목록을 보여주는 시작 디폴트 파라미터를 볼 수없는

그러면 jstat 명령

  • 역할 : 가상 머신 힙 정보 통계 모니터링 도구, 그것은 클래스 로딩, 메모리, 가비지 컬렉션, JIT 컴파일러와 다른 운영 데이터의 과정에서 로컬 또는 원격 가상 머신을 표시 할 수 있습니다.
  • 형식 : 그러면 jstat |, 사용자를 대신 옵션은 가상 머신의 내용이, 클래스 로딩, 가비지 컬렉션, 런타임 컴파일러의 경우, 가상 머신 간격 간격 대표로 나누어 쿼리 싶어 [옵션 VMID [간격 [S MS는] [] 카운트] 카운트 쿼리의 수를 나타냅니다, 한 번만 설명은 생략하면 쿼리합니다.
  • 옵션 : -class 모니터 클래스 로딩, 언 로딩 수량, 공간,이 클래스를로드하는 데 걸리는 총 시간.

        그러한 고정 세대 용량, 사용 된 공간, GC 총 시간 및 기타 정보 등의 에덴 지구, 두 생존자 지구, 옛 시대를 포함하여 GC를 모니터 Java 힙 조건.

있는 jinfo 명령 :

  • 역할 : 자바 구성 도구, 실시간보기와는 지정된 매개 변수에 대한 기본값을 표시하지 포함, 가상 머신의 매개 변수를 조정하고, 작동 중에 매개 변수를 수정할 수있는 기능을 추가했습니다.
  • 형식 :있는 jinfo [옵션] PID
  • 옵션 : -flag 출력 매개 변수의 이름 값 VM

jmap는 명령 :

  • 역할 : (일반적으로 힙 덤프 또는 파일을 덤프라고도 함) 원시 힙 덤프 스냅 샷 자바 메모리 이미징 도구, 당신은 현재 사용되는 쿼리 실행 큐, Java 힙 및 공간 사용으로 영구적 인 세대의 세부 사항을 마무리 할 수 ​​있습니다 종류 컬렉터의 등등.
  • 형식 : jmap의 [옵션] VMID
  • 옵션 : - 덤프 세대의 자바 힙 덤프 스냅 샷. - 덤프 : fomat = B, 파일명 = <이름>

      종료 자 방법 만 리눅스, 효과적으로 Solaris 플랫폼을 실행하는 F-큐 대기 종료 자 스레드를 보여주는 주제 -finalizerinfo.

      단지 리눅스에서 힙 통계에 -heap 표시 객체, Solaris 플랫폼을 효과적으로.

      클래스 인스턴스 데이터를 포함 힙 통계 -histo 표시 객체, 총 용량.

      -F 옵션을 덤프 가상 머신 프로세스 덤프 스냅 샷 만 리눅스, 효과적으로 Solaris 플랫폼을 생성 강제로이 옵션에 응답하여 사용할 수없는 경우.

jhat를 명령

  • 역할 : 가상 머신 스냅 샷 덤프 분석 도구, 분석 할 수있는 jmap과 함께 사용 힙 스토리지 스냅 샷 jmap는 기본 패키지 단위의 분석을 기반으로 생성
  • 형식 : jhat를 파일 이름, HTTP에 액세스하기 위해 브라우저를 열고 : // localhost를 : 7000

jstack을 명령 :

  • 역할 : 현재의 thread의 가상 컴퓨터 스냅 샷을 생성하기위한 자바 스택 추적 도구, 스레드 방법은 각 실행 스레드 스택 수집, 당신은 jstack을하여 각 스레드의 호출 스택을 볼 수있는 현재 가상 머신의 스냅 샷입니다, 당신은 스레드 일시 정지로 이동할 수 있습니다 일반적인 원인.
  • 형식 : jstack을 [옵션] VMID
  • 옵션 : 정상 출력이 응답하지 않는 경우 -F 출력 스레드 스택 강제.

      외부 스택 외에도 잠금에 대한 추가 정보를 표시 -l.

      -m 로컬 메소드 호출, 당신은 C를 표시 할 수있는 경우 / C ++ 스택

HSDIS 플러그인 :

  • 역할 : 핫스팟 가상 머신의 분해는하자 -XX 핫스팟을 플러그인을 제공 : + PrintAssembly 지침은 문제를 분석하기 위해 동적으로 생성 된 네이티브 코드에 그에게 전화 할 수 있습니다.

2, JDK 시각화

JConsole의 :

  • 역할 : 자바 모니터링 및 관리 콘솔
  • 그러면 jstat 메모리 태그는 소득 수집기 관리자 가상 머신의 메모리를 모니터링하는 데 사용되는 명령과 같습니다.
    코드를 복사
    패키지 com.ecut.tool; 수입 인 java.util.ArrayList; 수입 은 java.util.List; 공용 클래스 MonitoringTest { 정적 클래스 OOMObject { 공개 바이트 [] 자리 = 새로운 바이트 [64 * 1024 ]; } 공공 정적 무효 fillHeap ( INT 인분) 발생 예외 : InterruptedException {일람 <OOMObject> 목록 = 새의 ArrayList를 <> (); 경우 ( ; 나는 <NUM 난 ++ I = 0 값 int {Thread.sleep를 (50) )를; 에는 list.add ( OOMObject ()); } 이루어지는 시스템 (); } 공공 정적 무효 메인 (문자열 []에 args)
    
    슬로우 예외 : 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

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

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, 힙, 메소드 영역 및 스레드 정보를 제공합니다.
  • 힙 덤프 분석 및 스냅 샷을 덤프.
  • 분석의 성능 수준의 방법을 실행하면 대부분이라고, 가장 긴 실행 방법을 식별합니다.

원본 주소 :

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

재현은 눈에 잘 띄는 장소에 소스를 표시하시기 바랍니다 :

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

추천

출처www.cnblogs.com/manmanchanglu/p/11621839.html