none
For迴圈重覆執行導致記憶體不足 RRS feed

  • 問題

  • 各位先進好!小弟這裡有一個問題想要請教,

    我現在需要將For迴圈重覆執行來讀取數值,

    但是記憶體會隨著時間越久(記憶體約1分鐘增加0.01),

    最終會導致記憶體不足,在此之前我也有從網路與MSDN

    論壇查詢過相關問題,基本上都是說要做記憶體釋放GC.Collect,

    但是我嘗試將程式加入GC.Collect結果也還是一樣,

    想請問各位先進還有甚麼方法可以解決這個問題的嗎?

    下面是我測試的程式:

    namespace CNCDataCollect
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                Polling();
            }
            private void Polling()
            {
                System.DateTime lastTime = System.DateTime.Now;
                do
                {
                    timer1.Enabled = true; //啟動timer
                    Thread.Sleep(2000); 
                }
                while (System.DateTime.Now == lastTime);
            }
          
            private void CompareM1Sta()
            {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine(i); //暫定讀取動作
                }
            }
            private void timer1_Tick_1(object sender, EventArgs e)
            {
                Thread Th1 = new Thread(CompareM1Sta);
                Th1.IsBackground = true;
                Th1.Start();
            }
        }
    }
    

    2021年3月17日 上午 07:23

解答

