日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

编写高性能 .NET 代码 第二章:垃圾回收

發(fā)布時(shí)間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写高性能 .NET 代码 第二章:垃圾回收 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

垃圾回收是你開(kāi)發(fā)工作中要了解的最重要的事情。它是造成性能問(wèn)題里最顯著的原因,但只要你保持持續(xù)的關(guān)注(代碼審查,監(jiān)控?cái)?shù)據(jù))就可以很快修復(fù)這些問(wèn)題。我這里說(shuō)的“顯著的原因”,實(shí)際上是我們對(duì)垃圾回收的理解和期望不正確導(dǎo)致的。在.NET開(kāi)發(fā)中,內(nèi)存的性能問(wèn)題和CPU的性能問(wèn)題一樣多,這就是單獨(dú)開(kāi)一章主要描述這個(gè)問(wèn)題的原因。

當(dāng)我們提及垃圾回收造成的開(kāi)銷(xiāo)時(shí),就會(huì)不如自主的緊張起來(lái),但一旦你理解它,就能很好的優(yōu)化你的程序。在后面文章里,你可以看到GC可以在大多數(shù)情況下,在堆處理上提供很好的性能,同時(shí)也能很好解決內(nèi)存分配與內(nèi)存碎片問(wèn)題。

Windows在非托管堆里用使用一個(gè)空閑列表來(lái)維護(hù)內(nèi)存分配。盡管它會(huì)想盡辦法來(lái)減少內(nèi)存碎片,但很多長(zhǎng)時(shí)間運(yùn)行的非托管代碼(本地代碼)的程序還是會(huì)碰上內(nèi)存碎片問(wèn)題。它會(huì)花很多時(shí)間在空閑列表里找到合適可分配地址。隨著內(nèi)存使用持續(xù)增長(zhǎng),不可避免的需要不斷重啟來(lái)解問(wèn)題。一些程序還會(huì)采用自定義內(nèi)存分配的方案(自己的內(nèi)存分配算法來(lái)接管malloc)函數(shù)來(lái)解決內(nèi)存碎片問(wèn)題。

.NET里的內(nèi)存分配通常在一個(gè)內(nèi)存段里進(jìn)行,這樣申請(qǐng)和回收的消耗會(huì)小很多。托管堆通過(guò)將最近申請(qǐng)的內(nèi)存對(duì)象放在一起,可以減少對(duì)空閑列表的遍歷,提升性能。

在默認(rèn)的分配過(guò)程中,通過(guò)代碼獲得對(duì)象的大小,然后在剩余的緩沖區(qū)里分配它。因?yàn)闆](méi)有競(jìng)爭(zhēng),只要有合適的空間就能很快的分配。一旦這要申請(qǐng)的空間這一段無(wú)法滿(mǎn)足,GC分配器會(huì)創(chuàng)建一個(gè)新的內(nèi)存段,在這上面開(kāi)始分配,之后的新的分配也都會(huì)在這新創(chuàng)建的內(nèi)存段里進(jìn)行。

這個(gè)過(guò)程中系統(tǒng)代碼(分配器)只會(huì)做一些簡(jiǎn)單的檢查。

我們來(lái)看一個(gè)簡(jiǎn)單的栗子:

private class MyObject{ ? ?
private int x; ?
?private int y; ? ?
?private int z; }
?
?private static void Main(string[] args){ ?
? ?var x = new MyObject(); }

首先,我們?cè)诜峙淦髑霸O(shè)置一個(gè)斷點(diǎn)

; Copy method table pointer for the class into;
ecx as argument to new() ; You can use !dumpmt to examine this value. mov ecx,3F3838h; Call newcall 003e2100;
Copy return value (address of object) into a register mov edi,eax

目前分配的是:

; NOTE: Most code addresses removed for formatting reasons. ; ; Set eax to value 0x14, the size of the object to; allocate, which comes from the method table mov eax,dword ptr [ecx+4] ds:002b:003f383c=00000014; Put allocation buffer information into edx mov edx,dword ptr fs:[0E30h]; edx+40 contains the address of the next available byte; for allocation. Add that value to the desired size. add eax,dword ptr [edx+40h]; Compare the intended allocation against the ; end of the allocation buffer. cmp eax,dword ptr [edx+44h]; If we spill over the allocation buffer, ; jump to the slow path ja 003e211b; update the pointer to the next free ; byte (0x14 bytes past old value) mov dword ptr [edx+40h],eax; Subtract the object size from the pointer to; get to the start of the new objsub eax,dword ptr [ecx+4]; Put the method table pointer into the ; first 4 bytes of the object. ; eax now points to new objectmov dword ptr [eax],ecx; Return to caller ret; Slow Path – call into CLR method003e211b jmp clr!JIT_New (71763534)

總之,這些涉及到方法調(diào)用的指令只有9個(gè),不是很難懂。
如果你使用了一些配置選項(xiàng),例如工作站模式,它不會(huì)因?yàn)楦?jìng)爭(zhēng)而導(dǎo)致分配變慢,因?yàn)镚C給每一個(gè)處理器(cpu內(nèi)核)分配了一個(gè)堆(段)。.NET在這些內(nèi)存分配地方做了一些復(fù)雜處理,但你不必深入了解它是如何工作,只需要知道如何優(yōu)化它就可以了。

我在本書(shū)開(kāi)頭就涉及到垃圾回收是因?yàn)榻窈笳鹿?jié)里很多東西都會(huì)涉及到它。正確的理解垃圾回收是幫助你實(shí)現(xiàn)好性能的基礎(chǔ)。

相關(guān)文章:

  • [翻譯]編寫(xiě)高性能 .NET 代碼 第一章:性能測(cè)試與工具 -- 選擇什么來(lái)衡量

  • [翻譯]編寫(xiě)高性能 .NET 代碼 第一章:性能測(cè)試與工具 -- 平均值 vs 百分比

  • [翻譯]編寫(xiě)高性能 .NET 代碼 第一章:工具介紹 -- Visual Studio

  • 編寫(xiě)高性能 .NET 代碼 第一章:工具介紹 -- Performance Counters(性能計(jì)數(shù)器)

原文地址:http://www.cnblogs.com/yahle/p/6550044.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的编写高性能 .NET 代码 第二章:垃圾回收的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。