C# WinForm 运行久了就内存不足

LRG315 2018-08-21 07:51:19
1、WinForm,主窗体-子窗体模式
2、关闭子窗体,使用Hide(),打开子窗体,使用Show()
3、软件就是ERP、进销存,支持图片,Socket上传下载
4、表格数据多

大概这些,然后,软件运行久了,就达到几百M,然后用着用着就突然弹出内存不足,好恐怖,请问解决思想好,谢谢。
...全文
3259 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2018-09-03
  • 打赏
  • 举报
回复
估计是调用啥api然后没给释放,例如gdi之类的
SoulRed 2018-09-03
  • 打赏
  • 举报
回复
。。很显然,内存泄漏了。。
alfred_woo 2018-08-28
  • 打赏
  • 举报
回复
还是查代码吧,所有的循环里new出来的东西都记得杀掉。
qq4514348 2018-08-27
  • 打赏
  • 举报
回复
注意是否使用静态数组,如果有改为动态
吉普赛的歌 2018-08-27
  • 打赏
  • 举报
回复
如果你一时半会没法找出问题, 那就把消耗内存的功能操作写成一个个 .exe 文件。
WinForm 只是当界面用用, 需要什么功能就用 proccess 调用哪个 .exe , 用完进程就自动结束了, 你的代码写的好与坏也没大关系, 反正用完就结束, 不存在累积的问题。
按我的做, 保证你连续用两年没问题。
走好每一步 2018-08-27
  • 打赏
  • 举报
回复
引用 44 楼 xomix 的回复:
[quote=引用 43 楼 tajon1226 的回复:]
其实真的是没有银弹的,有内存托管的语言并不能包治百病,长期运行的软件还是不得不注意内存泄漏等软件稳定的问题。
而避免这些问题,你不得不去深刻理解内存,操作系统等机制。
如果只会拖拖控件,把功能实现,后面软件慢慢腐烂也是不可避免的事情
虽然你说的都很对,我还是觉得你说的很中二………………[/quote]

嗯,纯属吹水。
  • 打赏
  • 举报
回复
引用 43 楼 tajon1226 的回复:
其实真的是没有银弹的,有内存托管的语言并不能包治百病,长期运行的软件还是不得不注意内存泄漏等软件稳定的问题。
而避免这些问题,你不得不去深刻理解内存,操作系统等机制。
如果只会拖拖控件,把功能实现,后面软件慢慢腐烂也是不可避免的事情
虽然你说的都很对,我还是觉得你说的很中二………………
idiotwei2014 2018-08-24
  • 打赏
  • 举报
回复
内存不足很多情况是用了太多的dataset,除了界面需要绑定表格的dataset,其他查询功能换成查询sql试试。 总之就是尽量少用dataset。
走好每一步 2018-08-24
  • 打赏
  • 举报
回复
其实真的是没有银弹的,有内存托管的语言并不能包治百病,长期运行的软件还是不得不注意内存泄漏等软件稳定的问题。
而避免这些问题,你不得不去深刻理解内存,操作系统等机制。
如果只会拖拖控件,把功能实现,后面软件慢慢腐烂也是不可避免的事情
走好每一步 2018-08-24
  • 打赏
  • 举报
回复
要解决内存泄漏,要深刻理解代码,别无它法。
内存变大有时候并不是内存泄漏!!
我是小数位 2018-08-24
  • 打赏
  • 举报
回复
引用 37 楼 weixin_40068689 的回复:
借助这个帖子请教一下,我们公司有一个服务器放的web项目在运行的,服务器重启之后运行IIS,查看内存只占用了十几G,过了一个星期左右就跑到接近30G了,这也是因为资源未释放的原因吗?
首先优化自己代码,如果没怎么优化过的人,可以借助一些性能分析工具,如JetBrains dotTrace,NET Memory Profiler等,我曾经也用过,蛮好用的,另外可以自己写一个应用池监控服务,定时的回收。另外特别注意是否用到反射之类的功能,如果有,就要注意了
余缺 2018-08-24
  • 打赏
  • 举报
回复
这等问题需要一点一点的找,内存泄漏、程序盈余等等
快乐的兔八哥 2018-08-24
  • 打赏
  • 举报
回复
qq_35692888 2018-08-23
  • 打赏
  • 举报
回复
Winform确实不适合做大一点的商业软件开发。。不然呢我也认为Winform确实是很方便做桌面的。。为什么那些大些商业软件不选择Winform呢?如photoshop, CorelDraw, UG,PRO/E,AutoCad。。。真的方便功能强大这些软件早就用Winform改写了,你说是不是呢?
qq_43026839 2018-08-23
  • 打赏
  • 举报
回复
内存溢出需要如何测试?
qq_41695187 2018-08-23
  • 打赏
  • 举报
回复
感觉不是很明白这个题目的意思
我是小数位 2018-08-23
  • 打赏
  • 举报
回复
1.首先托管内存的运行库采用的是垃圾回收器来回收的方式。垃圾回收器本身也是一个程序。程序动态请求的内存都分配到堆上,在.net中,CLR维护它自己的托管堆供.net程序使用。每隔一段时间.net就会检查托管堆,当检查到需要清理堆时,.net就调用垃圾回收器这个程序。垃圾回收器会扫描堆上的对象的引用,不再有引用的对象就被删除。垃圾回收器调用的时间是不确定的。所以我们在编写代号时尽量首动释放对象。还有程序自行调用垃圾回收(System.GC.Collect()).
2.非托管内存,回收器是不知道如何释放非托管资源,如文件句柄,网络连接、数据库连接等。当非托管对象被托管对象引用时,托管对象被释放时应确保其相关的非托管对象被释放。自己可以看看非托管内存的管理
3.反射的内存占用,曾经我做过一个程式,就是定时执行反射,系统也是用了一段时间就内存不足,解决反射内存占用,需要用到域的管理,动态卸载被反射的dll
qq_43036265 2018-08-23
  • 打赏
  • 举报
回复
抓出dump,然后分析。别空对空,总要有实际证据
wanghui0380 2018-08-23
  • 打赏
  • 举报
回复
抓出dump,然后分析。别空对空,总要有实际证据
  • 打赏
  • 举报
回复
偷懒的方法:
你可以主动调用GC.Collect()强制GC,比如设置一个定时器周期性调用GC.GetTotalMemory,如果超过某个安全值(你自己设定),就调用GC.Collect...

加载更多回复(27)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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