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.更彻底的垃圾回收

///


    ///设置线程工作的空间
    ///

    /// 线程
    /// 最小空间
    /// 最大空间
    ///
    [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
    public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
    ///       
    /// 释放内存      
    ///
      
    public static void ClearMemory()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        {
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
        }
    }

4.代码重构太宽泛,自行总结

你可能感兴趣的:(.NET)