Java tool 整理(20210329更新)

starzodiac
6 min readMar 22, 2021

--

最近在研究 java 內建的 tool,其實網路上有很多文章都有介紹,我簡單做個筆記~

  • jps - 列出運行中的 java 程式以及其參數
jps -m 顯示啟動 main 的參數
jps -l 顯示 main() 全名
jps -v 顯示 jvm 啟動的參數
jps -q 只顯示 pid
  • jstat - 監控 JVM memory 的使用情形
jstat -class <pid> 顯示載入/卸除 class 數量、所佔空間以及執行時間
jstat -gc <pid> [ms(Option)] [count(Option)] 顯示 heap 的使用狀況(KB)
jstat -gcutil [間隔時間/毫秒] [查詢次數] 顯示 heap 狀況的百分比
jstat -gccapacity 同上,但包含使用量的最大值最小值
jstat -gccause 顯示當前以及最後一次 gc 的原因
jstat -gcold 關注 old 物件
jstat -gcoldcapacity 關注 old 物件的最大值最小值
jstat -gcnew 關注 new 物件
jstat -gcnewcapacity 關注 new 物件的最大值最小值
jstat -compiler 輸出即時(Just-in-Time)的編譯統計資訊
jstat -printcompilation 輸出當前編譯統計資訊
一些記憶體的資訊:
New Generation(used memory) = S0U+S1U+EU
concurrent mark-sweep generation(used memory) = OU
Perm Generation(used memory) = PU.

http://www.openkb.info/2014/06/how-to-check-java-memory-usage.html

  • jmap - 查看 heap 的狀態
jmap <pid>
jmap -heap <pid> 顯示 jvm heap 詳細資訊
jmap -finalizerinfo <pid> 顯示正在等待 finalization 的物件(數量)
jmap -histo <pid> 顯示堆中物件統計資訊
jmap -dump:[live,] format=b, file=filename <pid> 以 hprof 格式儲存到檔案中,如果指定 live,則只會存 live 的 object

不過我沒有 -heap 這個 option(*),但可以使用 jstat -gc 來看 jvm 的 heap 狀況

*註: openjdk 沒有支援這個選項,在 windows 上的 oracle jdk 有這個選項

另外,以下指令也可以查看 heap 的使用量:

java -XX:+PrintFlagsFinal -version | grep HeapSize
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
  • jinfo - 查看 jvm 的參數,甚至可以動態修改部分參數
jinfo <pid> 顯示該程式設定
java -XX:+PrintFlagsFinal -version | grep manageable 查看哪些參數可以動態修改
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version 所有的 jvm option
  • -flag <name>: 列印指定 JVM 的參數值。
  • -flag [+|-]< name >:設置或取消指定 JVM 參數的布爾值。
  • -flag < name >=< value >:設置指定 JVM 的參數的值。

原文網址:https://kknews.cc/code/ejem2by.html

  • jstack - 顯示 stack & thread 的資訊
jstack -l <pid> 顯示關於 lock 的附加資訊

https://blog.csdn.net/weixin_39925959/article/details/110815600

  • jconsole
jconsole <pid>
  • javac
javac [java file] 編譯 java 檔案成 class 檔案
  • javap
javap -verbose [class file] 分析 class 檔案
  • java
java [package.classname] 在當前 package.class 目錄下執行該 class
  • jstatd

啟動 jvm 監控服務。它是一個基於 rmi 的應用,向遠端機器提供本機 jvm 應用程式的資訊。預設 port =1099。

不過,如果直接啟動會有權限的問題,需要產生一個 policy file:

grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

並且執行時帶入:

jstatd -J-Djava.security.policy=<mypolicy>

https://www.cnblogs.com/yueshutong/p/9812464.html

https://kknews.cc/code/ejem2by.html

  • jcmd

JDK 1.7 以後新增(openjdk 也有),這是一個多功能(集大成)的 java tool

jcmd -l 列出當前機器上所有執行中 jvm 程式信息
= jcmd
= jps
jcmd PID PerfCounter.print 查看指定程式的效能统计
jcmd PID help 列出當前執行的 java 程式可以執行的操作
jcmd PID <可以執行的操作> 會執行對應的操作(非常多)

https://cloud.tencent.com/developer/article/1130026

  • hprof - 負責監控 cpu & heap 的 agent
java -agentlib:hprof=help
java -agentlib:hprof[=options] ToBeProfiledClass
java -Xrunprof[:options] ToBeProfiledClass
javac -J-agentlib:hprof[=options] ToBeProfiledClass

ref:

https://zhuanlan.zhihu.com/p/267381560

https://zhuanlan.zhihu.com/p/351834737

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response