JVM調優方法總結

jopen 10年前發布 | 21K 次閱讀 JVM Java開發

本文主要針對運行的服務器進行調優以及性能分析工具使用。

      在這里我使用的都是JDK自帶的命令 JAVA_HOME/bin/*

查看Server PID - jps

       如果需要分析某一個Server,首先當然需要知道它的PID.使用jps可以用顯示當前jvm的進程,當然也可以使用ps -ef |grep java.

       命令格式:

jps [ options ] [ hostid ]

       options:         

    -q 忽略輸出的類名、Jar名以及傳遞給main方法的參數,只輸出pid。
    -m 輸出傳遞給main方法的參數,如果是內嵌的JVM則輸出為null。
    -l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。
    -v 輸出傳給JVM的參數。
    -V 輸出通過標記的文件傳遞給JVM的參數(.hotspotrc文件,或者是通過參數
     -XX:Flags=<filename>指定的文件)。
    -J 用于傳遞jvm選項到由javac調用的java加載器中,例如,“-J-Xms48m”將把啟動內存設置為48M,
    使用-J  選項可以非常方便的向基于Java的開發的底層虛擬機應用程序傳遞參數。

     hostid:

    

[protocol:][[//]hostname][:port][/servername]

    protocol - 如果protocol及hostname都沒有指定,那表示的是與當前環境相關的本地協議,
    如果指定了hostname卻沒有指定protocol,那么protocol的默認就是rmi。
    hostname - 服務器的IP或者名稱,沒有指定則表示本機。
    port - 遠程rmi的端口,如果沒有指定則默認為1099。
    servername - 注冊到RMI注冊中心中的jstatd的名稱。

查看線程狀態 - jstack

     jstack可以dump當前Server的線程運行狀態。如是否存在死鎖,線程數量,以及各個線程的狀態,資源競爭情況等。如果現在運行的java程序呈現掛起的狀態,jstack是非常有用的。

    
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

  option:

-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l長列表. 打印關于鎖的附加信息,例如屬于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有棧信息.
-h | -help打印幫助信息

pid 需要被打印配置信息的java進程id,可以用jps查詢.

查看內存分配-jmap
        jmap可以輸出所有內存中對象,甚至可以將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。如: jmap -histo pid > heap.log可以將其保存到文本中去,在一段時間后,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024可以將進程的內存heap輸出出來到outfile文件里,再配合MAT(內存分析工具(Memory Analysis Tool )).

       jmap [ option ] pid
       jmap [ option ] executable core
       jmap [ option ] [server-id@]remote-hostname-or-IP

       option:

-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件. 
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上后,只統計活的對象數量. 
-permstat 打印classload和jvm heap長久層的信息. 包含每個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和占用內存數也會打印出來. 
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效. 
-h | -help 打印輔助信息 
-J 傳遞參數給jmap啟動的jvm.

pid 需要被打印配相信息的java進程id,創業與打工的區別 博文預覽,可以用jps查問.

查看新生代和老年代 - jstat

      jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。  

    jstat -class pid:顯示加載class的數量,及所占空間等信息。  
    jstat -compiler pid:顯示VM實時編譯的數量等信息。  
    jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。  
    jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。  
    jstat -gcnew pid:new對象的信息。  
    jstat -gcnewcapacity pid:new對象的信息及其占用量。  
    jstat -gcold pid:old對象的信息。  
    jstat -gcoldcapacity pid:old對象的信息及其占用量。  
    jstat -gcpermcapacity pid: perm對象的信息及其占用量。  
    jstat -gcutil pid:統計gc信息統計。  
    jstat -printcompilation pid:當前VM執行的信息。

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!