关于SetProcessWorkingSetSize方法的疑问 内存泄露

三五月儿 2015-10-26 03:17:09
使用SetProcessWorkingSetSize方法可以将进程占用的物理内存换出到虚拟内存中,这样做的好处是什么呢?难道就是为了换来程序消耗的内存很小的假象吗?
使用SetProcessWorkingSetSize方法是否可以解决程序因内存不足而导致崩溃的问题呢?
通过查阅资料,个人对这个方法持怀疑态度:因为网上资料说,该方法只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用。所以我认为,就算将部分内存交换至虚拟内存,只要程序被使用,它占用的内存又会回到原点,所以该崩溃还是会崩溃。这样认为对吗?
另外,这个方法还存在频繁进行内存和硬盘间的页面交换而导致性能下降的风险,那么真想不出这个方法到底有什么好处了?
另外,微软提供了一个empty.exe程序也可以完成将进程占用的物理内存换出到虚拟内存的工作,它与SetProcessWorkingSetSize方法又有哪些不同呢?
我们现在在维护一套以前开发的系统,内存上涨极其明显,使用一段时间后便会崩溃,log中会提示没有足够使用的内存。但是我们现在的机器都是4个G,并且没有运行其他什么程序,而程序往往消耗内存5,6百兆的时候(我知道这已经是很大的消耗了,但是相对总内存还是可以接受的)就会崩溃,看看此时的使用量也就40%左右,为什么程序也会崩溃呢?不知道操作系统是根据什么来决定程序崩溃的,是不是程序请求的内存无法被满足时就会崩溃,但是每次还剩2个多G的内存就满足不了程序的需要了吗?当然,我知道程序崩溃的根本原因还是内存泄露,有没有什么好的方法或者工具来定位内存泄露呢?另外,我是否可以修改程序的某些属性,使程序不要在使用内存5,6百兆的时候就崩溃,而是让他再撑一段时间呢,也就是调高某个值?
...全文
973 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32892001 2017-02-16
  • 打赏
  • 举报
