當前位置:
首頁 > 知識 > JVM總結之命令行工具

JVM總結之命令行工具

jps

jps位於jdk的bin目錄下,其作用是顯示當前系統的java進程情況,及其id號。 jps相當於Solaris進程工具ps。不象」pgrep java」或」ps -ef grep java」,jps並不使用應用程序名來查找JVM實例。因此,它查找所有的Java應用程序,包括即使沒有使用java執行體的那種(例如,定製的啟動 器)。

jps僅查找當前用戶的Java進程,而不是當前系統中的所有進程。

jstack

Jstack是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/查看詳細信息

Jmap使用心得
  1. 如果程序內存不足或者頻繁GC,很有可能存在內存泄露情況,這時候就要藉助Java堆Dump查看對象的情況。
  2. 要製作堆Dump可以直接使用jvm自帶的jmap命令
  3. 可以先使用jmap -heap命令查看堆的使用情況,看一下各個堆空間的佔用情況。
  4. 使用jmap -histo:[live]查看堆內存中的對象的情況。如果有大量對象在持續被引用,並沒有被釋放掉,那就產生了內存泄露,就要結合代碼,把不用的對象釋放掉。
  5. 也可以使用 jmap -dump:format=b,file=命令將堆信息保存到一個文件中,再藉助jhat命令查看詳細內容
  6. 在內存出現泄露、溢出或者其它前提條件下,建議多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: 從應用程序啟動到當前,用於垃圾回收的總時間【單位秒】

jhat

jhat前面已經用過了。使用jmap可以生成Java堆的Dump文件。生成dump文件之後就可以用jhat命令,將dump文件轉成html的形式,然後通過http訪問可以查看堆情況。

分析過程總結

獲取Java Dump的方法

  1. 利用Java虛擬機,增加-XX:+HeapDumpOnOutOfMemoryError的配置,自動生成dump文件
  2. 使用JDK1.6自帶的工具:Java VisualVM
  3. 使用命令行:jstack:列印線程的棧信息,製作線程Dump。jmap:列印內存映射,製作堆Dump。

步驟:

  1. 檢查虛擬機版本(java -version)
  2. 找出目標Java應用的進程ID(jps)
  3. 使用jstack命令製作線程Dump / Linux環境下使用kill命令製作線程Dump
  4. 使用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的一些總結