• jdk分析工具:jps和jstack


    jps

    用来查看基于HotSpot JVM里面所有进程的具体状态包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。使用jps时,不需要传递进程号做为参数。

    Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本对的JAVA进程的查看。

    命令格式

    jps [ options ] [ hostid ]

    常用参数说明

    -m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null

    -l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

    -v 输出传给JVM的参数。

    使用示例

    blue@blue-pc:~$ jps
    8710 Jps
    5661 Bootstrap
    2491 
    2967 
    blue@blue-pc:~$ jps -ml
    5661 org.apache.catalina.startup.Bootstrap start
    2491 
    8724 sun.tools.jps.Jps -ml
    2967 
    blue@blue-pc:~$ jps -mlv
    5661 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/blue/apache-tomcat-7.0.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/blue/apache-tomcat-7.0.39/endorsed -Dcatalina.base=/home/blue/apache-tomcat-7.0.39 -Dcatalina.home=/home/blue/apache-tomcat-7.0.39 -Djava.io.tmpdir=/home/blue/apache-tomcat-7.0.39/temp
    2491  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx384m
    8738 sun.tools.jps.Jps -mlv -Dapplication.home=/usr/local/jdk1.6.0_35 -Xms8m
    2967  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m

    前面的数字是jvm的进程id,后面是jvm的类启动信息。

    jstack

    如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative stack的信息如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

    命令格式

    $jstack [ option ] pid

    $jstack [ option ] executable core

    $jstack [ option ] [server-id@]remote-hostname-or-IP

    常用参数说明

    OPTIONS


    -F jstack [-l] pid无法响应时,强制打印堆栈

    -l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

    -m 混合模式输出(包括java和本地c/c++片段)堆栈。

    pid: java应用程序的进程号,一般可以通过jps来获得;

    executable:产生core dump的java可执行程序;

    core:打印出的core文件;

    remote-hostname-or-ip:远程debug服务器的名称或IP;

    server-id: 唯一id,假如一台主机上多个远程debug服务;

    使用示例

    blue@blue-pc:~$ jps -ml
    5661 org.apache.catalina.startup.Bootstrap 
    blue@blue-pc:~$ jstack 5661
    2013-04-16 21:09:27
    Full thread dump Java HotSpot(TM) Server VM (20.10-b01 mixed mode):
    
    "Attach Listener" daemon prio=10 tid=0x70e95400 nid=0x2265 waiting on condition [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "http-bio-8080-exec-20" daemon prio=10 tid=0x08a35800 nid=0x1d42 waiting on condition [0x70997000]
       java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x766a27b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:662)
    ........

    一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。

  • 相关阅读:
    重点---版本问题-Spark中的一次ClassNotFoundException排除
    SPARK-SQL内置函数之时间日期类
    [Spark SQL]Spark SQL读取Kudu,写入Hive
    hive和spark读取kudu表
    解决spark on yarn每次都传递一堆jars的问题
    Spark on YARN
    blocking IO, non-blocking IO, asychronous IO, sychronous IO
    使用set和vector去重(copy函数)
    vector元素去重uninque函数,erase函数
    copy与iterator头文件
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/3024892.html
Copyright © 2020-2023  润新知