java虚拟机调优_Java虚拟机中JVM参数调优及其有用的命令
3.1參數及調優
1.-XX:-HeapDumpOnOutOfMemoryError:當首次遭遇內存溢出時Dump出此時的堆內存。
2.-XX:HeapDumpPath=./java_pid.hprof:指定Dump堆內存時的路徑
3.-Xms10M
4.-Xmx10M
通過jconsole或jvisualvm查看jvm內存情況
通過Eclipse Memory Analysis查看dump出的文件內容。
JDK本身提供了很多方便的JVM性能調優監控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具。路徑在JAVA_HOME/bin下。
3.1.1 jps
Java Virtual Machine Process Status Tool,查看虛擬機上進程狀態信息。
jps [-q] [-mlvV] []
-q 只列出JVM進程標識ID
-m 展示傳遞給main方法的參數,嵌入式JVM輸出null
-l 展示主類的全包名或者可運行jar包的全路徑名
-v 展示JVM進程的選項參數
-V 同-q選項,只列出JVM進程標識ID
hostid:包含通信協議、主機IP、通信端口等可選信息,是一個如下格式的URI:[protocol:][[//]hostname][:port][/servername]
虛擬機自帶的一種堆棧跟蹤工具。jstack用于打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。一般使用情況如下:
1.jps 獲取程序pid
2.jstack pid 獲取堆棧信息
線程狀態如下:
1.NEW,未啟動的。不會出現在Dump中。
2.RUNNABLE,在虛擬機內執行的。運行中狀態,可能里面還能看到locked字樣,表明它獲得了某把鎖。
3.BLOCKED,受阻塞并等待監視器鎖。被某個鎖(synchronizers)給block住了。
4.WATING,無限期等待另一個線程執行特定操作。等待某個condition或monitor發生,一般停留在park(), wait(), sleep(),join() 等語句里。
5.TIMED_WATING,有時限的等待另一個線程的特定操作。和WAITING的區別是wait() 等語句加上了時間限制 wait(timeout)。
4.TERMINATED,已退出的。
調用修飾:
表示線程在方法調用時,額外的重要的操作。線程Dump分析的重要信息。修飾上方的方法調用。
1.locked 目標:使用synchronized申請對象鎖成功,監視器的擁有者。
2.waiting to lock 目標:使用synchronized申請對象鎖未成功,在迚入區等待。
3.waiting on 目標:使用synchronized申請對象鎖成功后,釋放鎖幵在等待區等待。
4.parking to wait for 目標
舉例:比如一個死鎖程序。
死鎖:是指兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。
比如:AB都要做雞蛋灌餅,A拿了雞蛋,B拿了餅,A想要餅,B想要雞蛋
堆棧信息如下:Found one Java-level deadlock:============================="Thread-1":? waiting to lock monitor 0x00007f0134003ae8 (object 0x00000007d6aa2c98, a java.lang.Object),? which is held by "Thread-0""Thread-0":? waiting to lock monitor 0x00007f0134006168 (object 0x00000007d6aa2ca8, a java.lang.Object),? which is held by "Thread-1"?Java stack information for the threads listed above:==================================================="Thread-1":??? at javaCommand.DeadLockclass.run(JStackDemo.java:40)??? - waiting to lock <0x00000007d6aa2c98> (a java.lang.Object)??? - locked <0x00000007d6aa2ca8> (a java.lang.Object)??? at java.lang.Thread.run(Thread.java:745)"Thread-0":??? at javaCommand.DeadLockclass.run(JStackDemo.java:27)??? - waiting to lock <0x00000007d6aa2ca8> (a java.lang.Object)??? - locked <0x00000007d6aa2c98> (a java.lang.Object)??? at java.lang.Thread.run(Thread.java:745)?Found 1 deadlock.
很詳細,發現一個死鎖
Thread-1在想要執行第40行的時候,當前鎖住了資源<0x00000007d6aa2ca8>,但是他在等待資源<0x00000007d6aa2c98>Thread-0在想要執行第27行的時候,當前鎖住了資源<0x00000007d6aa2c98>,但是他在等待資源<0x00000007d6aa2ca8> 由于這兩個線程都持有資源,并且都需要對方的資源,所以造成了死鎖。 原因我們找到了,就可以具體問題具體分析,解決這個死鎖了。
對Java應用程序的資源和性能進行實時監控的命令行工具,主要包括GC情況和Heap Size資源使用情況。參數如下:
option 常見的都是使用-gcutil(和gc基本相同,輸出主要已使用空間站總空間的百分比)查看gc(監視堆情況)情況,其他可選項見下圖。
vmid : VM的進程號,即當前運行的java進程號。
interval : 間隔時間,單位為秒或毫秒
count:打印次數,如果缺省則打印無數次。
獲取堆內存快照,但是比較大。通過配置jvm啟動參數-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path,在oom錯誤時獲取自動生成dump文件,也可以通過jmap獲取dump文件,然后通過eclipse中安裝MAT插件查看分析。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的java虚拟机调优_Java虚拟机中JVM参数调优及其有用的命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse配置java环境_Java
- 下一篇: 作业调度问题java代码_Tabu Se