所有回覆

  • https://tlcheng.wordpress.com/2013/09/28/vbnet-webbrowser-control-%E5%A3%93%E6%8A%91%E8%A8%98%E6%86%B6%E9%AB%94%E8%86%A8%E8%84%B9/

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2021年3月17日 上午 11:32
  • 你所附的code,是每2秒,建立一個新thread,一直跑下去,便創立了很多thread。


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2021年3月17日 下午 12:46
  • 需要很多執行緒的程式可以考慮使用ThreadPool, 請參考:

    ThreadPool 類別(https://docs.microsoft.com/zh-tw/dotnet/api/system.threading.threadpool?view=net-5.0)


    • 已編輯 tihsMVP 2021年3月17日 下午 02:18
    • 已標示為解答 seanhua 2021年3月26日 上午 08:07
    2021年3月17日 下午 02:17
  • 我要說的應該和記憶體沒太大關係。

    但是我看到你用 Forms.Timer , 在 Tick event 委派函式內產生 thread。我的建議是那不如用 System.Timers.Timer System.Threading.Timer 比較乾脆。

    還有,在 UI 執行緒使用 Thread.Sleep 是會讓 UI 停止回應的。

    至於記憶體的問題,老實說從你貼的程式碼還真看不出甚麼來,我猜想你真實的環境是某有呼叫廠商的 API? 建議你詢問原廠商該 API 在呼叫後是否還需呼叫特定的釋放記憶體函式或甚麼之類的。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/



    2021年3月18日 下午 07:40
    版主
  • https://tlcheng.wordpress.com/2013/09/28/vbnet-webbrowser-control-%E5%A3%93%E6%8A%91%E8%A8%98%E6%86%B6%E9%AB%94%E8%86%A8%E8%84%B9/

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    心冷熱情熄先進 您好!感謝您的回覆,這個記憶體釋放的方法我有測試過的確可以釋放記憶體,

    但是我這台電腦的記憶體還是會快速的增長!

    2021年3月23日 上午 01:16
  • 需要很多執行緒的程式可以考慮使用ThreadPool, 請參考:

    ThreadPool 類別(https://docs.microsoft.com/zh-tw/dotnet/api/system.threading.threadpool?view=net-5.0)


    this 先進您好!我後來有將程式修改為ThreadPool的方式下去執行,

    以減少執行緒重覆建立的情形,但是電腦的記憶體還是增長

    2021年3月23日 上午 01:19
  • 各位先進大家好!不好意思這麼晚才回覆大家!

    小弟在這段時間除了測試各位先進提供的方法之外,

    也做了一個測試,就是把相同程式放在不同的電腦執行,

    結果我目前正在使用的那台電腦執行程式執行2個小時

    記憶體依舊會隨著時間越久而變大,

    反而我新的電腦執行程式2個小時記憶體不會有什麼增長,

    所以目前我傾向電腦環境的問題造成的,

    不知道有沒有先進有遇過這種問題?感謝


    • 已編輯 seanhua 2021年3月23日 上午 01:40
    2021年3月23日 上午 01:34
  • 我要說的應該和記憶體沒太大關係。

    但是我看到你用 Forms.Timer , 在 Tick event 委派函式內產生 thread。我的建議是那不如用 System.Timers.Timer System.Threading.Timer 比較乾脆。

    還有,在 UI 執行緒使用 Thread.Sleep 是會讓 UI 停止回應的。

    至於記憶體的問題,老實說從你貼的程式碼還真看不出甚麼來,我猜想你真實的環境是某有呼叫廠商的 API? 建議你詢問原廠商該 API 在呼叫後是否還需呼叫特定的釋放記憶體函式或甚麼之類的。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/



          

    Bill Chung 先進您好!我想請教您我看過了System.Timers.Timer

    與System.Threading.Timer的介紹,但是我有一個疑問

    是它與我程式中用的Forms.Timer有何不同?

    您有提到在UI執行緒使用Thread.Sleep會讓UI停止回應,

    因為這個是我上網找到的範例程式,

    在執行緒的程式中是否不能使用Thread.Sleep呢?

    記憶體的問題有詢問過廠商,答案依舊是更換新版本!

    2021年3月23日 上午 01:35
  • 工作管理員 詳細資料

    在欄名滑鼠右鍵 勾選執行緒

    看執行緒數量,如果執行緒數量持續增加,記憶體增加是正常的,要到執行緒關閉與增加平衡後,記憶體才會抖動。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2021年3月23日 上午 11:37
  • 那你的2台電腦,分別是什麼OS、安裝了什麼的程式,分別硬件是什麼,型號是什麼

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2021年3月24日 上午 10:45
  • 那你的2台電腦,分別是什麼OS、安裝了什麼的程式,分別硬件是什麼,型號是什麼

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


          Ken Lin先進您好!

         記憶體會增長的電腦

         系統為Win7 64位元

         CPU Intel I5 3代

         安裝VS2015.Labview.Oracle

         硬碟為SATA500G

         記憶體為DDR3 4G

         記憶體不會增長的電腦 

         系統為Win7 64位元

         CPU Intel I5 3代

         安裝VS2015.Labview.Oracle

         硬碟為SATA500G

         記憶體為DDR3 4G

         基本上看起來是一樣的,

         但是我有觀察到記憶體增長的那台電腦本身系統執行的速度有點慢,

         例如:安裝或移除VS2015會Lag

         不知道是電腦硬體還是作業系統有問題,

         目前還沒有做測試  

    2021年3月25日 上午 10:14
  • 各位先進好!我今天找出記憶體增長與不會增長差異了,

    我觀察了兩台系統管理員的standardCollector.Svrvice.exe

    所佔的記憶體空間,不會增長電腦的standardCollector.Svrvice.exe

    幾乎不會增長,

    記憶體增長電腦的standardCollector.Svrvice.exe每秒都以幾kb的速度再增加,

    時間一久後,就會反映在系統管理員的記憶體使用量上面,

    我目前的作法就是將VS2015的診斷功能給關閉,

    Tools->Debugging->General->Enable Diagnostic Tools while debugging

    這個選項給關閉,目前測試起來記憶體用量很穩定,並不會增長

    2021年3月26日 上午 08:06
  • 你執行的,是compile為debug mode?

    不過,關閉能解決,便好了


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2021年3月26日 上午 10:18
  • 你執行的,是compile為debug mode?

    不過,關閉能解決,便好了


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for .NET (2003-2017)
    Microsoft rMVP
    My MSMVP Blog
    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


         Ken Lin 先進您好!我執行的是Debug Mode喔,無誤!
    2021年4月1日 上午 06:40