• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 富客戶機應用程序的性能,第 2 部分: 堵住內存泄漏

    發表于:2008-06-23來源:作者:點擊數: 標簽:性能富客戶泄漏應用程序內存
    本系列的 第 1 部分 解決了基于 Eclipse 的富客戶機應用程序 性能 問題的幾個方面,包括 CPU、I/O 以及線程問題等。內存泄漏是導致性能問題的另一可能原因。本文闡述如何監視應用程序的內存使用,描述您在 開發 富客戶機應用程序中可能遇到的幾種內存泄漏,

    本系列的 第 1 部分 解決了基于 Eclipse 的富客戶機應用程序性能問題的幾個方面,包括 CPU、I/O 以及線程問題等。內存泄漏是導致性能問題的另一可能原因。本文闡述如何監視應用程序的內存使用,描述您在開發富客戶機應用程序中可能遇到的幾種內存泄漏,并介紹一些用于解決內存泄漏的技術。

    理解內存使用

    理解一個富客戶機(Rich Client Platform(RCP))平臺應用程序的完整內存使用會是一項腦力勞動。操作系統(OS)會指出應用程序耗費了多少內存,Java™ 平臺會指出您已經耗費了多少堆。操作系統匯報的內存使用情況總是高于可用堆大小。不幸的是,有時操作系統所報告的數目會遠遠 大于堆大小。對于堆分析的一個挑戰就是判斷這片 “黑暗空間” 中藏匿著什么。

    一般而言:進程使用的內存 = Java 堆 + 已編譯的本地代碼 + 字節碼 + 其他 / 本地

    很不幸,JVMS 根據其發行版本和供應商的不同,指示出的堆大小也不同。我所運行的一個 Java 應用程序就可以給出一些例子:Sun 1.6 JDK 報告堆大小為 32.7MB ,而操作系統報告為 48.6MB 私有字節,有 16MB 未作說明??偟膩碚f這還算不錯。已編譯代碼和字節碼是這 16MB 的一部分。用 IBM® 1.5 JDK 運行同一應用程序,堆加上類加載器和已編譯代碼總共是 39MB,而 OS 報告的大小為 45.8MB。

    一般而言,您可以把問題簡化為只關注 Java 堆。這對絕大多數 Java 應用程序而言已經足夠了,而且也可以讓應用程序做到最大程度的改進。如果還不夠,那么您應該使用操作系統工具檢查未被 Java 堆覆蓋的本地內存。

    差異分析(Differential analysis)

    處理內存使用問題中最為行之有效的一種手段是關注對象數目。舉例而言,如果要在某個郵件應用程序中顯示 50 條郵件消息,那么需要多少個 MailMessage 類的實例? 50,對嗎?那么郵件詳情或其他郵件域對象呢?如果切換了文件夾,顯示新的 50 條郵件消息,又將發生什么情況呢?您會擁有多少個對象:50 還是 100?

    一旦開始進行此類分析,您就會對實例數目大大超過期望數目這一常見情形感到驚訝。注意:在您收集堆轉儲之前,確保已經發生了垃圾收集行為,因為您不會想去考慮那些已經死亡的對象。一般情況下,我會在捕獲堆轉儲前做一個 System.gc() 操作。

    我并不想去描述司空見慣的一般性堆分析(請參閱 參考資料)。 相反,我將介紹差異分析(differential analysis),這是用于發現應用程序中內存泄漏的技術。

    它的基本思想很簡單:

    1. 得到一個堆轉儲。
    2. 在應用程序中多次做某件事(假設做 10 次)。
    3. 得到另一個堆轉儲。
    4. 比較兩個堆轉儲中應用程序對象的數目。

    這樣就可以構建所需應用程序對象集合。隨著泄漏的發現和處理,將泄漏到腳本的類添加到一個列表。這樣一來,不長時間就可以構建經常檢查的應用程序對象集合。

    單元測試

    我所用的另一個技術是寫單元測試,解析堆轉儲并對期望的域對象實例數目做斷言。比如說,您可以啟動應用程序,運行一個場景,得到一個對轉儲,接著做斷言。下面是一個例子:在郵件應用程序中發現一個內存泄漏,當該泄漏被處理后,我希望確定在以后的代碼改變中不會再發生該問題,于是為此構建了一個單元測試。這是一個資源使用 單元測試,如清單 1 所示:

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>