從CLI監視OpenJDK

目前,我大部分時間在Java虛擬機 (JVM)內或周圍進行大量工作,大部分時間是在Linux上。

當事情變得不對勁并且我試圖確定原因時,我接觸了Java性能分析工具。 這些工具有兩種形式,一種是精美的GUI(稱為visualvm) ,當我在本地計算機上工作時會使用它;另一種是Java開發工具包(JDK)附帶的cli工具(當我在遠程工作時使用)。

我指的CLI工具是:

  • jps – JVM進程狀態工具
  • jstat – JVM統計信息監視工具
  • jhat – Java堆分析工具
  • jstack – Java堆棧跟蹤工具

我最常用的工具是jps,jstat和jstack,jahat工具也非常方便,但實際上確實需要一個完整的博客文章,因為您瘋狂地使用它可以做什么。 在這篇文章中,我整理了一些技巧,觀察和示例輸出,以說明如何使用它們。

當我使用ubuntu 11.10(僅安裝Java運行時環境(JRE))時,我將需要安裝JDK。 就我而言,我決定嘗試一下openjdk 7,但是版本6可以正常工作。

root@oneric:~# apt-get install openjdk-7-jdk

要嘗試這些命令,我??已經安裝了tomcat7,可以通過ubuntu上的apt來完成,同樣,以前的版本是tomcat 6。

root@oneric:~# apt-get install tomcat7

現在我已經安裝了tomcat,我想列出Java進程,請注意,這樣做時最好假定使用與服務相同的用戶帳戶。 在ubuntu上,我將使用用戶帳戶,因為tomcat7用戶是系統帳戶,我必須覆蓋shell,因為默認情況下它是/ bin / nologin ,然后我可以以該用戶身份運行jps。

jps命令輸出java進程的PID以及啟動時傳遞給它的主類名稱和參數。

root@oneric:~# su - tomcat7 -s /bin/bash 
tomcat7@oneric:~$ jps -ml
12728 org.apache.catalina.startup.Bootstrap start
13926 sun.tools.jps.Jps -ml
tomcat7@oneric:~$

現在我們有了這些進程的PID,可以運行jstat了,我使用的第一個開關是-gcutil,這使我對jvm中的堆使用有了一個總體了解。 如果出現暫停或性能下降的情況,我將查看最后兩列。 其中包含垃圾收集時間(GCT)和完整垃圾收集時間(FGCT)。 如果FGCT列每秒增加一次,則可能是我們遇到了問題。

下面的示例針對tomcat的PID運行jstat 。 我還指示該命令每20行顯示表頭并以1000毫秒的間隔連續打印統計信息,就像正常的控件C一樣,在輸出末尾顯示。

此示例顯示了一個很少發生的新啟動的tomcat 7,這從完全垃圾收集時間(FGCT)和垃圾收集時間(GCT)列中的值可以清楚地看出。

還要注意的是,目前的Permgen空間(P)占70%。 permgen空間是堆的重要區域,因為它保存用戶類,方法名稱和內部jvm對象。 如果您使用tomcat已有一段時間,您將看到java.lang.OutOfMemoryError:PermGen空間錯誤,該錯誤指示何時該空間被填滿并且無法被垃圾回收。 重新部署大型Web應用程序時經常發生這種情況。

同樣在示例中,我們可以看到幸存者0(S0),幸存者1(S1),伊甸園和舊空間具有相當大的可用空間。

tomcat7@oneric:~$ jstat -gcutil -h20 12728 1000S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   0.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.0320.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.0320.00  17.90  32.12   4.81  71.41      5    0.009     1    0.023    0.032

為了說明相比之下,tomcat的負載情況,我們可以安裝一個稱為Apache Bench的工具。

root@oneric:~# apt-get install apache2-utils

并運行以下命令以同時訪問具有大量請求的基本頁面。

markw@oneric:~$ ab -n 1000000 -c 100 http://localhost:8080/

下面是該測試運行了一段時間后的輸出,因為我們可以看到幸存者1,伊甸園和舊空間有了相當大的增長,但是服務器并沒有花費很多時間來進行完整的垃圾收集,如下所示完整垃圾收集計數(FGC)的值只有10,從年輕一代收集計數(YGC)的增加可以看出,大部分工作是在年輕一代中進行的。

還要注意的是,permgen空間沒有太多變化,實際上下降了,這是由于堆大小的增加。

tomcat7@oneric:~$ jstat -gcutil -h20 12728 1000S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   0.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.2500.00 100.00  52.02  81.84  59.62    117    1.176    10    0.074    1.250

為了更深入地了解垃圾收集的原因,我們使用了帶有-gccause選項的jstat命令,該命令顯示的列與上一個命令相同,但有兩個額外的列提供了GC的原因。

在下面的示例中,我們可以看到分配失敗的示例,這表明由于堆太小,正在執行完整的gc。

