计算机内存不足,需要关闭 SQL Server Windows NT, Winform程序中大多内存是Font占用

weixin_38066448 2017-10-19 01:11:38
1,写了一个程序,有使用到SQL Server LocalDB,在程序长时间运行后,系统弹出提示:”计算机内存不足“,提示需要关闭SQL Server Windows NT。然后我的程序和SQL Server Windows NT的进程就都被杀掉了。然而此时任务管理器中总使用内存只有约1.5G(总内存4G),请问可能是什么原因?另外值得一提的是,我把虚拟内存改大,程序就可以多正常运行一段时间。而程序崩溃时,好像任务管理器中的“已提交”部分刚好达到虚拟内存的设定最大值。
2,怀疑是我的程序导致内存泄漏,然后进行内存监视,发现程序使用的共计约180M内存中,约有115M都是Font的字体类型。然后我也检查了程序,发现没有地方进行了大量的字体构造。请问这个可能是什么原因?
...全文
47 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38092208 2017-11-27
  • 打赏
  • 举报
回复
问题已经解决。
最初发现引用的一个类库里面会创建比较多的FontFamily(之前没注意到,-_-||),现在整个程序占用内存只有70M左右了。
但程序运行时间一长,还是会出现内存不足的问题,任务管理器中查看程序内存并没有明显增加,但系统可用内存却在逐渐变少;
查看程序句柄数,发现句柄数在程序运行中持续飙升,1小时,句柄数从约1500飙升至3000+;
逐步排查句柄泄露位置(WinDbg之类不知为什么用不了,一旦附加到进程,程序就崩溃);偶然发现程序中只有一个页面(TabPage)会导致句柄增加;对该页面进行逐个排查(注释相关功能代码);终于确定了句柄泄露的位置;
句柄泄露位于一段从网上Copy的代码,改代码用于将System.Drawing.Bitmap转为SharpDX.Direct2D1.Bitmap,该段代码中在从原bitmap复制数据前,会创建一个copy,但copy使用完却没有释放,导致句柄数不断攀升。现已修改了该程序段,已经不会再出现句柄泄露了。

提醒:网上Copy代码需谨慎,一定要仔细确认有没有细节性问题,不能只看功能能否实现。
weixin_38067646 2017-11-27
  • 打赏
  • 举报
回复
问题已经解决。
最初发现引用的一个类库里面会创建比较多的FontFamily(之前没注意到,-_-||),现在整个程序占用内存只有70M左右了。
但程序运行时间一长,还是会出现内存不足的问题,任务管理器中查看程序内存并没有明显增加,但系统可用内存却在逐渐变少;
查看程序句柄数,发现句柄数在程序运行中持续飙升,1小时,句柄数从约1500飙升至3000+;
逐步排查句柄泄露位置(WinDbg之类不知为什么用不了,一旦附加到进程,程序就崩溃);偶然发现程序中只有一个页面(TabPage)会导致句柄增加;对该页面进行逐个排查(注释相关功能代码);终于确定了句柄泄露的位置;
句柄泄露位于一段从网上Copy的代码,改代码用于将System.Drawing.Bitmap转为SharpDX.Direct2D1.Bitmap,该段代码中在从原bitmap复制数据前,会创建一个copy,但copy使用完却没有释放,导致句柄数不断攀升。现已修改了该程序段,已经不会再出现句柄泄露了。

提醒:网上Copy代码需谨慎,一定要仔细确认有没有细节性问题,不能只看功能能否实现。

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