- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- ASP.NET中怎么優(yōu)化站點(diǎn)構建托管資源
這篇文章將為大家詳細講解有關(guān)ASP.NET中怎么優(yōu)化站點(diǎn)構建托管資源,文章內容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
高性能ASP.NET站點(diǎn)構建托管資源怎么優(yōu)化
和CPU一樣,內存也是一個(gè)直接影響服務(wù)端性能的重要的硬件資源。
一般來(lái)說(shuō),如果服務(wù)端內存不足,從導致以下兩個(gè)問(wèn)題產(chǎn)生:
1.導致服務(wù)端把一些原本要寫(xiě)到內存中的數據,寫(xiě)到硬盤(pán)上面。這樣不僅僅加大了CPU和磁盤(pán)的I/O操作,同時(shí)也延長(cháng)了讀取這些數據的時(shí)間。
2.阻止了一些緩存策略的使用。
對于內存不足,一直最快最直接的方式就是去買(mǎi)內存條加在上面。但是這樣存在一個(gè)隱患的問(wèn)題就是:如果加了新的內存之后,服務(wù)端又面臨內存不足的問(wèn)題,我們不可能無(wú)止境的加內存條,那么我們就必須從站點(diǎn)本身來(lái)解決這個(gè)問(wèn)題,例如從服務(wù)端的配置,對站點(diǎn)的代碼進(jìn)行分析,優(yōu)化。
托管資源優(yōu)化
對于托管資源,相信大家并不陌生了,簡(jiǎn)單的說(shuō)就是:在C#的托管堆上面創(chuàng )建的資源,或者說(shuō)通過(guò)new產(chǎn)生的對象。
在深入講解之前,我們首先來(lái)看看“對象的生命周期”
對象的生命周期
當我們用new關(guān)鍵字創(chuàng )建了一個(gè)對象的時(shí)候,這個(gè)對象就被分配到CRL托管堆上面。這個(gè)托管堆是在內存中的。而且這個(gè)分配對象空間的速度是非常的快的,因為每次都是在托管堆的最后面劃出一定的空間來(lái)給這個(gè)對象,不用去堆上面需找合適大小的空間。
如果當托管堆準備為一個(gè)對象分配空間的時(shí)候,發(fā)現托管堆上面的空間太小了,不足以分配給這個(gè)新的對象,那么CLR就開(kāi)始運行垃圾回收機制了。我們知道:垃圾回收機制會(huì )把那些在托管堆上面沒(méi)有了引用指向的那些對象都清理掉,同時(shí)也會(huì )把托管堆上面現存的對象進(jìn)行壓縮。
但是有一點(diǎn)需要清楚:如果此時(shí)進(jìn)行了垃圾回收的時(shí)候,清除了一些沒(méi)有用的對象,但是只有在下一次來(lái)回收進(jìn)行的時(shí)候,上次垃圾回收清除的對象才真正的從內存中消除(此時(shí),還有一些“對象復蘇”等話(huà)題就不在贅述)。
高性能ASP.NET站點(diǎn)構建托管資源怎么優(yōu)化
下面就來(lái)講述一些垃圾回收的話(huà)題。
對象的“代”
在CLR進(jìn)行垃圾回收的時(shí)候,垃圾回收器回去托管堆上面去檢查對象是否可以被回收,這個(gè)檢查過(guò)程是非常消耗資源的。為了避免每次垃圾回收都要便利托管堆上面的所有對象,CLR給把托管堆上面的對象用“代”來(lái)劃分,例如,第一代,第二代。然后每次便利掃描托管堆的時(shí)候,就去掃描某一個(gè)“代”中的對象,這樣性能就好點(diǎn)。
在托管堆上面,可以把對象分為三個(gè)“代”:0代,1代,2代,僅此這三個(gè)代。每個(gè)對象都是從0代開(kāi)始的。一個(gè)對象每經(jīng)歷一次垃圾回收,并且這個(gè)對象還在使用中,那么這個(gè)對象的“代”就會(huì )增加1代。例如,如果在0代的對象,經(jīng)歷了一次垃圾回收之后,他的代就是1代,如果是1代的對象,最后就會(huì )變?yōu)?代。如果對象本身已經(jīng)是2代了,不管經(jīng)歷多少次垃圾回收(如果對象一直在使用),那么這個(gè)對象還是2代。
在CLR垃圾回收中有句話(huà)要記得:“‘代’數越大,被回收的可能性就越小”.而且一些性能優(yōu)化就是根據這個(gè)進(jìn)行的。
每次CLR在進(jìn)行垃圾回收的時(shí)候,都會(huì )優(yōu)先的去掃描第0代的對象,所以,一些新的,臨時(shí)使用的對象可以被立刻的清除。相比而言,垃圾回收器掃描第1代對象的頻率就沒(méi)有第0代強,掃描第2代對象的頻率就更低了。所以說(shuō):對象存活的時(shí)間越長(cháng),就越難被回收,而且一直占據CLR的內存資源。
還有有點(diǎn)需要注意的就是:如果CLR決定要掃描了第1代了,同時(shí)也用掃描第0代的對象,同時(shí)如果,CLR掃描第2代對象,那么第0代,第1代對象都會(huì )被掃描。
所以,從這里可以得出:我們盡量避免把原本需要立刻回收的的對象變?yōu)殚L(cháng)期存活的對象。通俗點(diǎn)說(shuō)就是:如果一個(gè)對象本來(lái)已經(jīng)存活在0代的,然后用完就回收的,我們不要讓這個(gè)對象一直存活到第1代,甚至第2代。在編程上面基本就是這樣的實(shí)現思路:盡可能晚的實(shí)例化對象,盡可能早的釋放對象。
大對象堆(LargeObjecetHeap)
我們之前講述了“堆”的一些話(huà)題,CLR除了上面的一般的堆(一般的new對象分配空間的那個(gè)堆),CLR中還存在另外的一個(gè)堆:專(zhuān)門(mén)用來(lái)放置那些大于了85k的對象的堆,大對象堆。
如果new一個(gè)對象的時(shí)候,這個(gè)對象的大小超過(guò)了85k,那么CLR就會(huì )把這個(gè)對象放在LOH上面。如果此時(shí)LOH的空間不足了,那么CLR就會(huì )啟動(dòng)垃圾回收器去掃描LOH堆和那個(gè)一般堆上面的第2代對象,我們之前說(shuō)過(guò),如果掃描第2代對象,就同時(shí)掃描第1代,第0代,那么實(shí)際相當于掃描了整個(gè)托管堆,性能影響可想而知。
而且不想之前那個(gè)一般堆,在LOH上面的對象被垃圾回收器回收之后,上面的大對象是不會(huì )被壓縮的,那么LOH這個(gè)堆上面就可能存在一些“空間碎片”,然后分配新的大對象的時(shí)候,就要找空間,甚至進(jìn)行碎片的整理,大家可以聯(lián)想一下我們電腦的磁盤(pán)碎片整理。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站