和架構部門的同僚一起,經過valgrind大量的測試和驗證,并沒有發現有确切的記憶體洩露的代碼段。對于C和C++程式,出現記憶體增長,可能我們很自然的就去記憶體洩露方面去思考,有時候,這種方向可能不一定對。
在解決這個問題的過程中,生成上又出現了另外一個記憶體增長的問題。這次的現象很明顯,就是一個程序,能清晰的看到記憶體在不斷的增長,程序停止後,記憶體就直接釋放,下次還是會緩慢增長。大家的思路就是檢查下代碼,看看有沒有記憶體洩露,由于程式中沒有使用new 和 malloc的地方,是以不存在直接的記憶體操作。這樣就比較難定位記憶體洩露,并且valgrind的資訊,也看不出來有記憶體洩露。後來經過分析可能是程式是通過while(true)的寫法來對資料進行循環掃描處理的,而在這個中間,會把對記憶體資料庫的操作資訊,存放在Session中,由于沒有調用清理session的接口,是以session中的資料結構越來越大,是以才導緻記憶體不斷的增長。後來修改了代碼,調用了清理Session的接口後,記憶體恢複正常。
有了這個問題的思路,我又回過頭來看之前遇到的這個問題:
1、這個問題出現的情況,是資料庫存在異常的情況
2、看日志,是不斷的去連接配接,可能是資料庫連接配接沒釋放
3、如果資料庫連接配接沒釋放,會不會Session資料不斷地增加呢
如何驗證這個問題,是一個比較困難的事情,我試了下,當資料庫抛出異常,對資料庫連接配接不做釋放,接着調用的情況,此時會出現記憶體增長的情況。可以确定資料庫連接配接不釋放,session中結構會不斷增長。
但是至于資料庫連接配接為何釋放不了,這個問題,還需要架構部門的同僚進一步分析。
有時候,換個思路,問題也就很容易解釋清楚了。
come on !