回复
引用 3 楼 github_22161131 的回复:
内存占用量的数值有很多种,你看到任务管理器的那个private working set,有些内存占用在这里看不出来,比如开线程占用的栈空间。实际上是要看 virtual size,如果32位程序超过了2GB,64位程序超过8TB,就会溢出。关于系统在资源方面的限制,做sysinternals的Mark Russinovich写过一系列博客可以参考。 .net 本身在分配内存的时候也有些限制,比如就算是在64位下,byte[] 最大也只能是2GB。也有些溢出的错误并不是真正的溢出,比如GDI+的有些错误也会被误报成溢出。 定位内存泄漏有 dotMemory / ANTS Memory Profiler 之类的工具可以用。它们就是监视一段时间的内存分配,在完全GC回收后,看还有哪些对象留下来,辅助你分析。
大神你好,我是一个遇到问题的小青年,我现在遇到一个奇葩的问题,当我开启HTTP Analyzer的时候,我的程序是可以正常爬取到网页和数据,但我关闭了就会出现{System.Net.WebException: 基础连接已经关闭: 发送时发生错误。 ---> System.IO.IOException: 由于意外的数据包格式,握手失败。如果看到并且有时间可以帮忙解决下吗?我QQ是:79612086,可以给酬劳的,这问题困扰我很多天了,一直找不到解决方法
Poopaye 2016-10-31
  • 打赏
  • 举报
回复
不是应该先定位哪里造成崩溃的吗?难道没有dump文件么?
  • 打赏
  • 举报
回复
一个好的研发者,他就能在此贴出一条语句,而不空想什么“给我一个参数,让我能多支撑一会儿”。能函授整个系统开发和维护技术的人,必定是可以对代码见微知著的人,这样入手才能最终解决问题。而不能具体使用这个 debug 思路的人,都不是专业的想去搞明白问题成因的开发人员,是蒙领导的思路。
  • 打赏
  • 举报
回复
你们的软件哪里有bug,那就应该具体测试、调试出到底是哪一条语句抛出异常,然后贴出来问。 什么叫做“庸医”,就是随便乱联系病情,用一堆模糊的“金木水火土、阴阳八卦”之类的理论来看病,告诉病人“一点都不要吃药,吃的全是药毒“,而他给病人拍拍打打、胡乱按摩、胡乱艾灸,每天就收几百块钱。这种就是庸医。实际上真正的正规的药、手术等等,一般都经过了上百万次科学实验,几千万研发费用,淘汰了98%以上的配方,经过几年临床研究,最后才优选出来的。并非庸医所宣传的那样。 编程也是如此。如果看不出诊断、测试的技术,一看就是瞎猜、名词儿接近的东西就联系在一起,生怕别人强调测试、调试、定位到具体的语句,那么这就搞不好开发。搞行政的方式,在搞开发。
大闸蟹小龙虾 2016-10-30
  • 打赏
  • 举报
回复
你好,楼主,我遇到了可能你一样的问题,我是任务管理器进程占用很少的内存的,但是内存基本耗尽,用rammap工具分析,是mapped file造成的,请问你最后是如何解决的,可以交流一下
三五月儿 2015-10-27
  • 打赏
  • 举报
回复
引用 3 楼 github_22161131 的回复:
内存占用量的数值有很多种,你看到任务管理器的那个private working set,有些内存占用在这里看不出来,比如开线程占用的栈空间。实际上是要看 virtual size,如果32位程序超过了2GB,64位程序超过8TB,就会溢出。关于系统在资源方面的限制,做sysinternals的Mark Russinovich写过一系列博客可以参考。 .net 本身在分配内存的时候也有些限制,比如就算是在64位下,byte[] 最大也只能是2GB。也有些溢出的错误并不是真正的溢出,比如GDI+的有些错误也会被误报成溢出。 定位内存泄漏有 dotMemory / ANTS Memory Profiler 之类的工具可以用。它们就是监视一段时间的内存分配,在完全GC回收后,看还有哪些对象留下来,辅助你分析。
dotMemory有尝试使用,但是给出的分析不是太看得懂。
三五月儿 2015-10-27
  • 打赏
  • 举报
回复
引用 1 楼 ajianchina 的回复:
使用SetProcessWorkingSetSize函数并不能提高什么性能,也不会真的节省内存,反倒往往会造成一些内存错误,造成应用程序或者系统不稳定,微软自己也建议在建立进程,线程,内核池,就必须小心的使用该函数。
微软自己提供的empty.exe程序呢?
三五月儿 2015-10-27
  • 打赏
  • 举报
回复
引用 2 楼 github_22161131 的回复:
这个东西一般就是整理内存的软件用来骗人的,或者是对于内存占用有强迫症的用户,拿这个安慰他们。
确实是这样的。
winnowc 2015-10-26
  • 打赏
  • 举报
回复
内存占用量的数值有很多种,你看到任务管理器的那个private working set,有些内存占用在这里看不出来,比如开线程占用的栈空间。实际上是要看 virtual size,如果32位程序超过了2GB,64位程序超过8TB,就会溢出。关于系统在资源方面的限制,做sysinternals的Mark Russinovich写过一系列博客可以参考。 .net 本身在分配内存的时候也有些限制,比如就算是在64位下,byte[] 最大也只能是2GB。也有些溢出的错误并不是真正的溢出,比如GDI+的有些错误也会被误报成溢出。 定位内存泄漏有 dotMemory / ANTS Memory Profiler 之类的工具可以用。它们就是监视一段时间的内存分配,在完全GC回收后,看还有哪些对象留下来,辅助你分析。
winnowc 2015-10-26
  • 打赏
  • 举报
回复
这个东西一般就是整理内存的软件用来骗人的,或者是对于内存占用有强迫症的用户,拿这个安慰他们。
ajianchina 2015-10-26
  • 打赏
  • 举报
回复
使用SetProcessWorkingSetSize函数并不能提高什么性能,也不会真的节省内存,反倒往往会造成一些内存错误,造成应用程序或者系统不稳定,微软自己也建议在建立进程,线程,内核池,就必须小心的使用该函数。

110,537

社区成员

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

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

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