這篇文章給大家介紹如何池化.NET內(nèi)存流以解決大內(nèi)存堆分配問題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及VR全景等,在成都網(wǎng)站建設(shè)、全網(wǎng)整合營銷推廣、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。
與很多依賴于標(biāo)記-清理的垃圾回收器的語言一樣,C#也會在頻繁分配內(nèi)存或分配大塊內(nèi)存時(shí)產(chǎn)生性能問題。微軟必應(yīng)的高級軟件開發(fā)工程師Ben Watson,就曾在使用MemoryStream類的時(shí)候遇到了這種問題。在他的Writing High-Performance .NET Code一書中,他寫道,
在某個(gè)飽受大量LOH(大對象堆)分配之苦的應(yīng)用中,我們發(fā)現(xiàn)如果將某種類型的對象保存在池中,就能解決99%的LOH問題。這個(gè)對象就是我們在網(wǎng)絡(luò)中序列化和傳輸位的MemoryStream。為了避免碎片,我們保存了一個(gè)MemoryStream對象的隊(duì)列,盡管實(shí)際實(shí)現(xiàn)要復(fù)雜得多,但理論上來說基本如此。每次MemoryStram對象釋放的時(shí)候,就將其放回池中以供復(fù)用。
在此之后微軟將他的代碼放到了Microsoft.IO.RecycableMemoryStream
類中。該類是傳統(tǒng)的內(nèi)存流的代替品。在最簡單的情況下,可以用manager.GetStream
代替new MemoryStream
。
注意這個(gè)流管理器是線程安全的,并且應(yīng)該在進(jìn)程中一直使用。
《華盛頓郵報(bào)》作者Ben Watson說,這個(gè)工具被優(yōu)化后要執(zhí)行如下部分:
利用合并的緩沖區(qū)消除大對象堆分配
避免內(nèi)存泄漏,線程池?fù)碛羞吔?/p>
避免內(nèi)存碎片
提供出色的可調(diào)試性
提供性能指標(biāo)跟蹤
關(guān)于如何池化.NET內(nèi)存流以解決大內(nèi)存堆分配問題就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。