這些日子要用爪哇語言(Java)做內存數據中心。於是把用 Java 監控運行環境硬件資源的內容复習了一下。爪哇類庫提供了 java.util.Runtim 類,主要負責調用爪哇虛擬機(JavaVM)外部的基層操作系統功能、處理基於一種叫鉤子的原理的程序、獲取系統資源信息以及控制調試信息生成。本文單獨利用其獲取系統資源信息的功能。

java.util.Runtim 類具有以下幾個方法和獲取系統資源信息有關。以下代碼可不是簡簡單單從標准類庫裏邊复制出來的哦。全球目前獨此一份。

  1. /** 
  2.  * 返回爪哇(Java)虛擬機可用線程數。 
  3.  * 
  4.  * <p>該值在特定的虛擬機調用期間可能發生更改。因此,對可用處理器數目很敏感的 
  5.  * 應用程序應該不定期地輪詢該屬性,並相應地調整其資源用法。</p> 
  6.  * 
  7.  * @return  虛擬機可用的最大處理器數目;從不小於 1 
  8.  * @since 1.4 
  9.  */ 
  10. public native int availableProcessors(); 
  11.  
  12. /** 
  13.  * 返回爪哇(Java)虛擬機中的空閑內存量。調用 <code>gc</code> 方法可能導致 
  14.  * <code>freeMemory</code> 返回值的增加。 
  15.  * 
  16.  * @return  供將來分配對象使用的當前可用內存的近似總量,以字節为單位。 
  17.  */ 
  18. public native long freeMemory(); 
  19.  
  20. /** 
  21.  * 返回爪哇(Java)虛擬機中的內存總量。此方法返回的值可能隨時間的推移而變化,這 
  22.  * 取决於主機環境。 
  23.  * <p> 
  24.  * 注意,保存一個给定類型的對象所需的內存量可能取决於實現方式。 
  25.  * 
  26.  * @return  目前为當前和後續對象提供的內存總量,以字節为單位。 
  27.  */ 
  28. public native long totalMemory();           //                                // 
  29.  
  30. /** 
  31.  * 返回爪哇(Java)虛擬機能夠嘗試使用的最大內存量。如果內存本身沒有限制,則 
  32.  * 返回值 {@link java.lang.Long#MAX_VALUE} 。 </p> 
  33.  * 
  34.  * @return  虛擬機能夠嘗試使用的最大內存量,以字節为單位。 
  35.  * @since 1.4 
  36.  */ 
  37. public native long maxMemory(); 
  38.  
  39. /** 
  40.  * 運行垃圾回收器。 
  41.  * 調用此方法意味着爪哇(Java)虛擬機做了一些努力來回收未用對象,以便能夠快速地 
  42.  * 重用這些對象當前占用的內存。當控制從方法調用中返回時,虛擬機已經盡最大努力回收 
  43.  * 了所有丟棄的對象。 
  44.  * <p> 
  45.  * 名稱 <code>gc</code> 代表“垃圾回收器”。虛擬機根據需要在單獨的線程中自動執行 
  46.  * 回收過程,甚至不用顯式調用 <code>gc</code> 方法。 
  47.  * <p> 
  48.  * 方法 {@link System#gc()} 是調用此方法的一種傳統而便捷的方式 
  49.  */ 
  50. public native void gc(); 

我們可以看到這些都是本地方法。這意味着將 Runtime 對象遠程傳遞之後,將不能得到正確執行結果。
這些方法用起來都很簡單,文檔注釋也寫得比較明白。
在高可用數據中心中,我認为應該根據可用 CPU 線數决定程序開启的線程數。此線程數为 CPU 可用線數的某倍數。此倍數應通過實際經驗所得。然後程序通過監控 CPU 可用線數,來控制線程池保留數量。
內存的控制,我想應該是在內存超出警戒線時發出警報,以向運營人員申請增加內存數據中心服務器。同時,應該在內存過滿之前,由程序執行垃圾回收,以消除並無引用的老生代對象。
如果各位有對內存數據中心的想法、建議或者質疑,歡迎來一起討論。