tomcat7@oneric:~$ jstat -gccause -h20 12728 1000
100.00   0.00   0.00  78.91  59.67    168    1.680    14    0.083    1.763 unknown GCCause      No GC               
100.00   0.00  72.61  83.73  59.67    170    1.698    14    0.083    1.781 unknown GCCause      No GC               0.00 100.00  46.24  91.83  59.67    173    1.729    14    0.083    1.811 unknown GCCause      No GC               
100.00   0.00  11.39  29.80  59.67    176    1.759    16    0.086    1.846 unknown GCCause      No GC               
100.00   0.00  92.41  35.30  59.67    179    1.777    16    0.086    1.864 unknown GCCause      Allocation Failure  0.00 100.00  62.58  43.05  59.67    181    1.803    16    0.086    1.889 unknown GCCause      No GC

診斷性能問題時,我還想研究的另一個領域是虛擬機中運行的線程。 這可以幫助我理解是否有任何組件超載,因此可以運行許多線程來追趕。 這主要僅適用于異步過程,例如消息傳遞或調度例程。

要轉儲線程及其當前堆棧的列表,請使用jstack命令,如下面的示例所示,我通常再次以進程所有者的身份運行它。

tomcat7@oneric:~$ jstack 12728
2011-10-16 14:53:58
Full thread dump OpenJDK 64-Bit Server VM (20.0-b11 mixed mode):"Attach Listener" daemon prio=10 tid=0x00000000015be800 nid=0x4004 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"http-bio-8080-exec-182" daemon prio=10 tid=0x00007f9d84274800 nid=0x3cd3 waiting on condition [0x00007f9d7a0df000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000000ef16da38> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject. await(AbstractQueuedSynchronizer.java:2043)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:386)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)at java.lang.Thread.run(Thread.java:679)
...

我計劃用jruby在一些可視化工具上做一些工作,但是這可能是我下一篇文章的重點。 在撰寫本文的過程中,我找到了一些有趣的文章,這些文章鏈接如下:

  • Sun Microsystems的Chuk-Munn Lee對Java SE 6部署進行故障排除
  • 解釋java.lang.OutOfMemoryError:PermGen空間



參考: Mark Wolfe博客上的 JCG合作伙伴 Mark Wolfe 從CLI監視OpenJDK 。

相關文章 :
  • 任何軟件開發公司應存在的服務,實踐和工具,第1部分
  • 這是在您的業務邏輯之前!
  • 您的代碼中有幾個錯誤?
  • 使用FindBugs產生更少的錯誤代碼
  • 引入新技術–如何抵抗阻力
  • Java工具:源代碼優化和分析
  • 我們可以更好地理解需求規范嗎?
  • 每個程序員都應該知道的事情
  • 為什么自動化測試可以提高您的開發速度

翻譯自: https://www.javacodegeeks.com/2011/10/monitoring-openjdk-from-cli.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python數據庫優化_python | Mysql性能優化一

對mysql優化是一個綜合性的技術&#xff0c;主要包括表的設計合理化(符合3NF)添加適當索引(index) [四種: 普通索引、主鍵索引、唯一索引unique、全文索引]分表技術(水平分割、垂直分割)讀寫[寫: update/delete/add]分離存儲過程 [模塊化編程&#xff0c;可以提高速度]對mysql配…

MySQL中文亂碼問題

項目中用到MySQL數據庫時中文出現亂碼問題&#xff08;中文字符都變成了&#xff1f;&#xff09;解決&#xff1a; 1、統一項目與數據庫的編碼&#xff0c;項目中用的是UTF-8因此我的把數據庫的編碼統一成UTF-8 修改方式&#xff1a;修改 MySQL根目錄中的 my.ini 文件替換d…

json與字符串互轉

