jstack 
              
              -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
            
            
              
                jconsole 
              
              – jconsole是基于
              
                
                  Java
                
              
               Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了
              
                
                  Java
                
              
              程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
            
            
              
                jinfo 
              
              – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
            
            
              
                jmap 
              
              – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。
            
            
              
                jdb 
              
              – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。
            
            
              
                jstat 
              
              – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。
            
            
              
                jps 
              
              – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。 
            
            
              
                
                  
                    jstatd
                  
                
              
              
              启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
              
              实例:jstatd -J-Djava.security.policy=my.policy
              
              
              my.policy文件需要自己建立,内如如下:
              
              grant codebase "file:$JAVA_HOME/lib/tools.jar" {
              
              permission java.security.AllPermission;
              
              };
              
              这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作
            
            
              上面的操作没有通过,出现:
            
            
              
                Could not create remote object
                
                access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
                
                java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
                
                at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
                
                at java.security.AccessController.checkPermission(AccessController.java:546)
                
                at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
                
                at java.lang.System.setProperty(System.java:727)
                
                at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
              
            
            
              create in your usr/java/bin the jstatd.all.policy file, with the content must be
            
            
              
                - 
                  
                    
                      grant codebase "file:${java.home}/../lib/tools.jar" {  
                    
                  
                
 
                - 
                  
                    permission java.security.AllPermission;  
                  
                
 
                - 
                  
                    }; 
                  
                
 
              
            
            
              
              
                
                  
                    jps
                  
                
              
              
              列出所有的jvm实例
              
              实例:
              
              jps
              
              列出本机所有的jvm实例
              
              
              jps 192.168.0.77
              
              列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
              
              (前提是远程服务器提供jstatd服务)
              
              
              输出内容如下:
              
              jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
              
              6286 Jps
              
              6174  Jstat
              
              
              
                
                  jconsole
                
              
              
              一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。
              
              
              
                
                  
                    jinfo
                  
                
              
              (linux下特有)
              
              观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
              
              实例:jinfo 2083
              
              其中2083就是java进程id号,可以用jps得到这个id号。
              
              输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。
              
              
              
                
                  
                    jstack
                  
                
              
              (linux下特有)
              
              可以观察到jvm中当前所有线程的运行情况和线程当前状态
              
              jstack 2083
              
              输出内容如下:
              
              
              
              
                
                  
                    jmap
                  
                
              
              (linux下特有,也是很常用的一个命令)
              
              观察运行中的jvm物理内存的占用情况。
              
              参数如下:
              
                
                -heap
              
              :打印jvm heap的情况
              
              
                -histo:
              
              打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
              
              
                -histo:live :
              
              同上,但是只答应存活对象的情况
              
              
                -permstat:
              
              打印permanent generation heap情况
              
              
              命令使用:
              
              jmap -heap 2083
              
              可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
              
              输出内容:
              
              
              
              jmap -histo 2083 | jmap -histo:live 2083
              
              可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
              
              输出内容:
              
              
              写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。
              
              
              
                
                  
                    jstat
                  
                
                
              
              最后要重点介绍下这个命令。
              
              这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
              
              具体参数如下:
              
              -class:统计class loader行为信息
              
              -compile:统计编译行为信息
              
              -gc:统计jdk gc时heap信息
              
              -gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
              
              -gccause:统计gc的情况,(同-gcutil)和引起gc的事件
              
              -gcnew:统计gc时,新生代的情况
              
              -gcnewcapacity:统计gc时,新生代heap容量
              
              -gcold:统计gc时,老年区的情况
              
              -gcoldcapacity:统计gc时,老年区heap容量
              
              -gcpermcapacity:统计gc时,permanent区heap容量
              
              -gcutil:统计gc时,heap情况
              
              -printcompilation:不知道干什么的,一直没用过。
              
              
              一般比较常用的几个参数是:
              
              jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
              
              输出内容含义如下:
            
            
              
                
                  | 
                    Loaded
                   | 
                  
                    Number of classes loaded.
                   | 
                
                
                  | 
                    Bytes
                   | 
                  
                    Number of Kbytes loaded.
                   | 
                
                
                  | 
                    Unloaded
                   | 
                  
                    Number of classes unloaded.
                   | 
                
                
                  | 
                    Bytes
                   | 
                  
                    Number of Kbytes unloaded.
                   | 
                
                
                  | 
                    Time
                   | 
                  
                    Time spent performing class load and unload operations.
                   | 
                
              
            
            
            
            
            
            
            
            
            
            jstat -gc 2083 2000 20(每隔2秒监控一次,共做10) 
     
            
            输出内容含义如下: 
     
            
            
              
                
                  | 
                    S0C
                   | 
                  
                    Current survivor space 0 capacity (KB).
                   | 
                
                
                  | 
                    EC
                   | 
                  
                    Current eden space capacity (KB).
                   | 
                
                
                  | 
                    EU
                   | 
                  
                    Eden space utilization (KB).
                   | 
                
                
                  | 
                    OC
                   | 
                  
                    Current old space capacity (KB).
                   | 
                
                
                  | 
                    OU
                   | 
                  
                    Old space utilization (KB).
                   | 
                
                
                  | 
                    PC
                   | 
                  
                    Current permanent space capacity (KB).
                   | 
                
                
                  | 
                    PU
                   | 
                  
                    Permanent space utilization (KB).
                   | 
                
                
                  | 
                    YGC
                   | 
                  
                    Number of young generation GC Events.
                   | 
                
                
                  | 
                    YGCT
                   | 
                  
                    Young generation garbage collection time.
                   | 
                
                
                  | 
                    FGC
                   | 
                  
                    Number of full GC events.
                   | 
                
                
                  | 
                    FGCT
                   | 
                  
                    Full garbage collection time.
                   | 
                
                
                  | 
                    GCT
                   | 
                  
                    Total garbage collection time.
                   | 
                
              
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            输出内容: 
     
            
            
            
            如果能熟练运用这些命令,尤其是在linux下,那么完全可以代替jprofile等监控工具了,谁让它收费呢。呵呵。 
     
            
            用命令的好处就是速度快,并且辅助于其他命令,比如grep gawk sed等,可以组装多种符合自己需求的工具。 
     
            
              
                
                  
                    u
                  
                  
                                  
                  
                
              
              
                
                  
                    jps
                  
                
                
                  的用法
                
              
            
            
              
                
                  用来查看
                
                
                  
                    JVM
                  
                
                
                  里面所有进程的具体状态
                
                
                  
                    , 
                  
                
                
                  包括进程
                
                
                  
                    ID
                  
                
                
                  ,进程启动的路径等等。
                
                
                  与
                
                
                  unix
                
                
                  上的
                
                
                  ps
                
                
                  类似,用来显示本地的
                
                
                  java
                
                
                  进程,可以查看本地运行着几个
                
                
                  java
                
                
                  程序,并显示他们的进程号。
                
              
            
            
              
                
                   
                
              
            
            
              
                
                  
                    [root@localhost ~]# jps
                  
                
              
            
            
              
                
                  25517 Jps
                
              
            
            
              
                
                  25444 Bootstrap
                
              
            
            
               
            
            
               
            
            
               
            
            
            
            
              
       linux查看进程的线程信息 
     
            
            
              
       2011-07-28 18:46 
     
            
            
              
                
                  
                    
                      
                        查看Java的线程
                       
                      
                        1、用ps -eLf | grep java | wc 查看系统里运行的java线程数
                         
                        2、用top H可以按线程排序CPU和内存的占用及相应的线程ID
                         
                        3、用killall -3 (unix only) 或 jstack -l 可以Dump出Java的线程,然后根据线程ID(转换成16进制后对应thread dump的nid)查看线程的堆栈
                       
                      
                         
                       
                      
                        linux查看进程对应的线程信息
                       
                      
                        ps -Lf pid
                       
                      
                         
                       
                      
                        查看进程对应线程个数
                       
                      
                        ps -Lf pid|wc
                       
                      
                         
                       
                      
                        对于java程序也可以通过jvisualvm查看
                       
                      
                         
                       
                      
                        其他:
                       
                      
                        查看最大线程数
                       
                      
                        max user processes (-u) 10111
                       
                      
                         
                       
                      
                        查看最大进程数:
                       
                      
                        cat /proc/sys/kernel/threads-max
                       
                      
                         
                       
                      
                         
                       
                     
                   | 
                
              
            
            
              
                http://hi.baidu.com/mengxiangjava/blog/item/70556453cd40b1838d543038.html
              
              
                JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta