windows 如何自动关闭占用内存过多的程序

2016-08-05 15:02:26 +08:00
 zhubuntu

在做一个项目,初学 C++,有时候程序写的有问题会出现内存泄漏,想知道有没有什么方法,可以检测到某一个进程占用内存过多是关闭这个进程,保护系统不崩溃。

3284 次点击
所在节点    Windows
18 条回复
loading
2016-08-05 15:12:29 +08:00
然而,内存泄漏,并不会引起内存占用超高(操作系统视角)。
zhubuntu
2016-08-05 15:37:47 +08:00
@loading 可能是我描述的不准确,反正写出来的程序有时候占用内存就涨,我这个程序要跑好久,它就慢慢一点点长,刚开始很正常,我就把它放在那儿没管,然后就跪了,现在还在改,所以就想找个方法能不能限制一下,也方便找原因。
loading
2016-08-05 15:48:10 +08:00
@zhubuntu 不尝试先修 bug ,只顾着重启?
sun1991
2016-08-05 16:12:07 +08:00
用 Task Scheduler 跑 Powershell 脚本枚举进程, 然后 kill 掉?
zhubuntu
2016-08-05 16:29:54 +08:00
@loading 修复好了,我只是想找下有没有这种限制的方法,免得以后再出现这种错误,也是对电脑一种保护啊。
zhubuntu
2016-08-05 16:31:18 +08:00
@sun1991 可以试下,很好奇为什么 windows 不提供这种程序,感觉是很实用的东西才对,限制单个用户可以使用的资源什么的,找了半天没找到。
wevsty
2016-08-05 16:48:03 +08:00
对于 X86 的 Windows 来说,单个进程最大只能申请 2GB 的内存空间,这个是系统限制,超过的话会申请内存会直接失败。
对于 X64 的 Windows 来说没有这样的限制,如果想限制自己进程的内存占用,可以使用 SetInformationJobObject 设置 ProcessMemoryLimit 设置 job (有些翻译是翻译成作业)
如果是要检测内存占用,可以使用 GetProcessMemoryInfo 检测。
最后,一般来说内存耗尽以后发生什么事情不好说,但是越不健壮的代码死的越早,我个人倾向于系统挂掉之前,内存泄漏的程序会先崩掉。保证代码不会内存泄露比开个守护进程检测更重要。
wevsty
2016-08-05 16:49:54 +08:00
多补充一句,对于 Windows X64 下运行 X86 的程序,我记得也是有 2GB 的限制的
sun1991
2016-08-05 17:02:52 +08:00
@wevsty Windows 不是 iOS, 程序跑着跑着消失了, 你难道不会觉得很奇怪?
wevsty
2016-08-05 17:05:55 +08:00
@sun1991 很多后台进程或者服务的话是没有 GUI 的啊,无声无息的,没有监控很难注意到的。
luban
2016-08-05 17:10:05 +08:00
前段时间用一个去重复软件删了太多文件,按文件删的,最后回收站里有 10w+数量文件,没有按照文件夹分类,打开回收站, 12g 内存基本被资源管理器耗完,多次崩溃蓝屏。
反复试了好多次,最后用 ccleaner 来做清空回收站的操作,不用打开资源管理器,顺利完成。
sun1991
2016-08-05 17:12:17 +08:00
@wevsty 想起一个笑话:

A: 我们公司的空调很智能
B: 怎么说
A: 一旦检测到温度过高, 他会自己关机

我不会告诉你我们公司真有一台...
wevsty
2016-08-05 17:14:35 +08:00
@sun1991 人生有的时候就是这么无奈, 66666~
xieyudi1990
2016-08-06 01:53:35 +08:00
很久很久以前用 vb 写过类似的东西
记得就是调用 win32api 遍历所有的进程,然后 kill 。
c++ 就更好办了。直接链接到 dll 上的那个 api ,写个循环, kill 。
zhubuntu
2016-08-06 09:34:32 +08:00
@wevsty 多谢,我去找下怎么用这些 api
zhubuntu
2016-08-06 09:39:27 +08:00
@xieyudi1990 想问下你说的直接链接到 dll 上的那个 api ,就是楼上说的 SetInformationJobObject 吗
xieyudi1990
2016-08-06 10:59:42 +08:00
@zhubuntu 随便一搜就一堆资料,想找不到都难。
GetProcessMemoryInfo ,在 kernel32.dll 上。用法见 msdn 。
zhubuntu
2016-08-06 14:38:12 +08:00
@xieyudi1990 嗯,刚在看,多谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297379

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX