下面的一堆文字为了说明一件事情---.NET程序,内存溢出,如何控制.
========下面的一堆文字為了說明一件事情---.NET程序,內(nèi)存溢出,如何控制.飛秋2010下載官網(wǎng)主要是堆HEAP大小如何控制以及優(yōu)化.以減輕GC突發(fā)性負(fù)擔(dān)及這個時候服務(wù)器當(dāng)機(jī)的可能*.
對于大型程序,完全依賴GC是不現(xiàn)實(shí)的,飛秋2010下載官網(wǎng)對于高負(fù)載服務(wù)器,往往我們80%的堆都由自己的析構(gòu)函數(shù)接管,并輔助以自行設(shè)計的bufferpool接管堆釋放工作以達(dá)到HEAP可控的目的,減少CPU突發(fā)性負(fù)荷(CPU尖峰).雖然不像C那樣可以控制的那么完全,但是多多少少對OOM的發(fā)生起到抑制作用,深入下去可以完全避免OOM......好了IF性能和內(nèi)存開銷沒什么追求的 THEN 就不必看了飛秋2010下載官網(wǎng),,,,
ELSE
飛秋2010下載官網(wǎng)
GO
=====================
1.下個windbg,去baidu google一下即可.飛秋2010下載官網(wǎng)[www.freeeim.com]
2.sos.dll 這個框架自帶,只所以提下,是讓大家有搜索的關(guān)鍵字用.
3.泄露,對于.net程序,主要是堆泄露,對于大型服務(wù)器程序,需要嚴(yán)格排查OOM(內(nèi)存泄露)的問題,節(jié)約服務(wù)器GC開銷,內(nèi)存開銷,cpu開銷,提高支撐
4.配置環(huán)境變量 添加系統(tǒng)變量 _NT_DEBUGGER_EXTENSION_PATH?? C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727? 這個是為了能夠找到sos.dll
5.實(shí)戰(zhàn)
飛秋2010下載官網(wǎng)啟動windbg,開啟調(diào)試窗口,加載用于.NET調(diào)試所使用的sos.dll
.load sos
回車之后無任何顯示表示無任何錯誤,這個時候就可以運(yùn)行調(diào)試命令了.
需要說明的是.打頭的是windbg自帶命令,!打頭的命令是sos.dll調(diào)試命令.
?
顯示GC堆占用情況命令? !dumpheap -stat
大概會顯示這些:對象表,對象數(shù)量,每個對象內(nèi)存占用情況...等,如下:
---------------------
0:000> !dumpheap -stat
Statistics:
MT???????????? Count?????? TotalSize Class Name
7a787cc4?????????? 1????????????? 12 System.IO.FileSystemWatcher+FSWAsyncResult
7a75904c?????????? 1????????????? 12 System.Diagnostics.OrdinalCaseInsensitiveComparer
7a7575cc?????????? 1????????????? 12 System.CodeDom.Compiler.CodeDomConfigurationHandler
7a7571a8?????????? 1????????????? 12 System.Net.DefaultCertPolicy
7a75661c?????????? 1????????????? 12 System.Diagnostics.TraceListenerCollection
7a755834?????????? 1????????????? 12 System.Diagnostics.PerformanceCounterCategoryType
..................
68a66a88???? 227,559????? 12,743,304 System.Web.UI.WebControls.Literal
68a2f7fc???? 399,272????? 14,373,792 System.Web.UI.ControlCollection
68a92e2c???? 768,731????? 33,824,164 System.Web.UI.Control+OccasionalFields
68a884a0???? 641,952????? 38,517,120 System.Web.UI.LiteralControl
79124228???? 879,515????? 43,394,976 System.Object[]
790fa3e0?? 1,431,594???? 122,806,484 System.String
?
?
Total 10,389,625 objects, Total size: 463,313,540
----------------------
?
?
1,431,594 個 System.String對象 占用 122 MBytes
?
?
下面的一堆文字為了說明一件事情---.NET程序,內(nèi)存溢出,如何控制.
使用!dumpobj 可以查看System.String對象構(gòu)成情況
?
0:000> !dumpheap -type System.Web.UI.LiteralControl
?Address?????? MT Size Gen
023ea0a8 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023ea0e4 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023ea374 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023ea460 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023ea510 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023eab3c 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
........CONTINUED........
023fe31c 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023fe414 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023fe4c4 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
023fe500 68a884a0?? 60?? 2 System.Web.UI.LiteralControl
?
哦 基本上都是LiteralControl
?
隨便抓個控件的地址來分析!do命令
?
0:000> !do 023ea0a8
Name: System.Web.UI.LiteralControl
MethodTable: 68a884a0
EEClass: 68a88428
Size: 60(0x3c) bytes
GC Generation: 2
(C:/WINDOWS/assembly/GAC_32/System.Web/2.0.0.0__b03f5f7f11d50a3a/System.Web.dll)
Fields:
????? MT??? Field Offset?????????????????? Type?? VT???? Attr??? Value Name
790fa3e0? 4001fe0????? 4????????? System.String??? 0 instance 00000000 _id
790fa3e0? 4001fe1????? 8????????? System.String??? 0 instance 00000000 _cachedUniqueID
68a2af44? 4001fe2????? c?? ...em.Web.UI.Control??? 0 instance 023e8864 _parent
68a91070? 4001fe3???? 2c?????????? System.Int32??? 0 instance??????? 0 _controlState
68a85ea0? 4001fe4???? 10?? ...m.Web.UI.StateBag??? 0 instance 00000000 _viewState
68a2af44? 4001fe5???? 14?? ...em.Web.UI.Control??? 0 instance 023e8864 _namingContainer
68a273d0? 4001fe6???? 18???? System.Web.UI.Page??? 0 instance 01df4514 _page
68a92e2c? 4001fe7???? 1c?? ...+OccasionalFields??? 0 instance 00000000 _occasionalFields
68a2b378? 4001fe8???? 20?? ...I.TemplateControl??? 0 instance 00000000 _templateControl
68a14528? 4001fe9???? 24?? ...m.Web.VirtualPath??? 0 instance 00000000 _templateSourceVirtualDirectory
68a8bb48? 4001fea???? 28?? ...rs.ControlAdapter??? 0 instance 00000000 _adapter
68a3a8f8? 4001feb???? 30?? ...SimpleBitVector32??? 1 instance 023ea0d8 flags
790f9c18? 4001fda??? c70????????? System.Object??? 0?? shared?? static EventDataBinding
>> Domain:Value 000f0d00:NotInit 0011a720:01df0028 <<
790f9c18? 4001fdb??? c74????????? System.Object??? 0?? shared?? static EventInit
>> Domain:Value 000f0d00:NotInit 0011a720:01df0034 <<
790f9c18? 4001fdc??? c78????????? System.Object??? 0?? shared?? static EventLoad
>> Domain:Value 000f0d00:NotInit 0011a720:01df0040 <<
790f9c18? 4001fdd??? c7c????????? System.Object??? 0?? shared?? static EventUnload
>> Domain:Value 000f0d00:NotInit 0011a720:01df004c <<
790f9c18? 4001fde??? c80????????? System.Object??? 0?? shared?? static EventPreRender
>> Domain:Value 000f0d00:NotInit 0011a720:01df0058 <<
790f9c18? 4001fdf??? c84????????? System.Object??? 0?? shared?? static EventDisposed
>> Domain:Value 000f0d00:NotInit 0011a720:01df0064 <<
79124228? 4001fec??? c88??????? System.Object[]??? 0?? shared?? static automaticIDs
>> Domain:Value 000f0d00:NotInit 0011a720:01df0070 <<
790fa3e0? 4002211???? 34????????? System.String??? 0 instance 02238664 _text
?
這里如果發(fā)現(xiàn)某個值過大,就可以繼續(xù)深入使用!do + 地址 來進(jìn)入查看,以便找到OOM的根源..試試
?
0:000> !do 02238664
Name: System.String
MethodTable: 790fa3e0
EEClass: 790fa340
Size: 158(0x9e) bytes
GC Generation: 2
(C:/WINDOWS/assembly/GAC_32/mscorlib/2.0.0.0__b77a5c561934e089/mscorlib.dll)
String:??????
Fields:
MT Field Offset Type VT Attr Value Name
790fed1c 4000096 4 System.Int32 0 instance 71 m_arrayLength
790fed1c 4000097 8 System.Int32 0 instance 70 m_stringLength
790fbefc 4000098 c System.Char 0 instance 3c m_firstChar
790fa3e0 4000099 10 System.String 0 shared static Empty
>> Domain:Value 000f0d00:790d6584 0011a720:790d6584 <<
79124670 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 000f0d00:01d413b8 0011a720:01d44f80 <<
?
可以看到32位地址為02238664的是用于表格的結(jié)束標(biāo)志存儲.
?
使用!objsize進(jìn)一步命令查看對象內(nèi)的的對象構(gòu)成,精確到class名,自己可以試試了...還有很多命令可以查看Gen的回收情況,對于長時間未釋放的unmanaged資源也可以列表出來,這個時候可以do進(jìn)去,查看內(nèi)部結(jié)構(gòu),找到屬于哪段代碼之后,再返回自己的.cs代碼進(jìn)行邏輯調(diào)整....這樣的話,性能就很可觀了.同時可以盡量使用好CPU,而不必讓不必要的CPU時間犧牲框架和底層的代碼膠合層上面..永遠(yuǎn)要記住CPU時間是用戶的,不是你的!這樣,對內(nèi)存了解的多一些,你的程序就能跑的更快一點(diǎn),持久運(yùn)行的時間就更長一些...
?
通常,asp.net或者socket服務(wù)器運(yùn)行的時候,對內(nèi)存的要求是比較高的,如果內(nèi)存的性能我們不能去把握,真的很難再生產(chǎn)環(huán)境中超越LAMP體系架構(gòu).
我的觀點(diǎn)是,內(nèi)存---能節(jié)約,盡量節(jié)約吧,能高效利用,盡量高效利用!所以寫這篇帖子,非常非常膚淺的介紹了下,前后也就寫了20分鐘,因?yàn)橐X了...
總結(jié)
以上是生活随笔為你收集整理的下面的一堆文字为了说明一件事情---.NET程序,内存溢出,如何控制.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道67:体绘制讨论_不透明度
- 下一篇: VTK修炼之道68:体绘制讨论_梯度不透