jvm 常用调试工具和设置jvm GC方法和指令
JVM常用調試工具:
jconsole –?jconsole是基于JavaManagementExtensions (JMX)的實時圖形化監測工具,這個工具利用了內建到JVM里面的JMX指令來提供實時的性能和資源的監控,包括了Java程序的內存使用,Heap size, 線程的狀態,類的分配狀態和空間使用等等。Linux下設置環境變量如下:export DISPLAY=:0.0
jstatd–啟動jvm監控服務。它是一個基于rmi的應用,向遠程機器提供本機jvm應用程序的信息。默認端口1099。
-nr?當一個存在的RMI Registry沒有找到時,不嘗試創建一個內部的RMI Registry
-p port?端口號,默認為1099
-nrminame?默認為JStatRemoteHost;如果多個jstatd服務開始在同一臺主機上,rminame唯一確定一個jstatd服務
-J?jvm選項
$JAVA_HOME/jre/lib/security/java.policy文件中添加下面的代碼:
grantcodebase "file:${java.home}/../lib/tools.jar" {
? permission java.security.AllPermission;
};
默認端口為1099: ??jstatd?-J-Djava.security.policy=jstatd.all.policy
指定hostname?指定端口: jstatd?-J-Djava.rmi.server.hostname=192.168.8.7-J-Djava.security.policy=test/jstatd.all.policy?-p?6001??
?啟動JMX: jstatd?-J-Djava.rmi.server.hostname=192.168.8.7-J-Djava.security.policy=test/jstatd.all.policy ?-J-Dcom.sun.management.jmxremote.port=6001 -J-Dcom.sun.management.jmxremote.ssl=false-J-Dcom.sun.management.jmxremote.authenticate=false -J -Djava.awt.headless=true
(java.NET.MalformedURLException:Local host name unknown: java.Net.UnknownHostException: a: a
原因是/etc/hosts文件里沒有主機名為:a的,解決方法就是在hosts文件中加入a:
127.0.0.1?? a???localhost)
?
jps –jps是用來查看JVM里面所有進程的具體狀態, 包括進程ID,進程啟動的路徑等等。
-m 輸出傳遞給main方法的參數,如果是內嵌的JVM則輸出為null。
-l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。
-v 輸出傳給JVM的參數。
?
jstack --?jstack用于打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的Java?stack和nativestack的信息。Windows的jstack只支持-l.
-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l長列表. 打印關于鎖的附加信息,如屬于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有棧信息.
Jstackpid? 顯示jvm中當前所有線程的運行情況和線程當前狀態
?
jinfo?–可以輸出并修改運行時的java 進程的opts。用處比較簡單,用于輸出JAVA系統參數及命令行參數。查看和修改運行中的java程序的運行環境參數。
jinfo-flag MaxPermSize? 4084
 
 
jmap –jmap 可以從core文件或進程中獲得內存的具體匹配情況,包括Heap size, Perm size等等,打印出某個java進程(使用pid)內存內的,所有‘對象’的情況。
 -heap?:打印jvm heap的情況
 -histo:?打印jvm heap的直方圖。其輸出信息包括類名,對象數量,對象占用大小。
 -histo:live :?同上,但是只輸出存活對象的情況,會觸發FULL GC
-permstat:?打印permanentgeneration heap情況
jmap-dump:format=b,file=outfile 3024可以將3024進程的內存heap輸出出來到outfile文件里,再配合JHAT進行分析.
Jhat用于對JAVA heap進行離線分析的工具,他可以對不同虛擬機中導出的heap信息文件進行分析,如LINUX上導出的文件可以拿到WINDOWS上進行分析
jhat -J-Xmx512m <heap dump file>
?
jstat –?jstat利用了JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控, 可以觀察到classloader,compiler,gc相關信息,包括了對Heap size和垃圾回收狀況的監控等等。
 -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情況
