JVM總結之命令行工具
jps
jps位於jdk的bin目錄下,其作用是顯示當前系統的java進程情況,及其id號。 jps相當於Solaris進程工具ps。不象」pgrep java」或」ps -ef grep java」,jps並不使用應用程序名來查找JVM實例。因此,它查找所有的Java應用程序,包括即使沒有使用java執行體的那種(例如,定製的啟動 器)。
jps僅查找當前用戶的Java進程,而不是當前系統中的所有進程。
jstackJstack是java虛擬機自帶的一種堆棧跟蹤工具。
jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。
通過對線程狀態的查看,結合源碼,一般都能找出hung住線程的原因。
線程狀態
- NEW,未啟動的。不會出現在Dump中。
- RUNNABLE,在虛擬機內執行的。
- BLOCKED,受阻塞並等待監視器鎖。
- WATING,無限期等待另一個線程執行特定操作。
- TIMED_WATING,有時限的等待另一個線程的特定操作。
- TERMINATED,已退出的。
jstack的用法:
jstack [進程號]
可得到如下類似結果:
"main" #1 prio=5 os_prio=31 tid=0x00007fc918809800 nid=0x1c03 waiting on condition [0x0000700007a01000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.aheizi.cmd.JpsTest.main(JpsTest.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
再根據線程狀態和具體代碼進行分析。
jmap查看堆使用情況:
jmap -heap 2357
查看堆內存(histogram)中的對象數量及大小:
jmap -histo 2357
將內存使用的詳細情況輸出到文件:
jmap -dump:format=b,file=heapDump 2357
輸出到文件之後可以通過jhat -port 7000 heapDump在瀏覽器訪問http://localhost:7000/
查看詳細信息
- 如果程序內存不足或者頻繁GC,很有可能存在內存泄露情況,這時候就要藉助Java堆Dump查看對象的情況。
- 要製作堆Dump可以直接使用jvm自帶的jmap命令
- 可以先使用
jmap -heap
命令查看堆的使用情況,看一下各個堆空間的佔用情況。 - 使用
jmap -histo:[live]
查看堆內存中的對象的情況。如果有大量對象在持續被引用,並沒有被釋放掉,那就產生了內存泄露,就要結合代碼,把不用的對象釋放掉。 - 也可以使用
jmap -dump:format=b,file=
命令將堆信息保存到一個文件中,再藉助jhat命令查看詳細內容 - 在內存出現泄露、溢出或者其它前提條件下,建議多dump幾次內存,把內存文件進行編號歸檔,便於後續內存整理分析。
jstat
jstat [ generalOption | outputOptions vmid [interval[s|ms][count]] ]
參數:
generalOption: 一般使用-gcutil查看GC情況
vmid: 虛擬機進程號,即當前運行的java進程號
interval: 間隔時間,單位為秒或毫秒
count: 列印次數,如果預設則列印無數次
參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。假設需要每250毫秒查詢一次進程2357垃圾收集狀況,一共查詢5次,那命令行如下:
jstat -gc 2357 250 5
參數說明如下:
S0: 新生代中Survivor space 0區已使用空間的百分比
S1: 新生代中Survivor space 1區已使用空間的百分比
E: 新生代已使用空間的百分比
O: 老年代已使用空間的百分比
P: 永久帶已使用空間的百分比
YGC: 從應用程序啟動到當前,發生Yang GC 的次數
YGCT: 從應用程序啟動到當前,Yang GC所用的時間【單位秒】
FGC: 從應用程序啟動到當前,發生Full GC的次數
FGCT: 從應用程序啟動到當前,Full GC所用的時間
GCT: 從應用程序啟動到當前,用於垃圾回收的總時間【單位秒】
jhatjhat前面已經用過了。使用jmap可以生成Java堆的Dump文件。生成dump文件之後就可以用jhat命令,將dump文件轉成html的形式,然後通過http訪問可以查看堆情況。
分析過程總結獲取Java Dump的方法
- 利用Java虛擬機,增加-XX:+HeapDumpOnOutOfMemoryError的配置,自動生成dump文件
- 使用JDK1.6自帶的工具:Java VisualVM
- 使用命令行:
jstack
:列印線程的棧信息,製作線程Dump。jmap
:列印內存映射,製作堆Dump。
步驟:
- 檢查虛擬機版本(java -version)
- 找出目標Java應用的進程ID(jps)
- 使用jstack命令製作線程Dump / Linux環境下使用kill命令製作線程Dump
- 使用jmap命令製作堆Dump


※通過history解決ajax不支持前進/後退/刷新
※ASP.NET Core Web API 最小化項目
※spark源碼分析之SparkContext初始化一
TAG:達人科技 |
※MySQL常用命令總結
※命令執行WAF繞過技巧總結
※Git常用命令總結
※XML DOM 總結
※ASP的 總結
※TVS管的主要參數及選型總結
※WSDL的總結
※XSLT 總結
※SVN 安裝與使用總結
※SEO技術經驗總結,總有一款適合你
※APP動效設計必備知識總結
※代幫寫工作總結-寫好工作總結的兩個技巧
※MySQL 的變數分類總結
※分享:MySQL存儲引擎總結
※Android 應用內存泄露分析、改善經驗總結
※MySQL 索引及查詢優化總結
※SLi賽事半程總結
※XLink 總結
※CSP總結及CTF實例分析
※關於空管雷達、應答機、TCAS、ADS-B的一些總結