• JVM工具


    在JAVA开发与运维中,经常会遇见一些需要监控JVM性能的问题。例如
    * 内存不足
    * 线程死锁
    * java进程消耗CPU过高

    jps

    可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数

    命令格式:
    jps [ options ]
    options : 
    -m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
    -l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
    -v 输出传给JVM的参数。

    jinfo

    用来查看正在运行的java应用程序的扩展参数(JVM中-X标示的参数);支持在运行时修改部分参数。
    格式
         jinfo [ option ] pid
         jinfo [ option ] executable core 

    参数说明
         pid  对应jvm的进程id
         executable core 产生core dump文件

    options:
         no option   输出全部的参数和系统属性
         -flag  name  输出对应名称的参数
         -flag [+|-]name  开启或者关闭对应名称的参数
         -flag name=value  设定对应名称的参数
         -flags  输出全部的参数
         -sysprops  输出系统属性

    使用 java -XX:+PrintFlagsFinal -version|grep manageable 能看到JVM中哪些flag可以被jinfo动态修改
    举例 : 正在运行的JVM中动态开启GC日志功能:
    jinfo -flag +PrintGCDetails pid
    jinfo -flag +PrintGC pid

    jstack

    主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如 死锁 CPU彪高,程序卡住,系统无响应,居家必备之良药)
    

    格式
    jstack [ option ] pid
    jstack [ option ] executable core
    options:
        -F  强制dump线程堆栈信息. 用于进程hung住, jstack 命令没有响应的情况
        -m  同时打印java和本地(native)线程栈信息,m是mixed mode的简写
        -l  打印锁的额外信息

    线程状态
      我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
    
    NEW,未启动的。不会出现在Dump中。
    RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
    BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
    WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
    TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
    TERMINATED,已退出的。
    https://www.cnblogs.com/kongzhongqijing/articles/3630264.html

    jmap

    可以输出所有内存中对象的,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程内存使用状况,以及对象数量。
    格式
           jmap [ option ] pid
           jmap [ option ] executable core

    options:
    -dump:[live,]format=b,file= 
    使用hprof二进制形式,输出jvm的heap内容到文件. live子选项是可选的,假如指定live选项,
    那么只输出活的对象到文件. 
    -finalizerinfo 打印正等候回收的对象的信息.
    -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
    -histo[:live] 打印每个class的实例数目,内存占用,类全名信息.加上live子参数,只统计活的对象数量. 
    -clstats 打印类加载器的统计信息(取代了在JDK8之前打印类加载器信息的permstat)
    -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. 
    -J 传递参数给jmap启动的jvm.

    jhat

    主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
    

    导出堆 : 
    1) jmap 导出

    2) -XX:+HeapDumpOnOutOfMemoryError 
    3) hprof 
    https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html 
    https://www.cnblogs.com/myna/p/7590620.html

    jstat

    用来监视VM内存内的各种堆和非堆的大小及其内存使用量。详细查看堆内各个部分的使用量,以及加载类的数量。
    格式
     jstat - [-t] [-h] [ []]

    -t  可以在打印的列加上Timestamp列,用于显示系统运行的时间
    -h  可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
    interval    间隔时间,单位为毫秒
     count  用于指定输出多少次记录,缺省则会一直打印
    

    https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html 
    https://www.jianshu.com/p/213710fb9e40
    https://www.cnblogs.com/myna/p/7590620.html

    jconsole

    生产环境不要开放

    它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。
    JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。
    通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

    https://www.cnblogs.com/baihuitestsoftware/articles/6405580.html
    https://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html

  • 相关阅读:
    月半小夜曲下的畅想--DOCTYPE模式
    css模块化思想(一)--------命名是个技术活
    聊聊css盒子模型
    【随笔】借鉴 & KPI式设计
    【转载】社交的蒸发冷却效应
    【随笔】写在闪电孵化器分享会之后
    【随笔】微信删除加载动画
    【随笔】微信支付有感 续
    【转载】如何把产品做简单
    【随笔】写在2014年的第一天
  • 原文地址:https://www.cnblogs.com/ymqj520/p/11378498.html
Copyright © 2020-2023  润新知