1. 程式人生 > >檢視TOMCAT記憶體使用情況(總結)

檢視TOMCAT記憶體使用情況(總結)

最近做個專案,就是要取得cpu佔有率等等的系統資訊,一開始以為要用動態連結庫了,但後來發現可以像下面這樣做,不去呼叫jni,這樣省去了很多看新技術的時間o(∩_∩)o...

在Java中,可以獲得總的實體記憶體、剩餘的實體記憶體、已使用的實體記憶體等資訊,下面例子可以取得這些資訊,並且獲得在Windows下的記憶體使用率。
首先編寫一個MonitorInfoBean類,用來裝載監控的一些資訊,包括實體記憶體、剩餘的實體記憶體、已使用的實體記憶體、記憶體使用率等欄位,該類的程式碼如下:

Java程式碼 收藏程式碼
  1. packagecom.amgkaka.performance;
  2. /***//**
  3. *監視資訊的JavaBean類.
  4. *@authoramg
  5. *@version1.0
  6. *Creationdate:2008-4-25-上午10:37:00
  7. */
  8. publicclassMonitorInfoBean{
  9. /***//**可使用記憶體.*/
  10. privatelongtotalMemory;
  11. /***//**剩餘記憶體.*/
  12. privatelongfreeMemory;
  13. /***//**最大可使用記憶體.*/
  14. privatelongmaxMemory;
  15. /***//**作業系統.*/
  16. privateStringosName;
  17. /***//**總的實體記憶體.*/
  18. privatelongtotalMemorySize;
  19. /***//**剩餘的實體記憶體.*/
  20. private
    longfreePhysicalMemorySize;
  21. /***//**已使用的實體記憶體.*/
  22. privatelongusedMemory;
  23. /***//**執行緒總數.*/
  24. privateinttotalThread;
  25. /***//**cpu使用率.*/
  26. privatedoublecpuRatio;
  27. publiclonggetFreeMemory(){
  28. returnfreeMemory;
  29. }
  30. publicvoidsetFreeMemory(longfreeMemory){
  31. this.freeMemory=freeMemory;
  32. }
  33. publiclonggetFreePhysicalMemorySize(){
  34. returnfreePhysicalMemorySize;
  35. }
  36. publicvoidsetFreePhysicalMemorySize(longfreePhysicalMemorySize){
  37. this.freePhysicalMemorySize=freePhysicalMemorySize;
  38. }
  39. publiclonggetMaxMemory(){
  40. returnmaxMemory;
  41. }
  42. publicvoidsetMaxMemory(longmaxMemory){
  43. this.maxMemory=maxMemory;
  44. }
  45. publicStringgetOsName(){
  46. returnosName;
  47. }
  48. publicvoidsetOsName(StringosName){
  49. this.osName=osName;
  50. }
  51. publiclonggetTotalMemory(){
  52. returntotalMemory;
  53. }
  54. publicvoidsetTotalMemory(longtotalMemory){
  55. this.totalMemory=totalMemory;
  56. }
  57. publiclonggetTotalMemorySize(){
  58. returntotalMemorySize;
  59. }
  60. publicvoidsetTotalMemorySize(longtotalMemorySize){
  61. this.totalMemorySize=totalMemorySize;
  62. }
  63. publicintgetTotalThread(){
  64. returntotalThread;
  65. }
  66. publicvoidsetTotalThread(inttotalThread){
  67. this.totalThread=totalThread;
  68. }
  69. publiclonggetUsedMemory(){
  70. returnusedMemory;
  71. }
  72. publicvoidsetUsedMemory(longusedMemory){
  73. this.usedMemory=usedMemory;
  74. }
  75. publicdoublegetCpuRatio(){
  76. returncpuRatio;
  77. }
  78. publicvoidsetCpuRatio(doublecpuRatio){
  79. this.cpuRatio=cpuRatio;
  80. }
  81. }

接著編寫一個獲得當前的監控資訊的介面,該類的程式碼如下所示:

