让.NET程序快速释放内存的办法

公司里的一个程序,经过了N个人的手后发现上了生产内存会一直涨,直到物理内存几乎被占用完毕后突然就下降下来(估计是GC给释放了),然后再一直涨。这个程序主要是对字符串进行处理,困扰了我好几天,本机测试内存也有增长的趋势,但是不大明显,上生产是2、3分钟内存就上G,没找到究竟哪里的问题。
从网上搜了些资料,看到可以让.NET立即释放内存,本地简单测试了一下,真的管用,但是没敢用,不知道对于多线程的程序,当一个线程显示释放内存时会不会影响到其他线程,而且我是做金融行业程序的,程序万一出问题就是事故,所以请教一下各位高人,这段代码是否会影响程序的稳定性?
释放内存的代码如下:
[DllImport("kernel32.dll")]
  public static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);

public static void GarbageCollect()
  {
  GC.Collect();
  GC.WaitForPendingFinalizers();
  GC.Collect();
  }

public static void FlushMemory()
  {
  GarbageCollect();

if (Environment.OSVersion.Platform == PlatformID.Win32NT)
  {
  Win32.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
  }
  }

NET里面还有一个类可以达到这个效果
  System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet = new System.IntPtr(5);

采用定时释放+窗体打开的时候,效果很好,估计程序占的内存会在20以下

让.NET程序快速释放内存的办法,布布扣,bubuko.com

时间: 2024-08-25 18:15:07

让.NET程序快速释放内存的办法的相关文章

C#中快速释放内存,任务管理器可查证

先close() 再dispose() 之后=null 最后GC.Collect() 如: ms.Close();//关闭流,并释放与之相关的资源 ms.Dispose();//如果是流的话,默认只会释放非托管资源 ms = null;//这样可以释放托管资源 GC.Collect();//回收资源 四步一步都不能少,顺序也不能错,这样执行完,内存可以得到立即释放,并且在任务管理器中也会有体现. C#中快速释放内存,任务管理器可查证

在dll里malloc/new/cvCreate分配内存,在exe里free/Releases释放内存时会出错。

写了个程序,在DLL中用malloc分配了一块内存,但是在exe程序中释放,结果程序crash,原因就是:其原因可能是堆被损坏,这也说明 TestMySticker.exe 中或它所加载的任何 DLL 中有 bug. 以下文字引用自 http://hi.baidu.com/huhe/blog/item/0b422edd1f1563d98c1029a3.html 一个模块一个堆,一个线程一个栈. dll里malloc的内存,在exe里free会出错. CRT(C运行时期库)不是使用进程缺省的堆来实

C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放

例:修改字符串的第三个字母为a #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warning(disable:4996) void main() { char *p = (char *)malloc(100); strcpy(p,"123456789"); p = p + 2; *p = 'a'; free(p); system("pause"

iOS程序中的内存分配 栈区堆区全局区(转)

在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对应线程/进程是唯一的.优点是快速高效,缺点时有限制,数据不灵活.[先进后出] 栈空间分静态分配 和动态分配两种. 静态分配是编译器完成的,比如自动变量(auto)的分配. 动态分配由alloca函数完成. 栈的动态分配无需释放(是自动的),也就没有释放函数. 为可移植的程序起见,栈的动态分配操作是不

一种高效快速的内存池实现(附源码)

此算法灵感来自于apache内存池实现原理,不过读者如果没有看过apache内存池实现也无关系,因为本算法相对apache内存池算法更为简单而且易懂,个人认为某些场合也更为高效,或许真正到了apache服务器上性能不如,但是这套设计思想应该还是可以借鉴到更多场合的. 我们在调用malloc函数时,操作系统内部会查找一个所谓的空闲链表,当找到足够大的空闲空间时会将内存分割并返回一部分会用户,当然在很大的项目里面有可能会出现链表所有节点都找不到空闲空间的情形,此时操作系统便会不断搜索内存碎片,然后组

频繁分配释放内存导致的性能问题的分析

频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000. 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误. 这两个数值表示一个进程自启动以来所发生的缺页中断的次数

[转载] - 程序员对内存的理解

程序员对内存的理解 原文链接 在C和C++语言开发中,指针.内存一直是学习的重点.因为C语言作为一种偏底层的中低级语言,提供了大量的内存直接操作的方法,这一方面使程序的灵活度最大化,同时也为bug埋下很多隐患. 因此,无论如何,我们都要对内存有一个清晰的理解. 一.对内的分配 32位操作系统支持4GB内存的连续访问,但通常把内存分为两个2GB的空间,每个进程在运行时最大可以使用2GB的私有内存(0x00000000—0x7FFFFFFF).即理论上支持如下的大数组: char szBuffer[

百度地图释放内存最佳答案

解决办法是在- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated中加入了两行代码 [self.map removeFromSuperview]; [self.view addSubview:mapView];然后在以上两行代码后面加载你的UI页面-----记住啦 在移除self.map的同时,重新加载mapView,两行代码就可以达到释放内存的效果. 用Instruments测试显示,之前不能释放的

C语言程序编译的内存分配

C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { i