亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用.NET Profiler API檢查并優化程序的內存使用

2019-11-18 12:03:27
字體:
來源:轉載
供稿:網友

  運行在 Windows 下面的程序分配內存以便表現所需要的、不同類型的資源。可以將這些分配當作用來封裝程序所需要的內存和其他任何資源狀態的對象。
  
  應用程序正確運行時,系統將釋放被使用的資源和內存,以便讓系統中的其他程序使用。但有時候,假如應用程序出現錯誤,則資源狀態或內存(或者這二者)都不會被正確釋放,這就會造成資源或內存泄漏。這些錯誤可能是很難識別的。垃圾回收器 (GC) 負責確保程序所分配的、用于完成任務的內存能夠在不需要開發人員關注它的情況下被釋放。
  
  對垃圾回收了解得越多,就越能更好地構造程序與之配合使用。.NET 中的對象是從稱為托管堆的一片內存中分配來的。堆被描述為托管是因為您向它申請內存后,垃圾回收器會負責執行清理工作。這似乎需要很多開銷,因為垃圾回收器必須跟蹤在 .NET 公共語言運行庫 (CLR) 中所分配的每個對象,但實際上它工作得很有效率。
  
  對象可以是小型對象,可以包含少量整數或更大的數據,也可以包含數據庫連接和很多狀態信息。對象可以是獨立的,也可以在內部包含或使用其他對象。GC 的工作是確定什么時候應當回收對象,以便釋放內存供其他程序使用,當它認為它已被裝滿時就會對可以刪除的對象作標記,然后從托管堆中將它們刪除。當垃圾回收器試圖分配新的對象、卻發現托管堆沒有更多的可用內存時,垃圾回收器就會認為它已被裝滿。GC 試圖分配內存但確定它已被裝滿時,它將嘗試清理已為您的應用程序分配的某些內存,以便為新對象騰出空間。
  
  GC 以略微不同的方式看待您的對象,并在決定什么時候回收它認為不再有用的對象時考慮到這些對象的差異。它這樣做的一個方法是,它有一組根對象,用來確定哪些對象可以被回收。假如對對象的引用大體上屬于如下分類中的某一個,則該引用就被看作是根:全局或靜態對象指針、線程的堆棧上的所有局部變量和參數對象指針、或包含托管堆中的對象的指針的任何 CPU 寄存器。假如對象的引用是根引用,那么它可能有或可能沒有與它關聯的、還會在垃圾回收后幸存的子對象。GC 首先找到根對象,然后沿著引用找到被根引用的其他對象,以便避免回收這些對象。
  
  如圖 1 所示,托管堆中有四個被分配的對象:(S)mall、(L)arge、(F)inalized 和 (R)eferenced。假設每個對象通過其主要特征(例如,小型對象都不會包含引用或其他組合)來標識自己。在堆中分配這些對象時,它們將相互緊鄰地放在內存中。我也有一個位于 (G)lobal 范圍的根引用,它包含對 Z 的引用。
  
 使用.NET Profiler API檢查并優化程序的內存使用(圖一)

  GC 開始垃圾回收時,它首先假設所有對象都是不必要的,直到這些對象被證實是需要的為止。對象基本上通過它“熟悉”誰或引用了誰,或誰引用了它或熟悉它,來證實自己是必要的。對于 GC,根引用為誰熟悉誰提供了起點。GC 從根對象開始沿著對象層次結構檢查引用情況,以確定對象是否是可到達的,或是否有可能被另一個對象使用。假如對象被證實是可到達的,則它不是該垃圾回收周期的處理對象。假如對象被證實無法從任何引用到達它,則 GC 將把該對象標記為可回收,然后它會被丟棄。GC 使用“標記和壓縮”方法,這意味著一旦 GC 確定對象是垃圾,則 GC 的另一個部分將刪除無法到達的對象,并將壓縮堆中的空間以確保分配將繼續非常快速地進行。
  
  GC 以代的方式看待回收周期中所涉及的對象。每當對象被認為是可到達的時,它就會被提升到下一代。這意味著,引用您的對象的對象越多,或您的對象的操作范圍越大,它的存活時間就越長。GC 當前最多有三代,從 0 到 2。第 0 代通常填充較小、短期使用的對象,并且回收它們的次數最多。這意味著,假如您有小型或很少使用的對象,則它們將被頻繁地回收。第 1 代和第 2 代是壽命更長和被更頻繁訪問的對象的儲存庫,因此被回收的頻率更低。GC 中一個基本假設是,您的程序中有更小、壽命更短的對象,更頻繁地清理它們對您有好處。理解這一點很重要,因為您設計系統的方式會對您使用多少內存和占用內存多長時間有巨大的影響,這是由于您的工作集將是大型的工作集。內存使用量越大,應用程序性能將降低得越多。
  
  85,000 字節以下的對象被認為是小型對象,并且從托管堆的主要部分直接分配。超過 85,000 字節的對象從托管堆的非凡部分(稱為大型對象堆)分配。托管堆對待小型和大型對象的方式有兩個主要差異。首先,小型對象在被壓縮時將移到托管堆內;而大型對象則不是這樣。其次,大型對象總是被當作第 2 代的一部分,而小型對象通常被當作第 0 代的一部分。假如您分配了很多短壽命的大型對象,這將造成第 2 代被更頻繁地回收。由于從第 0 代到第 2代越往后的回收成本越高,這將有損應用程序的性能。
  
  我想討論的垃圾回收的最后一個方面是終結 (finalization) 的概念。當對象被 GC 回收時,終結幫助開發人員釋放他們在其對象中使用的資源。對象需要實現 Finalize 方法才能完成該操作。當對象要被銷毀時,GC 將調用 Finalize 方法,以便答應對象清理它的內部資源和狀態。在 C# 和托管 C++ 中,Finalize 方法實際上偽裝在析構函數的語法 (~Object) 中,這里的 Finalize 方法與純 C++ 中的 Finalize 方法之間的重大差異是,在 C# 和托管 C++ 中,只有當 GC 清理對象時才調用該方法,而在純 C++ 的析構函數中,當對象脫離范圍時才會調用該方法。將 Finalize 方法添加到您的對象中意味著它將總是被 GC 調用,但要小心,因為將 Finalize 方法添加到對象中時,該對象將總是會在對第一代的垃圾回收后幸存下來。因此,所有終結對象的壽命會更長。由于試圖讓 GC 盡可能有效地執行清理,因此,只有當您有非托管資源需要清理或者在對象創建成本高昂的非凡情況下(對象池),才應當使用終結。
  
  讓我們返回圖 1 中的原始示例,該示例有一個托管堆,其中包含四個對象和一個根引用。假如在這個時候發生垃圾回收(這是由于這時不滿足啟動垃圾回收的條件,而開發人員手動干預造成的),結果是 (S)mall 對象將被當作垃圾回收。
  
  大型對象將在該垃圾回收后幸存下來,因為大型對象被指派為第 2 代。被終結的對象被 GC 注重到,并且將調用 Finalize 方法,但是對象本身仍將保留下來,直到進行下一次垃圾回收為止(在某些情形下可能會更長)。包含根引用 G 的對象將保留下來;因為它是根引用,是可到達的。
  
  現在,讓我們假設下一次發生的垃圾回收針對的是第 0 到第 2 代(可以通過調用 System.GC.Collect 方法并將 2 作為參數來完成該操作)。(L)arge 對象將在第 2 代清理期間被回收,而 (F)inalized 對象在第 0 代回收期間被回收,這是因為 Finalize 已被調用并且已在回收開始之前結束操作。只有包含全局引用的對象仍然存在,因而會在應用程序生存期內保留下來。
  
  良好的內存使用率
  GC 負責處理內存泄漏,但它不能防止內存保留。作為開發人員,您可以控制您的對象的生存期。假如可以減少應用程序的工作集,則性能將有所提高。假如您的應用程序被設計為有很多對象長時間存活,則可能會有內存泄漏。即使最后清理了內存,仍然會有損性能,所以知道您的對象存活多長時間是值得的。
  
  GC 可以提供很大幫助,但它只能處理我討論過的一種原始類型的泄漏。資源泄漏仍然是個問題,但假如將非托管資源包裝在終結類中,GC 仍然可以幫助您確保正確處置它們。最好對對象實現 Close 或 Dispose 方法,以便在使用完對象時資源可以盡可能早得到清理,而不用等待 GC 來清理它們(在您停止使用對象后,等待 GC 清理它們可能需要很長時間)。假如您對使用非托管資源的類實現了 Finalize,并且正在使用托管堆,則可以相當安全地避免真正的泄漏。當然,這并不意味著您應當讓應用程序的工作集很龐大,因為這仍然會有損性能。
  
  PRofiler API 概述
  為了說明應用程序使用了多少內存,以及對象存在了多久,我開發了一個稱為 MemoryUsage 的應用程序。MemoryUsage 有兩個不同的部分。第一部分編寫為 C# 應用程序,它將啟動要監視的進程,并在目標進程中設置一個環境變量,以指示 CLR 應當加載 .NET 分析器 (profiler)。第二部分編寫為基于 C++ 的 .NET 分析器,該分析器名為 MemProfiler,CLR 將通過環境變量中的信息加載它。.NET 分析器是使用作為 CLR 的一部分提供的 Profiler API 來編寫的,它答應分析器作為被監視的進程的一部分運行,并在發生某些事件時接收通知。當應用程序執行時,它為您提供各種通知。為了從 CLR 接收這些通知,您要提供一個 Profiler API 中指定的回調接口 (ICorProfilerCallback),然后,當各種事件發生時,CLR 將調用這個回調接口的方法(參見圖 2)。
  
 使用.NET Profiler API檢查并優化程序的內存使用(圖二)

  下面是需要注重的主要分析器回調方法:RuntimeSuspendStarted、RuntimeSuspendFinished、RuntimeResumeStarted、ObjectAllocated、ObjectsAllocatedByClass、MovedReferences、RootReferences 和 ObjectReferences。
  
  假如不熟悉 Profiler API,可以閱讀 Profiler.doc(位于 Visual Studio .NET 安裝目錄下面的 /FrameworkSDK/Tool Developers Guide/docs 文件夾中),來了解某些更深入的信息。
  
  使用分析器時有幾件事情要考慮到,包括線程安全和同步,以及分析器對性能的影響。Profiler API 實際上答應您將它作為 CLR 的一部分運行,這樣,因為多個線程將調用您的分析器,所以您必須知道存在同步問題。Microsoft 提供的 Profiler API 規范聲明:回調不會被序列化。這就需要由開發人員自己來正確保護他的代碼,方法是創建線程安全的數據結構,并在一旦需要防止多個線程并行訪問代碼時鎖定分析器代碼。
  
  我需要使對對象跟蹤系統以及在我

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜国产成人av电影男同| 久久精品99久久久久久久久| 日韩性生活视频| 国产婷婷97碰碰久久人人蜜臀| 国产91精品网站| 亚洲图片欧美日产| 日韩精品欧美激情| 欧美日韩福利电影| 日韩中文字幕在线| 一本一本久久a久久精品综合小说| 亚洲综合精品一区二区| 久久久91精品国产| 国产欧美日韩免费| 成人午夜黄色影院| 精品无人区太爽高潮在线播放| 国产在线观看91精品一区| 日韩成人av在线| 日韩在线观看视频免费| 国内成人精品一区| 国产精品成人国产乱一区| 国产在线日韩在线| 亚洲毛片一区二区| 精品日韩视频在线观看| 国产丝袜一区二区三区免费视频| 色综合天天综合网国产成人网| 久久99热精品| 亚洲黄色av网站| 中文在线不卡视频| 亚洲激情久久久| 国产精品爽爽爽| 久久久久久中文字幕| 国产精品久久久| 成人国产精品免费视频| www.亚洲免费视频| 精品自拍视频在线观看| 亚洲欧美中文在线视频| 在线视频精品一| 欧美午夜精品久久久久久久| 97精品在线视频| 亚洲xxxx在线| 欧美在线视频一区二区| 久久人人爽人人爽人人片av高请| 国产精品欧美久久久| 国产成人av在线| 色偷偷偷综合中文字幕;dd| 亚洲激情视频网站| 亚洲aa中文字幕| 欧美激情一级欧美精品| 国产精品旅馆在线| 国产午夜一区二区| 2020久久国产精品| 久久天堂av综合合色| 国产一区二区三区毛片| 91超碰caoporn97人人| 久久视频免费在线播放| 亚洲无限乱码一二三四麻| 色琪琪综合男人的天堂aⅴ视频| 国产福利精品在线| 国产精品一区二区三区在线播放| 日本久久久久久| 亚洲男人av在线| 伊人成人开心激情综合网| 亚洲男人天堂古典| 91在线高清免费观看| 亚洲午夜精品久久久久久性色| 久久久久久69| 欧美在线性视频| 国产日本欧美一区二区三区在线| 欧美精品少妇videofree| 国产成人a亚洲精品| 欧美国产日韩一区二区三区| 日韩欧美在线视频免费观看| 国产a∨精品一区二区三区不卡| 亚洲精品久久久久国产| 日韩精品高清在线观看| 欧美精品在线极品| 日韩高清不卡av| 久久亚洲影音av资源网| 91精品在线国产| 国产精品女视频| 色先锋资源久久综合5566| 亚洲香蕉av在线一区二区三区| 91wwwcom在线观看| 欧美性高潮床叫视频| 亚洲精品久久久久久久久久久久| 欧美色道久久88综合亚洲精品| 色狠狠av一区二区三区香蕉蜜桃| 欧美在线视频免费观看| 色悠久久久久综合先锋影音下载| 久久久久久国产精品三级玉女聊斋| 5566成人精品视频免费| 国产精品久久久久久av福利软件| 国产精品免费网站| 亚洲第一黄色网| 韩国v欧美v日本v亚洲| 亚洲欧洲免费视频| 精品电影在线观看| 亚洲人成网站色ww在线| 日本亚洲精品在线观看| 成人在线视频网站| 亚洲国产精品女人久久久| 欧美日韩在线视频一区二区| 国产精品极品尤物在线观看| 国产精品久久久久久久久久久不卡| 久久精品国产亚洲| 91中文精品字幕在线视频| 日韩视频免费看| 日韩在线视频免费观看| 亚洲一区二区自拍| 亚洲最大福利视频网| 亚洲嫩模很污视频| 亚洲人成网站在线播| 91视频88av| 色青青草原桃花久久综合| 亚洲国产日韩欧美综合久久| 日韩精品视频在线免费观看| 国产精品久在线观看| 欧美黄色小视频| 国产精品久久久久久久天堂| 国产成人精品视频在线观看| 成人激情视频网| 久热在线中文字幕色999舞| 亚洲激情电影中文字幕| 亚洲xxx自由成熟| 一本色道久久88综合亚洲精品ⅰ| 亚洲欧美一区二区三区情侣bbw| 中文字幕av一区二区三区谷原希美| 国产一区二区三区在线免费观看| 亚洲国产日韩欧美综合久久| 美日韩精品免费观看视频| 国产精品av电影| 欧美极品欧美精品欧美视频| 欧美激情国内偷拍| 国产这里只有精品| 国产成人精品一区| 国产日韩av在线| 久久深夜福利免费观看| 91久久国产精品| 26uuu日韩精品一区二区| 久久精品久久久久久国产 免费| 97在线观看视频国产| 久久视频这里只有精品| 国产福利视频一区二区| 国产精品免费在线免费| 在线看福利67194| 日韩av最新在线观看| 欧美中文在线字幕| 亚洲欧美国产视频| 日韩有码在线电影| 日韩av网址在线观看| 亚洲最新av在线网站| 91极品女神在线| 欧美一级电影在线| 国产一区深夜福利| 啊v视频在线一区二区三区| 国产91精品黑色丝袜高跟鞋| 精品自拍视频在线观看| 日韩在线免费视频观看| 欧美性精品220| 国产精品久久婷婷六月丁香| 在线播放国产精品| 日韩欧美极品在线观看| 国产成人精品亚洲精品| 久久九九全国免费精品观看|