2022年2月28日 星期一

《回應》記憶體配置的空洞(fragments)與資源回收(Garbage Collection)


(純回應,原文已經找不到)

離開這個領域蠻久的,可能給不出什麼好建議。不過我常用的視訊轉檔軟體,有或沒有用到 GPU, 對效能的影響頗大,但顯然不是螢幕拷貝。它們的底層都是呼叫 ffmpeg 這套開源軟體,也許有什麼 API 可以在背景運用顯卡功能,不妨參考。

說到○○,挺巧的,約廿年前曾經替他的一套錄影軟體抓蟲,症狀也有些類似。當時他們為了進軍某專業領域,規格要求至少七天連續錄影不間斷。原來的消費型軟體,撐不到一天就會死當,驗收當然過不了關。診察後發現,過度頻繁的記憶體配置(malloc / free)持續在記憶體中製造空洞(fragments),累積到一定程度後,再也無法配置新的記憶體,系統就當機了。這是作業系統面對的基本問題之一,對策就是資源回收(Garbage Collection)。但顯然 Windows 沒遇過如此大量頻繁的記憶體回收,吃不消就掛點了。

對策很簡單,就是預先配置一塊足夠大的記憶體,比方說一百個 video frame,然後循環利用,儘量少呼叫系統的記憶體配置,等於是自己做記憶體管理的意思。對低階語言如 C,這樣做很有效果。

後來替另一家公司用 C# 語言開發的軟體抓蟲,一樣要求長時間運轉,問題也很類似。照說 .Net 的 GC 做得比 OS 強,沒事 Collect 一下,應該擋得住,但其實高強度、長時間依然受不了。我給了相同對策,也很有幫助,但高階語言需要更小心,因為很難知道底層實際如何運作。

像你的問題,如果不是自家程式,我懷疑或許和顯卡的韌體或驅動程式有關。
 

沒有留言:

張貼留言