25 jdk监控和故障处理工具

jdk命令行工具

  • jps(jvm process status):查看所有java进程启动类、传入参数和java虚拟机参数等信息。

    • jps:显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID(Local Virtual Machine Identifier,LVMID)。
    • jps -q :只输出进程的本地虚拟机唯一 ID。
    • jps -l:输出主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径。
    • jps -v:输出虚拟机进程启动时 JVM 参数。
    • jps -m:输出传递给 Java 进程 main() 函数的参数。
  • jstat (JVM Statistics Monitoring Tool): 用于监视虚拟机各种运行状态信息的命令行工具。它可以显示虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。

    • jstat 命令使用格式:
      jstat -
    • jstat -class vmid :显示 ClassLoader 的相关信息;
    • jstat -compiler vmid :显示 JIT 编译的相关信息;
    • jstat -gc vmid :显示与 GC 相关的堆信息;
    • jstat -gccapacity vmid :显示各个代的容量及使用情况;
    • jstat -gcnew vmid :显示新生代信息;
    • jstat -gcnewcapcacity vmid :显示新生代大小与使用情况;
    • jstat -gcold vmid :显示老年代和永久代的行为统计,从jdk1.8开始,该选项仅表示老年代,因为永久代被移除了;
    • jstat -gcoldcapacity vmid :显示老年代的大小;
    • jstat -gcpermcapacity vmid :显示永久代大小,从jdk1.8开始,该选项不存在了,因为永久代被移除了;
    • jstat -gcutil vmid :显示垃圾收集信息;
    • 另外,加上 -t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间。
  • jinfo (Configuration Info for Java) :输出当前 jvm 进程的全部参数和系统属性 (第一部分是系统的属性,第二部分是 JVM 的参数)。

    • jinfo -flag name vmid :输出对应名称的参数的具体值。
    • 使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。jinfo -flag [+|-]name vmid 开启或者关闭对应名称的参数。
  • jmap (Memory Map for Java) :生成堆转储快照;
  • jhat (JVM Heap Dump Browser ) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果;
  • jstack (Stack Trace for Java):生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

    • 生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。
  • 可视化分析工具

    • jconsole 检测死锁 显示内存信息,细化到Eden区,survivor区的详细情况。 可强制执行gc。
    • visual vm
  • 调优

    • 调最大堆内存和最小堆内存。
    • 调新生代和老生代的比值:年轻代空间调大后会影响老年代空间,造成更频繁的full gc,对系统性能较大影响,sun推荐设置为堆空间的3/8.
    • 调年轻代和老年代的大小
    • 调survivor和eden区的比值。
    • 默认空余堆内存小于40%时,jvm会增大堆直到-xmx最大限制。
    • 默认空余堆内存大于70%时,jvm会减小堆直到-xms最小限制。
    • 调永久区的尺寸
    • oom时记得dump出堆保存现场。
    • -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=你要输出的日志路径
    • 设置线程栈大小
    • 设置垃圾最大年龄
    • 设置堆空间中软引用的存活时间,默认1s
    • 设置对象超过多大时直接分配在老年代
    • 设置tlab占eden区的比例,默认1%

你可能感兴趣的:(java)