Java程式碼 收藏程式碼
  1. packagecom.amgkaka.performance;
  2. /***//**
  3. *獲取系統資訊的業務邏輯類介面.
  4. *@authoramg*@version1.0
  5. *Creationdate:2008-3-11-上午10:06:06
  6. */
  7. publicinterfaceIMonitorService{
  8. /***//**
  9. *獲得當前的監控物件.
  10. *@return返回構造好的監控物件
  11. *@throwsException
  12. *@authoramgkaka
  13. *Creationdate:2008-4-25-上午10:45:08
  14. */
  15. publicMonitorInfoBeangetMonitorInfoBean()throwsException;
  16. }

該類的實現類MonitorServiceImpl如下所示:

Java程式碼 收藏程式碼
  1. packagecom.amgkaka.performance;
  2. importjava.io.InputStreamReader;
  3. importjava.io.LineNumberReader;
  4. importsun.management.ManagementFactory;
  5. importcom.sun.management.OperatingSystemMXBean;
  6. /***//**
  7. *獲取系統資訊的業務邏輯實現類.
  8. *@authoramg*@version1.0Creationdate:2008-3-11-上午10:06:06
  9. */
  10. publicclassMonitorServiceImplimplementsIMonitorService{
  11. //可以設定長些,防止讀到執行此次系統檢查時的cpu佔用率,就不準了
  12. privatestaticfinalintCPUTIME=5000;
  13. privatestaticfinalintPERCENT=100;
  14. privatestaticfinalintFAULTLENGTH=10;
  15. /***//**
  16. *獲得當前的監控物件.
  17. *@return返回構造好的監控物件
  18. *@throwsException
  19. *@authoramg*Creationdate:2008-4-25-上午10:45:08
  20. */
  21. publicMonitorInfoBeangetMonitorInfoBean()throwsException{
  22. intkb=1024;
  23. //可使用記憶體
  24. longtotalMemory=Runtime.getRuntime().totalMemory()/kb;
  25. //剩餘記憶體
  26. longfreeMemory=Runtime.getRuntime().freeMemory()/kb;
  27. //最大可使用記憶體
  28. longmaxMemory=Runtime.getRuntime().maxMemory()/kb;
  29. OperatingSystemMXBeanosmxb=(OperatingSystemMXBean)ManagementFactory
  30. .getOperatingSystemMXBean();
  31. //作業系統
  32. StringosName=System.getProperty("os.name");
  33. //總的實體記憶體
  34. longtotalMemorySize=osmxb.getTotalPhysicalMemorySize()/kb;
  35. //剩餘的實體記憶體
  36. longfreePhysicalMemorySize=osmxb.getFreePhysicalMemorySize()/kb;
  37. //已使用的實體記憶體
  38. longusedMemory=(osmxb.getTotalPhysicalMemorySize()-osmxb
  39. .getFreePhysicalMemorySize())
  40. /kb;
  41. //獲得執行緒總數
  42. ThreadGroupparentThread;
  43. for(parentThread=Thread.currentThread().getThreadGroup();parentThread
  44. .getParent()!=null;parentThread=parentThread.getParent())
  45. ;
  46. inttotalThread=parentThread.activeCount();
  47. doublecpuRatio=0;
  48. if(osName.toLowerCase().startsWith("windows")){
  49. cpuRatio=this.getCpuRatioForWindows();
  50. }
  51. //構造返回物件
  52. MonitorInfoBeaninfoBean=newMonitorInfoBean();
  53. infoBean.setFreeMemory(freeMemory);
  54. infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
  55. infoBean.setMaxMemory(maxMemory);
  56. infoBean.setOsName(osName);
  57. infoBean.setTotalMemory(totalMemory);
  58. infoBean.setTotalMemorySize(totalMemorySize);
  59. infoBean.setTotalThread(totalThread);
  60. infoBean.setUsedMemory(usedMemory);
  61. infoBean.setCpuRatio(cpuRatio);
  62. returninfoBean;
  63. }
  64. /***//**
  65. *獲得CPU使用率.
  66. *@return返回cpu使用率
  67. *@authoramg*Creationdate:2008-4-25-下午06:05:11
  68. */
  69. privatedoublegetCpuRatioForWindows(){
  70. try{
  71. StringprocCmd=System.getenv("windir")
  72. +"\\system32\\wbem\\wmic.exeprocessgetCaption,CommandLine,"
  73. +"KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
  74. //取程序資訊
  75. long[]c0=readCpu(Runtime.getRuntime().exec(procCmd));
  76. Thread.sleep(CPUTIME);
  77. long[]c1=readCpu(Runtime.getRuntime().exec(procCmd));
  78. if(c0!=null&&c1!=null){
  79. longidletime=c1[0]-c0[0];
  80. longbusytime=c1[1]-c0[1];
  81. returnDouble.valueOf(
  82. PERCENT*(busytime)/(busytime+idletime))
  83. .doubleValue();
  84. }else{
  85. return0.0;
  86. }
  87. }catch(Exceptionex){
  88. ex.printStackTrace();
  89. return0.0;
  90. }
  91. }
  92. /***//**
  93. *讀取CPU資訊.
  94. *@paramproc
  95. *@return
  96. *@authoramg*Creationdate:2008-4-25-下午06:10:14
  97. */
  98. privatelong[]readCpu(finalProcessproc){
  99. long[]retn=newlong[2];
  100. try{
  101. proc.getOutputStream().close();
  102. InputStreamReaderir=newInputStreamReader(proc.getInputStream());
  103. LineNumberReaderinput=newLineNumberReader(ir);
  104. Stringline=input.readLine();
  105. if(line==null||line.length()<FAULTLENGTH){
  106. returnnull;
  107. }
  108. intcapidx=line.indexOf("Caption");
  109. intcmdidx=line.indexOf("CommandLine");
  110. introcidx=line.indexOf("ReadOperationCount");
  111. intumtidx=line.indexOf("UserModeTime");
  112. intkmtidx=line.indexOf("KernelModeTime");
  113. intwocidx=line.indexOf("WriteOperationCount");
  114. longidletime=0;
  115. longkneltime=0;
  116. longusertime=0;
  117. while((line=input.readLine())!=null){
  118. if(line.length()<wocidx){
  119. continue;
  120. }
  121. //欄位出現順序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
  122. //ThreadCount,UserModeTime,WriteOperation
  123. Stringcaption=Bytes.substring(line,capidx,cmdidx-1)
  124. .trim();
  125. Stringcmd=Bytes.substring(line,cmdidx,kmtidx-1).trim();
  126. if(cmd.indexOf("wmic.exe")>=0){
  127. continue;
  128. }
  129. //log.info("line="+line);
  130. if(caption.equals("SystemIdleProcess")
  131. ||caption.equals("System")){
  132. idletime+=Long.valueOf(
  133. Bytes.substring(line,kmtidx,rocidx-1).trim())
  134. .longValue();
  135. idletime+=Long.valueOf(
  136. Bytes.substring(line,umtidx,wocidx-1).trim())
  137. .longValue();
  138. continue;
  139. }
  140. kneltime+=Long.valueOf(
  141. Bytes.substring(line,kmtidx,rocidx-1).trim())
  142. .longValue();
  143. usertime+=Long.valueOf(
  144. Bytes.substring(line,umtidx,wocidx-1).trim())
  145. .longValue();
  146. }
  147. retn[0]=idletime;
  148. retn[1]=kneltime+usertime;
  149. returnretn;
  150. }catch(Exceptionex){
  151. ex.printStackTrace();
  152. }finally{
  153. try{
  154. proc.getInputStream().close();
  155. }catch(Exceptione){
  156. e.printStackTrace();
  157. }
  158. }
  159. returnnull;
  160. }
  161. /***//**
  162. *測試方法.
  163. *@paramargs
  164. *@throwsException
  165. *@authoramg*Creationdate:2008-4-30-下午04:47:29
  166. */
  167. publicstaticvoidmain(String[]args)throwsException{
  168. IMonitorServiceservice=newMonitorServiceImpl();
  169. MonitorInfoBeanmonitorInfo=service.getMonitorInfoBean();
  170. System.out.println("cpu佔有率="+monitorInfo.getCpuRatio());
  171. System.out.println("可使用記憶體="+monitorInfo.getTotalMemory());
  172. System.out.println("剩餘記憶體="+monitorInfo.getFreeMemory());
  173. System.out.println("最大可使用記憶體="+monitorInfo.getMaxMemory());
  174. System.out.println("作業系統="+monitorInfo.getOsName());
  175. System.out.println("總的實體記憶體="+monitorInfo.getTotalMemorySize()+"kb");
  176. System.out.println("剩餘的實體記憶體="+monitorInfo.getFreeMemory()+"kb");
  177. System.out.println("已使用的實體記憶體="+monitorInfo.getUsedMemory()+"kb");
  178. System.out.println("執行緒總數="+monitorInfo.getTotalThread()+"kb");
  179. }
  180. }