1 字符串轉JSON var objeval((str"))var objJSON.parse(str)var objstr.parseJSON()2 JSON轉字符串 var strobj.toJSONString()var strJSON.stringify(obj)轉載于:https://www.cnblogs.com/liu-xia/p/5050878.html

使用RequestFactory API進行Spring GWT集成

從GWT 2.4開始&#xff0c;將RequestFactory API與后端的Spring服務集成很容易&#xff0c;您需要做的就是在服務器上創建一個自定義ServiceLocator&#xff0c;GWT將使用它來正確定位被調用的服務&#xff1a; public class SpringServiceLocator implements ServiceLocator {…

C++實例講解Binder通信

binder是android里面的通信機制&#xff0c;這就不說它如何如何好了&#xff0c;Goog已經說過了&#xff0c;這里不多說。binder是一個面向對象的編程方法&#xff0c;大量使用虛函數類。最近研究binder看到一網友寫的&#xff0c;就借鑒一下。這個例子很好的解釋里binder通信關…

2014編程之美初賽第一場

題目1 : 焦距 時間限制:2000ms單點時限:1000ms內存限制:256MB描述 一般來說&#xff0c;我們采用針孔相機模型&#xff0c;也就是認為它用到的是小孔成像原理。 在相機坐標系下&#xff0c;一般來說&#xff0c;我們用到的單位長度&#xff0c;不是“米”這樣的國際單位&#x…

高中python公開課怎么上好_如何上好高中英語公開課

談如何上好高中英語公開課對青年教師來說&#xff0c;開一節公開課&#xff0c;如同完成一次蛻變&#xff0c;累掉一層皮&#xff0c;有著刻骨銘心的陣痛&#xff0c;但換來的是突飛猛進的專業成長。可以說&#xff0c;公開課是青年教師培訓的有效途徑&#xff0c;是名師培養的…

Codeforces Round #261 (Div. 2) - E (459E)

題目連接&#xff1a;http://codeforces.com/contest/459/problem/E 題目大意&#xff1a;給定一張有向圖&#xff0c;無自環無重邊&#xff0c;每條邊有一個邊權&#xff0c;求最長嚴格上升路徑長度。(1≤n&#xff0c;m≤3 *10^5) 初見此題覺得以邊為點&#xff0c;以點為邊&…

回收對象以提高性能

總覽 在上一篇文章中&#xff0c;我說過對象反序列化更快的原因是由于使用了回收對象。 由于兩個原因&#xff0c;這可能令人驚訝&#xff1a;1&#xff09;相信如今創建對象是如此之快&#xff0c;無關緊要或與回收自己一樣快&#xff0c;2&#xff09;默認情況下&#xff0c;…

jquery GET POST

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <head> <!--引入百度庫--> <script src"http://libs.baidu.com/jquery/1.10.2/jquery.min.js"> </script> <title></title> <scrip…

C++高精度運算類bign (重載操作符)

大數據操作&#xff0c;有如下問題&#xff1a; 計算&#xff1a;45678913561232654213212314875231656511323132 456789135612326542132123*14875231656511323132 比較&#xff1a;7531479535511335666686565>753147953551451213356666865 ? long long類型存儲不了&…

oj系統格式錯誤_論文查重會不會檢查格式?【paperpp吧】

高等學校一般都會要求大學生在畢業時需要寫作畢業論文&#xff0c;并且會提前發出關于畢業論文的通知&#xff0c;在通知上一般會說明論文寫作的相關要求&#xff0c;其中就會規定論文的相關格式。當然&#xff0c;學校也會在通知中說明論文查重的相關事宜&#xff0c;那么論文…

JavaScript Cookies

相關&#xff1a;jquery-cookie cookie 是存儲于訪問者的計算機中的變量&#xff0c;常用來存儲用戶名字&#xff0c;密碼&#xff0c;日期&#xff0e; 示例&#xff1a; 1 document.cookie"usernameJohn Doe"; 2 document.cookie"usernameJohn Doe; expiresTh…

大數據 -- Hadoop集群搭建

Hadoop集群搭建 1.修改/etc/hosts文件 在每臺linux機器上&#xff0c;sudo vim /etc/hosts 編寫hosts文件。將主機名和ip地址的映射填寫進去。編輯完后&#xff0c;結果如下&#xff1a; 2.配置ssh&#xff0c;實現無密碼登錄 四臺虛擬機上&#xff0c;使用&#xff1a; ssh-ke…

通過示例休眠–第2部分(DetachedCriteria)

所以上次我們幫助正義聯盟有效地管理了他們的超級英雄。 今天&#xff0c;我們集中討論“復仇者聯盟”將如何使用冬眠的“分離標準”找出每個超級英雄的敵人&#xff0c;以保護他們的超級英雄。 您可以從此處下載工作示例。 在此示例中&#xff0c;我們僅考慮兩個實體。 復仇者…

2014編程之美初賽第二場

題目1 : 神奇的數列 時間限制:2000ms單點時限:1000ms內存限制:256MB描述 大神同學是一個熱愛數字的孩子&#xff0c;她無時無刻不在思考生活與數學的聯系。有一天&#xff0c;她發現其實公歷的設計是有講究的。 每4年就會多閏一天&#xff0c;每一百年又會有一年不是閏年&#…

usb大容量存儲設備驅動_usb無法識別怎么辦 如何解決usb識別故障【詳細步驟】...

usb無法識別怎么辦? 隨著計算機硬件飛速發展&#xff0c;外圍設備日益增多&#xff0c;鍵盤、鼠標等早已為人所共知&#xff0c;數碼相機、MP3隨身聽接踵而至&#xff0c;這么多的設備&#xff0c;如何接入個人計算機?USB就是基于這個目的產生的。USB是一個使計算機周邊設備連…

CSDN編程挑戰——《交替字符串》

交替字符串 題目詳情: 如果字符串str3能夠由str1和str2中的字符按順序交替形成&#xff0c;那么稱str3為str1和str2的交替字符串。例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "…

hdu-5834 Magic boy Bi Luo with his excited tree(樹形dp)

題目鏈接&#xff1a; Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1037 Accepted Submission(s): 298 Problem DescriptionBi Luo is a magic boy, he also has …

Java EE過去,現在和云7

最近的JavaOne 2011的一個突出主題是下一個主要的Java EE 7版本。 正如主題發言中所述&#xff0c;有關工作正在進行中。 它將包含我們已經從先行者那里知道的28個規范以及一些新規范。 沒人可以告訴您確切的號碼&#xff0c;因為EE 7僅在“及時”完成時才會接受新的規范。 這意…