日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
捉蟲記(二)GC導(dǎo)致的hang

本來第二篇早就該寫的,都準(zhǔn)備寫一個(gè)while(true)導(dǎo)致高CPU的問題,但是那個(gè)dump不知道跑到哪里了,害得我這段時(shí)間一直在找,這次的現(xiàn)象是,我正準(zhǔn)備出去泡個(gè)茶,突然業(yè)務(wù)經(jīng)理嗷嗷直叫(終于找到一個(gè)Bug,能不興奮么),一邊喊著處理不行了,一邊喊著趕緊重新啟動(dòng),我沒有吱聲,默默打開了性能計(jì)數(shù)器,看到處理程序的緩存的確是慢慢在增長(zhǎng)(這表示有積壓了),而處理速度降到非常低了,幾秒鐘處理一個(gè)(平時(shí)情況下哥的程序每秒鐘處理1000個(gè)Socket業(yè)務(wù)包是 沒有問題的),說到這里建議大家在自己的程序中也加入一些自定義性能計(jì)數(shù)器,這東西太好用,當(dāng)你把系統(tǒng)的一些值(比如說CPU的UserTime,還有Disk的DQL等)和你自己程序的一些值(比如說程序的緩存數(shù),處理的并行進(jìn)程數(shù)等)以文件方式記錄下來的時(shí)候,做個(gè)Excel圖表,這樣你就能對(duì)整個(gè)系統(tǒng)的性能有了一個(gè)很直觀的認(rèn)識(shí)。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺(tái)小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了濟(jì)源免費(fèi)建站歡迎大家使用!

1. 首先對(duì)程序有個(gè)大概的了解。

內(nèi)存1.2G,程序已經(jīng)運(yùn)行好幾天了。

 2. 既然是程序處理速度變慢,那么應(yīng)該看看CPU,線程池的消耗情況等

看看線程如何

***個(gè)命令!runaway(如果你是Web程序,那么這個(gè)命令對(duì)你講非常有用,但是這個(gè)From程序中,很多模塊用了那種該死的While(true),基本上這個(gè)命令我們得不到什么東西)

讓我們看看線程池是什么樣子吧(!tp這個(gè)命令可以看到線程池的情況):

Wowowo…,看這個(gè)cpu很高啊。

3. 我們看看我們的處理線程在看什么吧(!thread能看到所有的線程)。

。。。。。。

哦,注意那個(gè)32號(hào), GC Disabled,到這里我們大概猜測(cè)到是GC將處理線程阻塞掉了。

4.為了進(jìn)一步驗(yàn)證我們的猜測(cè),我們看看線程們到底在干什么吧(~*e !clrstack這個(gè)命令將打印所有線程棧,別著急,慢慢看,這個(gè)可以copy一下,貼到一個(gè)比較容易查看的編輯器里慢慢看)。為了看起來方便,我把打印結(jié)果copy出來用notepad++來看看,下面這個(gè)截圖,我做過處理,不然太多了,看不過來的。

5.我的處理函數(shù)是SchemeEntity.ProcessIMSIContext,并且開了十個(gè)線程處理(都是從線程池申請(qǐng),最多同時(shí)允許十個(gè)線程處理,如果超過是個(gè)線程都沒有處理完畢,那么分發(fā)線程將等待,新來的請(qǐng)求將在緩存隊(duì)列中,就是上面所說的那個(gè)正在慢慢增長(zhǎng)的的緩存),從這個(gè)可以看出,十個(gè)處理線程都在處理,那么我們看看他們都在干嘛,隨機(jī)挑選兩個(gè)37,38號(hào)看看吧。

6.哦,他們都在Monitor.Enter了,我們重點(diǎn)看一下32,切換過去吧(切換線程 ~線程號(hào)s)

7.哦哦~,看到了么,38,37都在等待,但是32在GC,我們看看32的堆棧吧,果然在GC。(kv顯示非托管棧)

看看托管的吧(!clrstack),哦哦~List.set_Capacity(32) ,這幾乎可以肯定是List在做copy的動(dòng)作,List將申請(qǐng)自己現(xiàn)在長(zhǎng)度的兩倍的內(nèi)存,應(yīng)該是這個(gè)長(zhǎng)度非常非常長(zhǎng),現(xiàn)有托管堆內(nèi)存不大夠,所以引起長(zhǎng)時(shí)間的GC了。

8.我們直接去看看這行代碼到底在干嘛吧,看到藍(lán)色噴霧了吧,那個(gè)地方可以對(duì)應(yīng)到代碼的行數(shù)(我的截屏上只有D:\I 這個(gè)樣子),屏幕太小了,我沒法直接貼出來。但是上面顯示是第64行。

我們可以看到iMsiDayCountDic是一個(gè)ConcurrentDictionary,但是用.Keys.Contains這個(gè)用法,額,我們可以想到, Key這個(gè)應(yīng)該是一個(gè)ICollection,然后再上面調(diào)用Contains應(yīng)該是新生成一個(gè)List,然后把Dict里面的key全部copy到這個(gè)List中,當(dāng)Dict里面的數(shù)據(jù)非常多的時(shí)候,在生成List的過程中,List需要每次不斷申請(qǐng)自身長(zhǎng)度的2倍,于是慢慢就GC了,整個(gè)處理被阻塞了,其實(shí)Dict有另外的方法了

我們修改成這個(gè)樣子,就OK了。

原文鏈接:http://www.cnblogs.com/StevenChennet/archive/2012/08/14/2638079.html


分享題目:捉蟲記(二)GC導(dǎo)致的hang
鏈接地址:http://m.5511xx.com/article/dhhigss.html