這兩天做socket
通訊,伺服器端和客戶端都做好之後進行了一些簡單的壓力測試。發現伺服器端的記憶體不斷上公升,
1000
個併發,1秒
2個128b
的包,30
秒程序突破
100m。
像我這種對gc
處理,記憶體釋放一竅不通的「處」,只好找資料了。
資料:.net 中非同步
socket
傳送資料時碰到的記憶體問題
根據資料顯示,可能是new
了太多的socketasynceventargs或者 new
了太多的
byte
造成的,我想了想我的**裡好像迴圈
new了很多的socketasynceventargs和byte
,主**暫時不想改,就先按照資料的例子來做個測試。
例子1:
console.writeline("press any key to start.");
console.readkey();
for (int i = 0; i < 1000000; ++i)
system.threading.thread.sleep(100);
}console.readline();
測試結果,發現記憶體跳躍很厲害,8m-12.5m
之間。
例子2:
console.writeline("press any key to start.");
console.readkey();
for (int i = 0; i < 1000000; ++i)
gc.collect(2); //這句話還不知道啥意思
system.threading.thread.sleep(100);
}console.readline();
測試結果:這次加上gc
**,程式變的穩定了起來。
8.5m
左右,基本不跳動。
後來我想,為什麼要new
這麼多次呢?為什麼我不能
new乙個,然後其他都去複製過來?
例子3:
public socketasynceventargs _s =new socketasynceventargs();
public void test1()
gc.collect(2);
system.threading.thread.sleep(100);
}console.readline();
}
測試結果:記憶體始終維持在1.7m
,非常穩定。
其實例子3
我還是比較擔心的,怕有什麼意外發生,或者違反什麼規則。希望有大牛看到能夠及時點評!
然後byte
我也進行了一次測試。
public byte _b = new byte[1024 * 1024 * 2];
public void test2()
system.threading.thread.sleep(10);
}console.readline();
}
最終**如下:
測試結果,每次有new
一次的話,不僅程式執行很慢,而且內存在
10m左右。
提前new
一次的話,程式執行大概是原來的
100倍以上,記憶體僅佔
1.9m。
不信邪的同學可以測試一下,很可怕的。 :)
最終經過多次細節上的優化,現在我的server
端已經穩定下來了。對此方面比較專業的大牛,請指導一下!
由於這是工作**,所以不提供原始碼,抱歉!
壓力測試工具:強大的tcpserver
壓力測試工具及原始碼(附突破連線限制的方法和工具)
優化記憶體的一些小細節
摘自 1.迴圈中物件占用記憶體大 這個問題常見於迴圈次數較大,迴圈體生成的物件占用記憶體較大的情景。例子 我需要10000個演員來打仗 1 2 3 4 for int i 0 i 10000 i 該迴圈內產生大量的臨時物件,直至迴圈結束才釋放,可能導致記憶體洩漏,解決方法和上文中提到的自動釋放池常見...
MySQL的優化細節
結合dbms 資料庫管理系統 實現有效儲存 高效訪問。減少資料冗餘,避免維護異常,節約儲存空間。需求分析 邏輯設計 物理設計 考慮資料庫系統的差異 維護優化 新需求建表,索引,拆分 理清楚實體及實體之間的關係 一對一,一對多,多對多 實體包含的屬性,哪些屬性 或者屬性組合 可以唯一標識乙個實體 如果...
ySQL的優化細節
結合dbms 資料庫管理系統 實現有效儲存 高效訪問。減少資料冗餘,避免維護異常,節約儲存空間。需求分析 邏輯設計 物理設計 考慮資料庫系統的差異 維護優化 新需求建表,索引,拆分 理清楚實體及實體之間的關係 一對一,一對多,多對多 實體包含的屬性,哪些屬性 或者屬性組合 可以唯一標識乙個實體 如果...