該實現類中需要用到一個自己編寫byte的工具類,該類的程式碼如下所示:

Java程式碼 收藏程式碼
  1. packagecom.amgkaka.performance;
  2. /***//**
  3. *byte操作類.
  4. *@authoramg*@version1.0
  5. *Creationdate:2008-4-30-下午04:57:23
  6. */
  7. publicclassBytes{
  8. /***//**
  9. *由於String.subString對漢字處理存在問題(把一個漢字視為一個位元組),因此在
  10. *包含漢字的字串時存在隱患,現調整如下:
  11. *@paramsrc要擷取的字串
  12. *@paramstart_idx開始座標(包括該座標)
  13. *@paramend_idx截止座標(包括該座標)
  14. *@return
  15. */
  16. publicstaticStringsubstring(Stringsrc,intstart_idx,intend_idx){
  17. byte[]b=src.getBytes();
  18. Stringtgt="";
  19. for(inti=start_idx;i<=end_idx;i++){
  20. tgt+=(char)b[i];
  21. }
  22. returntgt;
  23. }
  24. }

執行下MonitorBeanImpl類,讀者將會看到當前的記憶體、cpu利用率等資訊。

相關推薦

檢視TOMCAT記憶體使用情況總結

最近做個專案,就是要取得cpu佔有率等等的系統資訊,一開始以為要用動態連結庫了,但後來發現可以像下面這樣做,不去呼叫jni,這樣省去了很多看新技術的時間o(∩_∩)o... 在Java中,可以獲得總的實體記憶體、剩餘的實體記憶體、已使用的實體記憶體等資訊,下面例子可以取得這些資訊,並且獲得在Windows下

