1. 程式人生 > >C#程式崩潰問題處理

C#程式崩潰問題處理

崩潰問題軟體在測試力度加大情況下,可能導致的記憶體不足及崩潰的問題可能快速暴露,針對這些問題可以通過下面方式解決,歡迎補充。1. 常用方式:A)類檔案中佔用記憶體較大的全域性變數,公共變數,類私有變數及類的例項用完之後手動設定為null或Dispose(),對區域性變數不需要置null,但區域性的例項需要Dispose或置null。B)佔用記憶體較大的變數或例項,在迴圈建立這些類或例項的地方適當進行置null或Dispose()後進行GC.Collect();2. 結合程式碼業務進行程式碼重構:A) 將主程式中的功能模組化,如封裝到動態庫中後,通過訂閱的方式不再進行主動的業務請求,降低主程序負擔。
B) 對程式中會頻繁重複使用的類如心跳,網路監控和彈出窗體,歷史資訊類等,避免重複例項化,通過定義全域性唯一靜態變數的方式即單例模式實現迴圈使用。C) 優化程式碼或重構結論,通常合理使用方式1基本可以解決大部分記憶體不足導致的崩潰問題,但垃圾回收有時效性等底層判斷機制,主動垃圾回收對於記憶體快速消耗的情況可能效果不好(比如進行1秒百萬級,或者只需要幾千個併發,在置null和GC之前程式就已經死掉,即垃圾回收不能根本解決程式記憶體消耗和效能問題,需要不產生垃圾或少產生垃圾),如果對程式效能和質量有更好的要求,結合兩種方式使用。

舉例:

 1.public void Dispose()
        {
            GC.Collect();
            GC.SuppressFinalize(this);

        }

      2.執行緒終止及清理

          _thread.Abort();

                _thread.DisableComObjectEagerCleanup();
                _thread = null;

3.更徹底的垃圾回收

/// <summary>
    ///設定執行緒工作的空間
    /// </summary>
    /// <param name="process">執行緒</param>
    /// <param name="minSize">最小空間</param>
    /// <param name="maxSize">最大空間</param>
    /// <returns></returns>
    [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
    public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
    /// <summary>      
    /// 釋放記憶體      
    /// </summary>      
    public static void ClearMemory()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        {
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
        }
    }

4.程式碼重構太寬泛,自行總結