C#程序中降低内存清理方法

1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多

2、强制垃圾回收

3、多dispose,close

4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);

 1 //在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
 2
 3 #region 内存回收
 4 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
 5 public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
 6 /// <summary>
 7 /// 释放内存
 8 /// </summary>
 9 public static void ClearMemory()
10 {
11 GC.Collect();
12 GC.WaitForPendingFinalizers();
13 if (Environment.OSVersion.Platform == PlatformID.Win32NT)
14 {
15 App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
16 }
17 }
18 #endregion

5、发布的时候选择Release

6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append

7、this.Dispose();    this.Dispose(True);   this.Close();    GC.Collect();  
8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。

9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科

时间: 2024-08-29 05:48:55

C#程序中降低内存清理方法的相关文章

了解 JavaScript 应用程序中的内存泄漏

简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理即可实现,但却忽略了它可能在程序中带来重大的问题.不当清理的对象可能会存在比预期要长得多的时间.这些对象继续响应事件和消耗资源.它们可强制浏览器从一个虚拟磁盘驱动器分配内存页,这显著影响了计算机的速度(在极端的情形中,会导致浏览器崩溃). 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在.在最近几

[Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

本文将演示使用Instruments Allocations工具检测应用程序中的内存泄漏问题. 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. 在项目文件夹[DemoApp]上点击鼠标

(二)程序中的内存&amp;&amp;栈

一.程序运行为什么需要内存?基本概念? 内存是程序运行的立足之地,程序需要用内存来存储一些变量. 内存管理最终是由操作系统完成的,内存在本质上是一个硬件器件,由硬件系统提供:内存由操作系统统一管理,为了管理内存方便,操作系统提供了很多机制来让我们应用程序使用内存.这些机制彼此不同,各有各的特点,我们程序根据自己的实际情况来分配内存(暂时获得内存的使用权),使用内存,释放内存(向操作系统归还内存使用权限).在C语言中获得内从的方法为栈.堆.数据区 二.栈 在C语言中,局部变量是存在于栈中的,栈是一

程序中五大内存分区

本文介绍C/C++中堆,栈及静态数据区. 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分

程序中的内存分配

栈由操作系统自动分配释放 ,用于存放函数的参数值.局部变量等,其操作方式类似于数据结构中的栈 1. 函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量. 2. 栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量 3. 栈中存储的数据的生命周期随着函数的执行完成而结束 堆由程序员分配释放, 若程序员不释放,程序结束时由OS回收,分配方式倒是类似于链表 1. 堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间

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

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

_CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)

// .h 文件 #pragma once class CConsoleDump { public: explicit CConsoleDump(LPCTSTR lpszWindowTitle = NULL); virtual ~CConsoleDump(void); public: BOOL DUMP(LPCTSTR lpszFmt, ...); BOOL ShowWindow(BOOL bShowWindow); BOOL SetWindowText(LPCTSTR lpszWindowTi

获取java程序运行时内存信息

由于最近想自己动手测试一下String和StringBuffer的效率问题,需要获取程序运行时的内存占中信息,于是上网查了一下,根据查到的资料写了个程序,发现结果有问题,才发现查到的资料是错误的.所以在这里跟大家分享一下获取内存占用的正确方法 错误的方法 //程序开始时:(先调用一下垃圾回收,但是不一定立即执行) Runtime.getRuntime().gc(); long initm=Runtime.getRuntime().freeMemory(); //程序结束时: Runtime.ge

Android 中使用内存监测工具Heap,及内存分析工具 MAT

无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似).用Heap监测应用进程使用内存情况的步骤如下: 1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的: 2. 将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式