① JVM調優的常見命令行工具有哪些
JVM調優的常見命令工具包括:
1)jps命令用於查詢正在運行的JVM進程,
2)jstat可以實時顯示本地或遠程JVM進程中類裝載、內存、垃圾收集、JIT編譯等數據
3)jinfo用於查詢當前運行這的JVM屬性和參數的值。
4)jmap用於顯示當前java堆和永久代的詳細信息
5)jhat用於分析使用jmap生成的mp文件,是JDK自帶的工具
6)jstack用於生成當前JVM的所有線程快照,線程快照是虛擬機每一條線程正在執行的方法,目的是定位線程出現長時間停頓的原因。
② JVM的線程狀態及如何排查死鎖原因
一般通過查看發生死鎖時當時的內存佔用情況找原因。具體的方式為:通過jmap或者jstat命令導出當前的mp日誌,然後分析日誌中線程執行情況和內存佔用情況。常用命令如下:
// 列印出內存佔用情況
jstat -gcutil 12564 1000 5
// 列印出內存佔用情況
jmap -heap 12564
// 列印出jvm中各個資源佔用情況,比較合適細節查找
jmap -histo 12564 | ./jmap -histo:live 12564 > /home/xxx/jvmmp.txt
// 列印出整個mp的信息(不建議,太復雜)
jmap -mp:format=b,file=/home/xxx/jvmallmp.txt 12564
//列印出各個內存分區的使用情況
jstat -gccapacity 12564
更多細節可以看看這個文章
blog.yemou.net/article/query/info/tytfjhfascvhzxcyt121
③ linux上如何安裝jstatd服務
此命令是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的介面
options
-nr 當一個存在的RMI Registry沒有找到時,不嘗試創建一個內部的RMI Registry
-p port 埠號,默認為1099
-n rminame 默認為JStatRemoteHost;如果多個jstatd服務開始在同一台主機上,rminame唯一確定一個jstatd服務
-J jvm選項
jstatd
會報如下錯誤:
Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
這是因為沒有給jstatd指定安全策略
創建安全策略文件,並命名為jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
再次啟動
C:\Program Files\Java\jdk1.6.0_16\bin>jstatd -J-Djava.security.policy=jstatd.all.policy
利用jps查看正在運行的java命令
jps
C:\Documents and Settings\lulu>jps
4892 Bootstrap
1296 Jstatd
4484 Jps
3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
此時就可以使用jvisualvm.exe以遠程的方式監控JVM相關信息了。
更多例子
(1)使用內部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默認埠為1099)
(2)使用外部RMI Registry
a)使用默認值
rmiregistry&
jstatd -J-Djava.security.policy=all.policy
b)使用2020埠
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020埠,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已經啟動,不創建內部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日誌能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
④ tomcat報錯日誌
首先找一個log4j的lib包放在tomcat的lib目錄下,log4j包在基本的java項目裡面都有,隨便找一個扔進去應該就可以了,然後在lib目錄新建一個log4j.properties文件,內容為:
tomcat-juli-adapters.jar放到tomcat的lib目錄下,tomcat-juli.jar覆蓋到tomcat的bin目錄下,注意要下載對應tomcat版本的文件。
⑤ 如何查看unix 的java內存使用情況
jmap (linux下特有,也是很常用的一個命令)
觀察運行中的jvm物理內存的佔用情況。
參數如下:
-heap :列印jvm heap的情況
-histo: 列印jvm heap的直方圖。其輸出信息包括類名,對象數量,對象佔用大小。
-histo:live : 同上,但是只答應存活對象的情況
-permstat: 列印permanent generation heap情況
命令使用:
jmap -heap 3409
可以觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的內存使用情況
輸出內容:
jmap -histo 3409 | jmap -histo:live 3409
可以觀察heap中所有對象的情況(heap中所有生存的對象的情況)。包括對象數量和所佔空間大小。
輸出內容:
寫個腳本,可以很快把佔用heap最大的對象找出來,對付內存泄漏特別有效。
如果結果很多,可以用以下命令輸出到文本文件。
jmap -histo 3409 | jmap -histo:live 3409 > a.txt
jinfo:可以輸出並修改運行時的java 進程的opts。
jps:與unix上的ps類似,用來顯示本地的java進程,可以查看本地運行著幾個java程序,並顯示他們的進程號。
jstat:一個極強的監視VM內存工具。可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量。
jmap:列印出某個java進程(使用pid)內存內的所有'對象'的情況(如:產生那些對象,及其數量)。
jconsole:一個java GUI監視工具,可以以圖表化的形式顯示各種數據。並可通過遠程連接監視遠程的伺服器VM。
詳細:在使用這些工具前,先用JPS命令獲取當前的每個JVM進程號,然後選擇要查看的JVM。
jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及載入類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
jstat -class pid:顯示載入class的數量,及所佔空間等信息。
jstat -compiler pid:顯示VM實時編譯的數量等信息。
jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。其他的可以根據這個類推, OC是old內純的佔用量。
jstat -gcnew pid:new對象的信息。
jstat -gcnewcapacity pid:new對象的信息及其佔用量。
jstat -gcold pid:old對象的信息。
jstat -gcoldcapacity pid:old對象的信息及其佔用量。
jstat -gcpermcapacity pid: perm對象的信息及其佔用量。
jstat -util pid:統計gc信息統計。
jstat -printcompilation pid:當前VM執行的信息。
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒列印一次,一共列印6次,還可以加上-h3每三行顯示一下標題。
jmap是一個可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。
命令:jmap -mp:format=b,file=heap.bin
file:保存路徑及文件名
pid:進程編號
?jmap -histo:live pid| less :堆中活動的對象以及大小
?jmap -heap pid : 查看堆的使用狀況信息
jinfo:的用處比較簡單,就是能輸出並修改運行時的java進程的運行參數。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。
jconsole是一個用java寫的GUI程序,用來監控VM,並可監控遠程的VM,非常易用,而且功能非常強。使用方法:命令行里打 jconsole,選則進程就可以了。
JConsole中關於內存分區的說明。
Eden Space (heap): 內存最初從這個線程池分配給大部分對象。
Survivor Space (heap):用於保存在eden space內存池中經過垃圾回收後沒有被回收的對象。
Tenured Generation (heap):用於保持已經在 survivor space內存池中存在了一段時間的對象。
Permanent Generation (non-heap): 保存虛擬機自己的靜態(refective)數據,例如類(class)和方法(method)對象。Java虛擬機共享這些類數據。這個區域被分割為只讀的和只寫的,
Code Cache (non-heap):HotSpot Java虛擬機包括一個用於編譯和保存本地代碼(native code)的內存,叫做「代碼緩存區」(code cache)
?jstack ( 查看jvm線程運行狀態,是否有死鎖現象等等信息) : jstack pid : thread mp
?jstat -gcutil pid 1000 100 : 1000ms統計一次gc情況統計100次;
另外推薦一款查看jmap mp 的內存對象工具 MemoryAnalyzer
⑥ Java的GC機制到底怎麼回事
這個有點復雜,現在JVM應該都是分代回收,具體你可以去看一下JVM原理;
簡單點說就是: 你 new 出來的對象,當不用的時候是不會馬上回收的;JVM分時間,分階段逐步回收;當然,如果你直接調用System.gc()的話;這時候會引發 full gc();也就是JVM裡面不被引用的對象都會被回收一次,資源消耗的代價是比較高的;你可以用jstat命令查看到具體的回收過程,回收次數等信息
⑦ 如何啟動jdk中jstat命令
垃圾回收收集監控指的是搞清楚JVM如何執行GC的過程,例如,我們可以查明: 1. 何時一個新生代中的對象被移動到老年代時,所花費的時間。
2. Stop-the-world 何時發生的,持續了多長時間。 GC監控是為了鑒別JVM是否在高效地執行GC,以及是否有必
⑧ 使用jstat命令會影響java進程嗎
使用jstat命令會影響java進程
JDK自帶VM分析工具jps,jstat,jmap,jconsole
關鍵字: jdk自帶vm分析工具jps,jstat,jmap,jconsole
一、概述
SUN 的JDK中的幾個工具,非常好用。秉承著有免費,不用商用的原則。以下簡單介紹一下這幾種工具。(註:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一樣,不須特意安裝) 。
我一共找到以下四個工具:重點看看jconsole和jmap。
jps
:與unix上的ps類似,用來顯示本地的java進程,可以查看本地運行著幾個java程序,並顯示他們的進程號。
jstat
:一個極強的監視VM內存工具。可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量。
jmap
:列印出某個java進程(使用pid)內存內的所有『對象』的情況(如:產生那些對象,及其數量)。
jconsole
:一個java GUI監視工具,可以以圖表化的形式顯示各種數據。並可通過遠程連接監視遠程的伺服器VM。
二、 使用介紹:
1、jps :我想很多人都是用過unix系統里的ps命令,這個命令主要是用來顯示當前系統的進程情況,有哪些進程,及其 id。 jps 也是一樣,它的作用是顯示當前系統的java進程情況,及其id號。我們可以通過它來查看我們到底啟動了幾個java進程(因為每一個java程序都會獨佔一個java虛擬機實例),和他們的進程號(為下面幾個程序做准備),並可通過opt來查看這些進程的詳細啟動參數。
使用方法:在當前命令行下打 jps(需要JAVA_HOME,沒有的話,到改程序的目錄下打) 。
可惜沒有linux下的ps好用,名稱不好用。但是在第四個工具jconsole的界面裡面會有具體JAR包的名稱。
2、jstat :對VM內存使用量進行監控。
jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及載入類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
jstat -class pid:顯示載入class的數量,及所佔空間等信息。
jstat -compiler pid:顯示VM實時編譯的數量等信息。
jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。其他的可以根據這個類推, OC是old內純的佔用量。
jstat -gcnew pid:new對象的信息。
jstat -gcnewcapacity pid:new對象的信息及其佔用量。
jstat -gcold pid:old對象的信息。
jstat -gcoldcapacity pid:old對象的信息及其佔用量。
jstat -gcpermcapacity pid: perm對象的信息及其佔用量。
jstat -util pid:統計gc信息統計。
jstat -printcompilation pid:當前VM執行的信息。
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒列印一次,一共列印6次,還可以加上-h3每三行顯示一下標題。
3、jmap 是一個可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。如果連用 SHELL jmap -histo pid>a.log可以將其保存到文本中去(windows下也可以使用),在一段時間後,使用文本對比工具,可以對比出GC回收了哪些對象。 jmap -mp:format=b,file=f1 3024可以將3024進程的內存heap輸出出來到f1文件里。
4、jconsole 是一個用java寫的GUI程序,用來監控VM,並可監控遠程的VM,非常易用,而且功能非常強。由於是GUI程序,這里就不詳細介紹了,不會的地方可以參考SUN的官方文檔。
使用方法:命令行里打 jconsole,選則進程就可以了。
友好提示:windows查看進程號,由於任務管理器默認的情況下是不顯示進程id號的,所以可以通過如下方法加上。ctrl+alt+del打開任務管理器,選擇『進程』選項卡,點『查看』->''選擇列''->加上''PID'',就可以了。當然還有其他很好的選項。
⑨ websphere自帶jdk能使用jps,jstat等命令嗎
試試這個方法:
不能,jps和jstat皆為sun jdk的命令,IBM jdk沒有這些命令!
⑩ cat110怎麼不好使用了,點開關老是出現提示,正在連接,請稍後重試。
命令行工具
在安裝完JDK之後在java_HOME/bin目錄下JDK已經提供了很多命令行的工具
可能我們最常用的就是java、javac這兩個命令,除了這兩個命令之外還有提供很多其他的實用工具,本文主要來一起學習對JVM監控診斷工具
虛擬機進程狀況工具(jps)
該工具的功能比較單一,與linux中的ps功能類似,用來列出正在運行的虛擬機進程,並顯示出運行的主類和進程號
命令格式:jps [option] [hostid]
❝
如果需要查看遠程機器的jvm進程需要填寫hostid,並且需要使用RMI,比如:rmi://192.168.2.128:12345
❞
常用的選項:
-q : 只顯示出虛擬機的進程id(lvmid),省略主類名
-m : 輸出啟動時傳遞給主類的參數
-l : 顯示出主類的全名,包括jar包路徑
-v : 輸出虛擬機進程啟動時的JVM參數
虛擬機統計信息監控工具(jstat)
用於監控虛擬機運行狀態信息的命令行工具,可以提供內存,垃圾收集等運行時的數據
命令格式:
jstat [option vmid] [interval [s|ms] [count]]
interval表示間隔多久時間查詢一次,count表示查詢多少次,比如:每個兩秒查詢一次進程52412的垃圾收集情況,共查詢5次
jstat -gc 52412 2s 5
常用的選項:
-class: 監控類裝載,卸載次數和總空間以及載入類的耗時
-gc: 監控java堆的情況
-gcutil: 主要輸出各個空間使用的百分比
-gcnew: 主要是監控新生代的GC狀況
-gcold: 監控老年代的GC狀況
-compiler: 輸出JIT編譯器編譯過的方法和耗時信息
查看堆空間的使用百分比: jstat -gcutil 5