zoukankan      html  css  js  c++  java
  • JVM总结之命令行工具

    jps

    jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。

    jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。

    jstack

    Jstack是java虚拟机自带的一种堆栈跟踪工具。

    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

    通过对线程状态的查看,结合源码,一般都能找出hung住线程的原因。

    线程状态

    • NEW,未启动的。不会出现在Dump中。
    • RUNNABLE,在虚拟机内执行的。
    • BLOCKED,受阻塞并等待监视器锁。
    • WATING,无限期等待另一个线程执行特定操作。
    • TIMED_WATING,有时限的等待另一个线程的特定操作。
    • TERMINATED,已退出的。

    jstack的用法:

    jstack [进程号]
    

    可得到如下类似结果:

    "main" #1 prio=5 os_prio=31 tid=0x00007fc918809800 nid=0x1c03 waiting on condition [0x0000700007a01000]
       java.lang.Thread.State: TIMED_WAITING (sleeping)
    	at java.lang.Thread.sleep(Native Method)
    	at com.aheizi.cmd.JpsTest.main(JpsTest.java:11)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:497)
    	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    

    再根据线程状态和具体代码进行分析。

    jmap

    查看堆使用情况:

    jmap -heap 2357

    查看堆内存(histogram)中的对象数量及大小:

    jmap -histo 2357

    将内存使用的详细情况输出到文件:

    jmap -dump:format=b,file=heapDump 2357

    输出到文件之后可以通过jhat -port 7000 heapDump在浏览器访问http://localhost:7000/ 查看详细信息

    Jmap使用心得

    1. 如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
    2. 要制作堆Dump可以直接使用jvm自带的jmap命令
    3. 可以先使用jmap -heap命令查看堆的使用情况,看一下各个堆空间的占用情况。
    4. 使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
    5. 也可以使用 jmap -dump:format=b,file=<fileName>命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容
    6. 在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。

    jstat

    jstat [ generalOption | outputOptions vmid [interval[s|ms][count]] ]

    参数:
    generalOption: 一般使用-gcutil查看GC情况
    vmid: 虚拟机进程号,即当前运行的java进程号
    interval: 间隔时间,单位为秒或毫秒
    count: 打印次数,如果缺省则打印无数次

    参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2357垃圾收集状况,一共查询5次,那命令行如下:

    jstat -gc 2357 250 5
    

    参数说明如下:
    S0: 新生代中Survivor space 0区已使用空间的百分比
    S1: 新生代中Survivor space 1区已使用空间的百分比
    E: 新生代已使用空间的百分比
    O: 老年代已使用空间的百分比
    P: 永久带已使用空间的百分比
    YGC: 从应用程序启动到当前,发生Yang GC 的次数
    YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
    FGC: 从应用程序启动到当前,发生Full GC的次数
    FGCT: 从应用程序启动到当前,Full GC所用的时间
    GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

    jhat

    jhat前面已经用过了。使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。

    分析过程总结

    获取Java Dump的方法

    1. 利用Java虚拟机,增加-XX:+HeapDumpOnOutOfMemoryError的配置,自动生成dump文件
    2. 使用JDK1.6自带的工具:Java VisualVM
    3. 使用命令行:jstack:打印线程的栈信息,制作线程Dump。jmap:打印内存映射,制作堆Dump。

    步骤:

    1. 检查虚拟机版本(java -version)
    2. 找出目标Java应用的进程ID(jps)
    3. 使用jstack命令制作线程Dump / Linux环境下使用kill命令制作线程Dump
    4. 使用jmap命令制作堆Dump

    参考资料:

    Java命令学习系列

  • 相关阅读:
    如何用Python实现网络请求库中的UR解析器,面试必学
    为什么有人说 Python 多线程是鸡肋?
    router-view 与 动态组件 区别
    keep-alive
    vue 客户端渲染和服务端渲染
    js 数组对象深拷贝
    vue template标签
    Jquery中的日历插件
    HTML5中的canvas基本概念及绘图
    HTML5中的音视频处理
  • 原文地址:https://www.cnblogs.com/aheizi/p/7106972.html
Copyright © 2011-2022 走看看