下邊是我編寫的一個系統資源測試程序。程序裏邊使用了 Runtime 類關於系統資源的所有方法。

  1. package cn.spads.test.grammar; 
  2.  
  3. import java.util.LinkedList; 
  4. import java.util.Random; 
  5.  
  6. /** 
  7.  * 本類用於示範使用 Runtime 檢查系統運行情況。 
  8.  * 將 Runtime 作为可變成員,是为多系統公用檢查預留的設計。 
  9.  * @author  Shane Loo Li 
  10.  */ 
  11. public class PerformanceMonitor 
  12.     /** 
  13.      * 此量控制程序運行時間。此值越大,此演示程序運行時間越長。 
  14.      */ 
  15.     static public int runLoopTimes = 55
  16.  
  17.     /** 
  18.      * 此为每次檢測間隔的時間片數。此值越大,間隔時間越長。 
  19.      */ 
  20.     static public int waitTime = 1500000
  21.  
  22.     static public void main(String[] arguments) throws Exception 
  23.     { 
  24.         Runtime context = Runtime.getRuntime(); 
  25.         final PerformanceMonitor monitor = new PerformanceMonitor(context); 
  26.         final LinkedList<String> pretendedMemory = new LinkedList<String>(); 
  27.         new Thread( 
  28.                 new Runnable() 
  29.                 { 
  30.                     public void run() 
  31.                     { 
  32.                         for (int j = -1; ++j != runLoopTimes; ) 
  33.                         { 
  34.                             // 檢查系統情況 
  35.                             monitor.checkAll(); 
  36.  
  37.                             // 每次檢查運行情況之後,都會休息 1000 個時間片 
  38.                             for (int i = -1; ++i != waitTime; ) Thread.yield(); 
  39.  
  40.                             // 每次檢查之後,會制造一些對象,記錄其中一部分,並刪除些老對象 
  41.                             for (int i = -1; ++i != 20000; ) 
  42.                             { 
  43.                                 StringBuilder builder = new StringBuilder(); 
  44.                                 Random ran = new Random(); 
  45.                                 for (int index = -1; ++index != 100; ) 
  46.                                     builder.append((char) (ran.nextInt(26) + 64)); 
  47.                                 String garbage = new String(builder.toString()); 
  48.                                 garbage = garbage.substring(garbage.length()); 
  49.                                 pretendedMemory.add(builder.toString()); 
  50.                             } 
  51.                             int deleteCount = new Random().nextInt(15000); 
  52.                             for (int i = -1; ++i != deleteCount; ) 
  53.                                 pretendedMemory.removeFirst(); 
  54.  
  55.                             System.out.println("-----------"); 
  56.                         } 
  57.                     } 
  58.                 } 
  59.             ).start(); 
  60.     } 
  61.  
  62.     private Runtime context; 
  63.     private double maxFreeMemory; 
  64.  
  65.     private long lastFreeMemory; 
  66.     private long lastTotalMemory; 
  67.     private long lastMaxMemory; 
  68.  
  69.     private double lastMemoryRate; 
  70.  
  71.     public PerformanceMonitor(Runtime context) 
  72.     { 
  73.         this.context = context; 
  74.     } 
  75.  
  76.     public void checkAll() 
  77.     { 
  78.         this.monitorMemory(); 
  79.         this.monitorCpu(); 
  80.     } 
  81.     /** 
  82.      * 本方法比較當前空餘內存與曆史記錄最大空餘內存的關系。若空餘內存過小,則執行垃圾回收。 
  83.      */ 
  84.     public void monitorMemory() 
  85.     { 
  86.         // 求空餘內存,並計算空餘內存比起最大空餘內存的比例 
  87.         long freeMemory = this.context.freeMemory(); 
  88.         if (freeMemory > this.maxFreeMemory) 
  89.             this.maxFreeMemory = Long.valueOf(freeMemory).doubleValue(); 
  90.         double memoryRate = freeMemory / this.maxFreeMemory; 
  91.         System.out.println("There are " + memoryRate * 100 + "% free memory."); 
  92.  
  93.         // 如果內存空餘率在變小,則一切正常;否則需要報告內存變化情況 
  94.         if (memoryRate >= this.lastMemoryRate) this.reportMemoryChange(); 
  95.  
  96.         // 如果內存空餘率很低,則執行內存回收 
  97.         if (freeMemory / this.maxFreeMemory < 0.3
  98.         { 
  99.             System.out.print("System will start memory Garbage Collection."); 
  100.             System.out.println(" Now we have " + freeMemory / 1000 + " KB free memory."); 
  101.             this.context.gc(); 
  102.             System.out.println("After the Garbage Collection, we have " 
  103.                     + this.context.freeMemory() / 1000 + " KB free memory."); 
  104.         } 
  105.  
  106.         // 記錄內存信息 
  107.         this.recordMemoryInfo(memoryRate); 
  108.     } 
  109.  
  110.     /** 
  111.      * 報告內存變化情況 
  112.      */ 
  113.     private void reportMemoryChange() 
  114.     { 
  115.         System.out.print("Last freeMemory = " + this.lastFreeMemory / 1000 + " KB,"); 
  116.         System.out.println(" now it is " + this.context.freeMemory() / 1000 + " KB."); 
  117.         System.out.print("Last totalMemory = " + this.lastTotalMemory / 1000 + " KB,"); 
  118.         System.out.println(" now it is " + this.context.totalMemory() / 1000 + " KB."); 
  119.         System.out.print("Last maxMemory = " + this.lastMaxMemory / 1000 + " KB,"); 
  120.         System.out.println(" now it is " + this.context.maxMemory() / 1000 + " KB."); 
  121.     } 
  122.  
  123.     /** 
  124.      * 記錄本次內存信息。 
  125.      */ 
  126.     private void recordMemoryInfo(double memoryRate) 
  127.     { 
  128.         this.lastFreeMemory = this.context.freeMemory(); 
  129.         this.lastMaxMemory = this.context.maxMemory(); 
  130.         this.lastTotalMemory = this.context.totalMemory(); 
  131.         this.lastMemoryRate = memoryRate; 
  132.     } 
  133.  
  134.     /** 
  135.      * 監測 CPU 的方法。 
  136.      */ 
  137.     public void monitorCpu() 
  138.     { 
  139.         int cpuCount = this.context.availableProcessors(); 
  140.         if (cpuCount > 1) System.out.println("CPU have " + cpuCount + " processors."); 
  141.     } 

我運行這段程序,得到結果報告。通過觀察結果報告,我得到了一些新結論。
首先, maxMemory 在一台機器只運行一個爪哇(Java)虛擬機的前提下,一般來說並不會變動。
其次,新生代內存會很快地自動回收,這體現在 freeMemory 總是不斷少量自動增加上。
最後,爪哇(Java)虛擬機會在內存不足時,自己申請新的內存。這個內存空間也能夠根據報告大概看出一點原則:既不是完全通過可用內存比例,也不是完全通過可用內存數量。

我自己運行的報告附在下邊
 

  1. There are 100.0% free memory. 
  2. Last freeMemory = 0 KB, now it is 124371 KB. 
  3. Last totalMemory = 0 KB, now it is 126353 KB. 
  4. Last maxMemory = 0 KB, now it is 1875378 KB. 
  5. CPU have 8 processors. 
  6. ----------- 
  7. There are 79.91675736339026% free memory. 
  8. CPU have 8 processors. 
  9. ----------- 
  10. There are 82.1353751773145% free memory. 
  11. Last freeMemory = 99921 KB, now it is 102695 KB. 
  12. Last totalMemory = 126353 KB, now it is 126353 KB. 
  13. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  14. CPU have 8 processors. 
  15. ----------- 
  16. There are 100.0% free memory. 
  17. Last freeMemory = 102695 KB, now it is 140522 KB. 
  18. Last totalMemory = 126353 KB, now it is 159383 KB. 
  19. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  20. CPU have 8 processors. 
  21. ----------- 
  22. There are 82.4930651724349% free memory. 
  23. CPU have 8 processors. 
  24. ----------- 
  25. There are 65.90519105111919% free memory. 
  26. CPU have 8 processors. 
  27. ----------- 
  28. There are 88.50612783993465% free memory. 
  29. Last freeMemory = 92611 KB, now it is 124371 KB. 
  30. Last totalMemory = 159383 KB, now it is 159383 KB. 
  31. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  32. CPU have 8 processors. 
  33. ----------- 
  34. There are 71.68576727159902% free memory. 
  35. CPU have 8 processors. 
  36. ----------- 
  37. There are 54.86540670326339% free memory. 
  38. CPU have 8 processors. 
  39. ----------- 
  40. There are 100.0% free memory. 
  41. Last freeMemory = 77098 KB, now it is 172330 KB. 
  42. Last totalMemory = 159383 KB, now it is 225443 KB. 
  43. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  44. CPU have 8 processors. 
  45. ----------- 
  46. There are 86.18976806966614% free memory. 
  47. CPU have 8 processors. 
  48. ----------- 
  49. There are 72.37916940114857% free memory. 
  50. CPU have 8 processors. 
  51. ----------- 
  52. There are 58.56890497502629% free memory. 
  53. CPU have 8 processors. 
  54. ----------- 
  55. There are 46.292794574206056% free memory. 
  56. CPU have 8 processors. 
  57. ----------- 
  58. There are 92.98754812452182% free memory. 
  59. Last freeMemory = 79776 KB, now it is 160245 KB. 
  60. Last totalMemory = 225443 KB, now it is 225443 KB. 
  61. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  62. CPU have 8 processors. 
  63. ----------- 
  64. There are 79.17694945600425% free memory. 
  65. CPU have 8 processors. 
  66. ----------- 
  67. There are 65.36668502988196% free memory. 
  68. CPU have 8 processors. 
  69. ----------- 
  70. There are 51.556035296554015% free memory. 
  71. CPU have 8 processors. 
  72. ----------- 
  73. There are 37.745845146519564% free memory. 
  74. CPU have 8 processors. 
  75. ----------- 
  76. There are 23.935246478001996% free memory. 
  77. System will start memory Garbage Collection. Now we have 41247 KB free memory. 
  78. After the Garbage Collection, we have 312897 KB free memory. 
  79. CPU have 8 processors. 
  80. ----------- 
  81. There are 100.0% free memory. 
  82. Last freeMemory = 312897 KB, now it is 292267 KB. 
  83. Last totalMemory = 380108 KB, now it is 380108 KB. 
  84. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  85. CPU have 8 processors. 
  86. ----------- 
  87. There are 91.1770148111291% free memory. 
  88. CPU have 8 processors. 
  89. ----------- 
  90. There are 84.11856206174096% free memory. 
  91. CPU have 8 processors. 
  92. ----------- 
  93. There are 75.29548107031924% free memory. 
  94. CPU have 8 processors. 
  95. ----------- 
  96. There are 68.2370940141088% free memory. 
  97. CPU have 8 processors. 
  98. ----------- 
  99. There are 59.414100613590705% free memory. 
  100. CPU have 8 processors. 
  101. ----------- 
  102. There are 52.35564786420257% free memory. 
  103. CPU have 8 processors. 
  104. ----------- 
  105. There are 43.53256687278083% free memory. 
  106. CPU have 8 processors. 
  107. ----------- 
  108. There are 34.70958168390994% free memory. 
  109. CPU have 8 processors. 
  110. ----------- 
  111. There are 27.6511289345218% free memory. 
  112. System will start memory Garbage Collection. Now we have 80815 KB free memory. 
  113. After the Garbage Collection, we have 281843 KB free memory. 
  114. CPU have 8 processors. 
  115. ----------- 
  116. There are 89.37604181852511% free memory. 
  117. Last freeMemory = 281843 KB, now it is 261217 KB. 
  118. Last totalMemory = 380108 KB, now it is 380108 KB. 
  119. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  120. CPU have 8 processors. 
  121. ----------- 
  122. There are 80.55442250030752% free memory. 
  123. CPU have 8 processors. 
  124. ----------- 
  125. There are 73.49712485596086% free memory. 
  126. CPU have 8 processors. 
  127. ----------- 
  128. There are 64.67547542837015% free memory. 
  129. CPU have 8 processors. 
  130. ----------- 
  131. There are 57.618177784023494% free memory. 
  132. CPU have 8 processors. 
  133. ----------- 
  134. There are 48.79652835643279% free memory. 
  135. CPU have 8 processors. 
  136. ----------- 
  137. There are 41.739230712086126% free memory. 
  138. CPU have 8 processors. 
  139. ----------- 
  140. There are 32.91758128449542% free memory. 
  141. CPU have 8 processors. 
  142. ----------- 
  143. There are 24.095931856904713% free memory. 
  144. System will start memory Garbage Collection. Now we have 70424 KB free memory. 
  145. After the Garbage Collection, we have 258135 KB free memory. 
  146. CPU have 8 processors. 
  147. ----------- 
  148. There are 81.32306278893708% free memory. 
  149. Last freeMemory = 258135 KB, now it is 237681 KB. 
  150. Last totalMemory = 380108 KB, now it is 380108 KB. 
  151. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  152. CPU have 8 processors. 
  153. ----------- 
  154. There are 72.5752415442342% free memory. 
  155. CPU have 8 processors. 
  156. ----------- 
  157. There are 65.57687068029719% free memory. 
  158. CPU have 8 processors. 
  159. ----------- 
  160. There are 56.828918049238894% free memory. 
  161. CPU have 8 processors. 
  162. ----------- 
  163. There are 49.83056634581206% free memory. 
  164. CPU have 8 processors. 
  165. ----------- 
  166. There are 41.08271772895181% free memory. 
  167. CPU have 8 processors. 
  168. ----------- 
  169. There are 32.33487732373877% free memory. 
  170. CPU have 8 processors. 
  171. ----------- 
  172. There are 25.33650645980177% free memory. 
  173. System will start memory Garbage Collection. Now we have 74050 KB free memory. 
  174. After the Garbage Collection, we have 229217 KB free memory. 
  175. CPU have 8 processors. 
  176. ----------- 
  177. There are 71.73676393326296% free memory. 
  178. Last freeMemory = 229217 KB, now it is 209663 KB. 
  179. Last totalMemory = 380108 KB, now it is 380108 KB. 
  180. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  181. CPU have 8 processors. 
  182. ----------- 
  183. There are 63.37379248412019% free memory. 
  184. CPU have 8 processors. 
  185. ----------- 
  186. There are 55.01088399093938% free memory. 
  187. CPU have 8 processors. 
  188. ----------- 
  189. There are 46.64788243242348% free memory. 
  190. CPU have 8 processors. 
  191. ----------- 
  192. There are 38.28488087390758% free memory. 
  193. CPU have 8 processors. 
  194. ----------- 
  195. There are 31.59450152482077% free memory. 
  196. CPU have 8 processors. 
  197. ----------- 
  198. There are 23.231593031639967% free memory. 
  199. System will start memory Garbage Collection. Now we have 67898 KB free memory. 
  200. After the Garbage Collection, we have 203384 KB free memory. 
  201. CPU have 8 processors. 
  202. ----------- 
  203. There are 61.86563040788292% free memory. 
  204. Last freeMemory = 203384 KB, now it is 180813 KB. 
  205. Last totalMemory = 380108 KB, now it is 380108 KB. 
  206. Last maxMemory = 1875378 KB, now it is 1875378 KB. 
  207. CPU have 8 processors. 
  208. ----------- 

 

檔案下載:39253835



本文也發表在其他空間。
CSDN : http://blog.csdn.net/shanelooli/article/details/8176938
ITeye : http://surmounting.iteye.com/blog/1724328
開源中國: http://my.oschina.net/shane1984/blog/88803
 


From:51CTO

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()