-compiler:顯示VM實時編譯的數量等信息
-snap: 查看Java進程的jvmstat的各個monitor的值
jstat-gc?PID@172.30.0.160
?
java-verbose:class PID輸出虛擬機裝入的類的信息, 當虛擬機報告類找不到或類沖突時可用此參數來診斷來查看虛擬機從裝入類的情況。
java –verbose:jni輸出native方法調用的相關情況,一般用于診斷jni調用錯誤信息
 
 
常用JVM分析信息獲取:
1、確認服務器上是否存在SUN JDK6,如果沒有建議安裝一個,我們需要使用里面的工具(jps、jmap、jstat、jconsole、jstack)
2、?獲取MKEY的JAVA進程ID(后面簡稱PID)
a)???操作方法:進入SUN JDK的bin目錄在命令行中輸入jps,查看MKEY的進程ID
3、提取GC信息()
a)???操作方法:示例:jstat –gcPID 600000 43200 >> gc_20110909.log
4、?提取Heap區信息(間隔10分鐘提取一次)
a)???操作方法:jmap -heap PID >>heap_20110909.log
5、提取對象信息(間隔10分鐘提取一次)
a)????? 操作方法:jmap-histo PID > histo_*.log(文件較大,*按序號生成輸入)
6、線程轉儲日志
a)????? jstack PID
b)????? 宕機日志(在domain目錄,如果沒有宕機,條件允許的情況下可使用 kill -3 PID(此操作會殺掉進程))
設置GC指令和方法:
1. JVM內存分配設置的參數有四個
-Xmx??? Java Heap最大值,默認值為物理內存的1/4;
-Xms??? Java Heap初始值,Server端JVM最好將-Xms和-Xmx設為相同值,開發測試機JVM可以保留默認值;
-Xmn??? Java Heap Young區大小,不熟悉最好保留默認值;
-Xss????? 每個線程的Stack大小,不熟悉最好保留默認值;
-XX:PermSize:設定內存的永久保存區域;?-XX:MaxPermSize:設定最大內存的永久保存區域;
-XX:PermSize:設定內存的永久保存區域;
-XX:NewSize:設置JVM堆的‘新生代’的默認大小;
-XX:MaxNewSize:設置JVM堆的‘新生代’的最大大小;?
 
 
2. 如何設置JVM的內存分配
(1)當在命令提示符下啟動并使用JVM時(只對當前運行的類Test生效):
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test
(2)當在集成開發環境下(如eclipse)啟動并使用JVM時:
a. 在eclipse根目錄下打開eclipse.ini,默認內容為(這里設置的是運行當前開發工具的JVM內存分配):? -vmargs -Xms40m -Xmx256m -vmargs表示以下為虛擬機設置參數,可修改其中的參數值,也可添加-Xmn,-Xss,另外,eclipse.ini內還可以設置非?? 堆內存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
 
 
b. 打開eclipse-窗口-首選項-Java-已安裝的JRE(對在當前開發環境中運行的java程序皆生效)? 編輯當前使用的JRE,在缺省VM參數中輸入:-Xmx128m -Xms64m -Xmn32m –Xss16m。
 
 
c. 打開eclipse-運行-運行-Java應用程序(只對所設置的java類生效)? 選定需設置內存分配的類-自變量,在VM自變量中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m? 注:如果在同一開發環境中同時進行了b和c設置,則b設置生效,c設置無效,如:? 開發環境的設置為:-Xmx256m,而類Test的設置為:-Xmx128m -Xms64m,則運行Test時生效的設置為:? -Xmx256m -Xms64m。
(3)當在服務器環境下(如Tomcat)啟動并使用JVM時(對當前服務器環境下所以Java程序生效):
a. 設置環境變量:? 變量名:CATALINA_OPTS? 變量值:-Xmx128m -Xms64m -Xmn32m -Xss16m。(方法1)
b. 打開Tomcat根目錄下的bin文件夾,編輯catalina.bat,將其中的%CATALINA_OPTS%(共有四處)替換為:-Xmx128m -Xms64m -Xmn32m -Xss16m(方法2)。
c. 若沒有catalina.bat,只有tomcat.exe,tomcat6w.exe;則可以在啟動tomcat6w.exe 后 右鍵配置--Java--java option 下面輸入:
-Xmx256m –Xms64m
也可以找到注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\TomcatService Manager\Tomcat6\Parameters\JavaOptions原值為 -Dcatalina.home="C:\ApacheGroup\Tomcat 6.0" -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 6.0\common\endorsed" -Xrs 加入? -Xms300m? -Xmx350m? (我的是加入-Xmx350m,tomcat才能啟動,加入-Xms300m? -Xmx350m反而tomcat都不能啟動)重起tomcat服務,設置生效。
3. 查看JVM內存信息
Runtime.getRuntime().maxMemory(); //最大可用內存,對應-Xmx?
Runtime.getRuntime().freeMemory(); //當前JVM空閑內存?
Runtime.getRuntime().totalMemory(); //當前JVM占用的內存總數,其值相當于當前JVM已使用的內存及freeMemory()的總和?
關于maxMemory(),freeMemory()和totalMemory():maxMemory()為JVM的最大可用內存,可通過-Xmx設置,默認值為物理內存的1/4,設置不能高于計算機物理內存;? totalMemory()為當前JVM占用的內存總數,其值相當于當前JVM已使用的內存及freeMemory()的總和,會隨著JVM使用內存的增加而增加;? freeMemory()為當前JVM空閑內存,因為JVM只有在需要內存時才占用物理內存使用,所以freeMemory()的值一般情況下都很小,而JVM實際可用內存并不等于freeMemory(),而應該等于maxMemory()-totalMemory()+freeMemory()。
4. 實例,以下給出1G內存環境下java jvm 的參數設置參考
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
大型的web工程,用tomcat默認分配的內存空間無法啟動,如果不是在myeclipse中啟動tomcat可以對tomcat這樣設置:
TOMCAT_HOME\bin\catalina.bat 中添加這樣一句話:
set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
如果要在myeclipse中啟動,上述的修改就不起作用了,可如下設置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的
Optional Java VM arguments中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
對于單獨的.class,可以用下面的方法對Test運行時的jvm內存進行設置。 java -Xms64m -Xmx256m Test -Xms是設置內存初始化的大小 -Xmx是設置最大能夠使用內存的大小。
 
 
很好的經驗:
 1.Server端JVM最好將-Xms和-Xmx設為相同值。為了優化GC,最好讓-Xmn值約等于-Xmx的1/3。?
 2.一個GUI程序最好是每10到20秒間運行一次GC,每次在半秒之內完成。
 注意:?
 1.增加Heap的大小雖然會降低GC的頻率,但也增加了每次GC的時間。并且GC運行時,所有的用戶線程將暫停,也就是GC期間,Java應用程序不做任何工作。
 2.Heap大小并不決定進程的內存使用量。進程的內存使用量要大于-Xmx定義的值,因為Java為其他任務分配內存,例如每個線程的Stac
 為什么一些程序頻繁發生GC?有如下原因:?
 1. 程序內調用了System.gc()或Runtime.gc()。?
 2. 一些中間件軟件調用自己的GC方法,此時需要設置參數禁止這些GC。?
 3. Java的Heap太小,一般默認的Heap值都很小。?
 4. 頻繁實例化對象,Release對象 此時盡量保存并重用對象,例如使用StringBuffer()和String()。
如果你發現每次GC后,Heap的剩余空間會是總空間的50%,這表示你的Heap處于健康狀態許多Server端的Java程序每次GC后最好能有65%的剩余空間。
總結
以上是生活随笔為你收集整理的jvm 常用调试工具和设置jvm GC方法和指令的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java中封装是什么意思(中的objec
- 下一篇: 苹果8plus是oled屏吗
