C# 服务端 Sqllite数据库结构 引发类型为“System.OutOfMemoryException 的异常 处理总结

异常情况:

 1. 引发类型为“System.OutOfMemoryException”的异常。

 2. 存储空间不足,无法处理此命令。 (异常来自 HRESULT:0x80070008)

 3. Out of memory 

 

        服务端启动后,开始监听客户端的请求信息,但是服务端运行一段时间(目前约在1周左右),服务端Socket监听失效,记录下错误日志,含以上3个异常类型。服务端Soket监听客户端服务已经失效了,重启后正常运行。

        异常排查步骤:

                1、运行环境的内存以及存储空间都是很足的,问题原因只能是出在服务端程序上面。

                2、最开始怀疑是我们使用的SQLite数据库不稳定导致,经过代码排查,以及查询资料信息,唯一可信的是加上线程池 Pooling=true  ,加上后观察运行后,异常依然存在。

                3、没办法只能进行模拟重现问题,编写一个自动连接服务端的程序(开启多个测试程序),并随机发送访问服务端各个命令。捕捉异常信息,定位到异常抛出的问题行代码。

(1) 在 EasyFramework.LocalMachine.GetWmiObject(String className, WmiObjectMatch macth) 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 102
   在 EasyFramework.LocalMachine.GetNetworkInfo(String& ipv4, String& ipv6, String& macAddress) 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 72
   在 EasyFramework.LocalMachine.get_IPv4() 位置 F:\WorkSpace\Easy Framework\Source Code\Easy Framework\EasyFramework.Core\LocalMachine.cs:行号 179

(2)在 LandTop.DbSync.Helper.Common.Log.StartThread() 位置 F:\WorkSpace\ATOM Server\Branch\20171211_镜像服务\LandTop.DbSync.Helper\Common\Log.cs:行号 57
   在 LandTop.DbSync.Helper.Common.Log..ctor() 位置 F:\WorkSpace\ATOM Server\Branch\20171211_镜像服务\LandTop.DbSync.Helper\Common\Log.cs:行号 50

 好家伙,经过8个小时的模拟,终于逮到了。

原因:1,在客户端获取服务端IP命令时,用Win32_NetworkAdapterConfiguration 去读取系统IP,抛出了内存溢出异常。

           2.记录异常日志时,实例化Log对象太多了,系统垃圾回收并未来得及回收。

解决:1.利用Sqlite数据库,存储系统的IP地址,不用每次客户端请求就用Win32_NetworkAdapterConfiguration去读取;

          2.私有化公用Log类,进行统一的日志记录,千万不能多次实例化Log,以及类似的对象。

代码改造后,进行压力测试,目前已安全稳定运行。

总结:

1.服务端程序一定要进行,压力测试。

2.服务端程序一定要进行,压力测试。

3.服务端程序一定要进行,压力测试。

 

https://blog.csdn.net/lq491040758/article/details/85990165

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值