資源描述:
《內(nèi)存泄漏檢查》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、內(nèi)存泄漏檢測(cè)方法?對(duì)于不同的程序可以使用不同的方法來進(jìn)行內(nèi)存泄漏的檢查,還可以使用一些專門的工具來進(jìn)行內(nèi)存問題的檢查,例女口MemProof、AQTime、Purify>BundsChecker等。?也可以使用簡(jiǎn)單的辦法:利用Windows自帶的Perfmon來監(jiān)控程序進(jìn)程的handlecount、VirtualBytes和WorkingSet3個(gè)計(jì)數(shù)器。HandleCount記錄了進(jìn)程當(dāng)前打開的句柄個(gè)數(shù),監(jiān)視這個(gè)計(jì)?數(shù)器有助于發(fā)現(xiàn)程序是否存在句柄類型的內(nèi)存泄漏;VirtualBytes記錄了程
2、序進(jìn)程在虛擬地址空間上使用的虛擬內(nèi)存的大小,VirtualBytes—*般總大于程序的WorkingSet,監(jiān)視VirtualBytes可以幫助發(fā)現(xiàn)一些系統(tǒng)底層的問題;WorkingSet記錄了操作系統(tǒng)為程序進(jìn)程分配的內(nèi)存總量,如果這個(gè)值不斷地持續(xù)增加,而VirtualBytes卻跳躍式地增加,則很可能存在內(nèi)存泄漏問題。堆棧內(nèi)存泄漏?堆棧空間不足會(huì)導(dǎo)致在受托管的情況下引發(fā)StackOverflowException類型的異常,線程泄漏是堆棧內(nèi)存泄漏的其中一種。線程發(fā)生泄漏,從而使線程的整個(gè)堆棧發(fā)
3、生泄漏。?如果應(yīng)用程序?yàn)榱藞?zhí)行后臺(tái)工作而創(chuàng)建了大量的工作線程,但卻沒有正常終止這些線程,則可能會(huì)引起線程泄漏。一個(gè)堆棧內(nèi)存泄漏的例子:privatevoidbuttonl_Click(objectsender,EventArgse){//循環(huán)啟動(dòng)多個(gè)線程for(inti=0;i<1500;i++){Threadt=newThread(newThreadStart(ThreadProc));t.Start();})staticvoidThreadProc()Console.WriteLine("T
4、hread#{0}n,Thread.CurrentThread.ManagedThreadId);//阻塞直到當(dāng)前線程結(jié)束Thread.CurrentThread.Join();Foral應(yīng)用程序中發(fā)生了無法處理的異常0如果單擊杠繼續(xù)”>應(yīng)用程序?qū)⒑雎源隋e(cuò)誤并嘗試?yán)^續(xù)。如果單擊杠退出汀,應(yīng)用程序?qū)⒘⒓搓P(guān)閉。線程未能啟動(dòng)■°繼續(xù)C)I退出?I糜勰寵瞬試而不是此對(duì)話框的詳細(xì)信息'?1?.人??4??4???人??人??丄????人??人?IIm1?A*??A??1??1?人???A??4??1te一
5、在在在在在SSym.Threading.ThreadstartExcgption:線程未能啟動(dòng)。>System.ISystem.Threading.Thread.StartinternalCEPrincipalprincipal丿:System.Threading.Thread.Start()MemoryLeakTes11?Form1?bu11onl_C1ick(Objectsender.EventArgs-內(nèi)部異常罐棧跟蹤的結(jié)尾―System.Windows?Forms?Control.OnC
6、lickCEventArgse)System.Windows?Forms?Button.OnClick(Eventkrg;£e)利用Perfmon檢測(cè)線程堆棧泄漏?默認(rèn)堆棧大小為1MB,因此如果應(yīng)用程序的PrivateBytes不斷增大,同時(shí).NETCLRLocksAndThreads屮的#ofcurrentlogicalThreads也相應(yīng)地增大,那么就很可能是發(fā)生了線程堆棧泄漏。?可以利用Perfmon來判斷是否存在內(nèi)存泄漏現(xiàn)象。添加計(jì)數(shù)器r便用本地計(jì)算機(jī)計(jì)數(shù)量◎a從計(jì)smwitiRBw
7、
8、8F38CSD4F0BE480曹能對(duì)象(Q):
9、Proc?siC所育計(jì)數(shù)器Q)a從列衰啊計(jì)Ma)Pt(?FileBytesPeekPoolNonpydBytesPoolPt
10、gicalThreads也相應(yīng)地增大,則可判斷程序發(fā)生了線程堆棧泄漏。用CLRProfiler定位線程泄漏代碼(MtnAMt%.woavxj)―(imvw>