檢視叢集基本情況重要!! 檢視hadoop叢集有多少節點hdfs fsck /

[email protected]:~$ hdfs fsck /    Connecting to namenode via http://localhost:9870/fsck?ugi=liugen&path=%2F FSCK started by li

深入剖析Qt記憶體洩漏總結

一、簡介 Qt記憶體管理機制:Qt 在內部能夠維護物件的層次結構。對於可視元素,這種層次結構就是子元件與父元件的關係;對於非可視元素,則是一個物件與另一個物件的從屬關係。在 Qt 中,在 Qt 中,刪除父物件會將其子物件一起刪除。 C++中delete 和 new 必須配對使用(一 一對

檢視叢集基本情況重要!! 檢視hadoop叢集有多少節點hdfs fsck /

[email protected]:~$ hdfs fsck /    Connecting to namenode via http://localhost:9870/fsck?ugi=liugen&path=%2F FSCK started by l

mysql索引失效的幾種情況總結

10)隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤. 由於表的欄位tu_mdn定義為varchar2(20),但在查詢時把該欄位作為number型別以where條件傳給Oracle,這樣會導致索引失效. 錯誤的例子:select * from test where tu_mdn=1333

檢視記憶體】Linux檢視記憶體使用情況

用 'top -i' 看看有多少程序處於 Running 狀態,可能系統存在記憶體或 I/O 瓶頸,用 free 看看系統記憶體使用情況,swap 是否被佔用很多,用 iostat 看看 I/O 負載情況... 還有一種辦法是 ps -ef | sort -k7 ,將程序按執行時間排序,看哪個程序消耗的cp

總結CentOS 6.x使用yum快速安裝Apache+PHP+Tomcat(JSP)+MySQL

apache 意思 安裝apache /var/ 軟件 cat yum proxy_ajp alt (總結)CentOS 6.x使用yum快速安裝Apache+PHP+Tomcat(JSP)+MySQL PS:這個是懶人yum快速安裝法,用於開發和測試環境很方便,用於沒有特

總結關於Linux的快取記憶體 Cache Memory詳解

Linux與Win的記憶體管理不同,會盡量快取記憶體以提高讀寫效能,通常叫做Cache Memory。有時候你會發現沒有什麼程式在執行,但是使用top或free命令看到可用記憶體free項會很少,此時檢視系統的 /proc/meminfo 檔案,會發現有一項 Cached Memory:

【第三章】 暫存器記憶體訪問總結

3.1.記憶體中字的儲存 1.概念:CPU中,用16位暫存器來儲存一個字,即一個只要用兩個地址連續的記憶體單元來存放。 2.字單元:存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成。     通常情況下,我們將起始地址為N的字單元簡稱為N地址單元。 3.2.D

深入理解Java記憶體模型——總結

處理器記憶體模型 順序一致性記憶體模型是一個理論參考模型,JMM和處理器記憶體模型在設計時通常會把順序一致性記憶體模型作為參照。JMM和處理器記憶體模型在設計時會對順序一致性模型做一些放鬆,因為如果完全按照順序一致性模型來實現處理器和JMM,那麼很多的處理器和編譯器優化都要被禁止,這對執行效能

Qt總結之十一:記憶體洩漏彙總

一、簡介        Qt記憶體管理機制:Qt 在內部能夠維護物件的層次結構。對於可視元素,這種層次結構就是子元件與父元件的關係;對於非可視元素,則是一個物件與另一個物件的從屬關係。在 Qt 中,在 Qt 中,刪除父物

檢視程式佔用tomcat記憶體情況

最近,公司線上tomcat經常無緣無辜宕機,總結了一下定位問題的方法,僅供參考:報錯資訊:Maximum number of threads (200) created for connector with address null and port 9443 # There

使用ps檢視使用者程序下的執行緒執行情況AIX

1、檢視使用者下所有程序ps -ef2、檢視指定程序下的執行緒數量ps -ef -o pid,thcount|grep xxxxx3、檢視所有程序的執行緒數及執行緒IDps -ef -mo pid,thcount,tid3、檢視系統所有程序的執行緒情況ps -ef -mo T

Linux 檢視Tomcat記憶體佔用情況

以前伺服器還是用 Windows Server 系統的時候,檢視一下各個程序對記憶體的影響就再簡單不過了,開啟工作管理員跟蹤一下相關的 JAVA 程序就OK了。但是伺服器如果使用的是 Linux 系統,有不少小夥伴就不知道怎麼看了,而且網友的回覆也是眾說紛紜。我總結了一下

linux下使用free命令檢視實際記憶體佔用可用記憶體

轉:http://blog.is36.com/linux_free_command_for_memory/ linux下在終端環境下可以使用free命令看到系統實際使用記憶體的情況,一般用free -m方式檢視記憶體佔用情況(兆為單位)。而系統實際可用記憶體是不是f

IIS7網站經常報System.OutOfMemoryException解決方法,如何合理設定記憶體使用情況KBM)值

最近IIS7網站經常報System.OutOfMemoryException,重啟下IIS就可以了,上網查了下是記憶體溢位了,解決辦法:設定回收機制,開啟應用執行緒池,選中網站執行緒池,點選正在回收,就可以在開啟的頁面設定回收條件了,基於記憶體的最大值可以設定兩

Android記憶體溢位oom總結

避免記憶體溢位的方法,主要是對以下三個方面對程式進行優化 記憶體引用 在處理記憶體引用之前,我們先來複習下什麼是強引用、軟引用、弱引用、虛引用 強引用:強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。 當記憶體空間不足,Java虛擬機器

Tomcat學習筆記一個簡單的Web服務器

sub 調用 [] ont 拒絕 address 剖析 文件 getprop 內容為《深入剖析Tomcat》第一章重點,以及自己的總結,如有描述不清的,可查看原書。 一、HTTP協議: 1、定義:用於服務器與客戶端的通訊的協議,允許web服務器和瀏覽器通過互聯網進行發送和接

java實現同步的幾種方式總結

副本 增刪改 否則 都是 fin ret 語義 value art 為何要使用同步? java允許多線程並發控制,當多個線程同時操作一個可共享的資源變量時(如數據的增刪改查), 將會導致數據不準確,相互之間產生沖突,因此加入同步鎖以避免在該線程沒有完成操

Tomcat詳解

tomcat Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta項目中的一個核心項目,由Apache、Sun和其他一些公司及個人共同開發而成。java程序寫的網站用tomcat+jdk來運行。tomcat是一個中間件,真正起作用的,解析java腳