C#定时清理内存,net网页端可以尝试使用

-- in class definition

——在类定义中

[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]

internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]

internal static extern IntPtr GetCurrentProcess();

-- code to call when you want to reduce the memory

--要减少内存时调用的代码

IntPtr pHandle = GetCurrentProcess();

SetProcessWorkingSetSize(pHandle, -1, -1);

 

使用SetProcessWorkingSetSize函数并不能提高什么性能,也不会真的节省内存,反倒往往会造成一些内存错误,造成应用程序或者系统不稳定,微软自己也建议在建立进程,线程,内核池,就必须小心的使用该函数。

因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用。如果你强制使用该方法来 设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换。

当我们的应用程序刚刚加载完成时,可以使用该操作一次,来将加载过程不需要的代码放到虚拟内存,这样,程序加载完毕后,保持较大的可用内存。

这个东西一般就是整理内存的软件用来骗人的,或者是对于内存占用有强迫症的用户,拿这个安慰他们。

内存占用量的数值有很多种,你看到任务管理器的那个privateworkingset,有些内存占用在这里看不出来,比如开线程占用的栈空间。实际上是要看virtualsize,如果32位程序超过了2GB,64位程序超过8TB,就会溢出。关于系统在资源方面的限制,做sysinternals的MarkRussinovich写过可以参考。.net本身在分配内存的时候也有些限制,比如就算是在64位下,byte[]最大也只能是2GB。也有些溢出的错误并不是真正的溢出,比如GDI+的有些错误也会被误报成溢出。定位内存泄漏有dotMemory/ANTSMemoryProfiler之类的工具可以用。它们就是监视一段时间的内存分配,在完全GC回收后,看还有哪些对象留下来,辅助你分析。

 

在应用程序中,往往为了释放内存等,使用一些函数,其实,对于内存操作函数要谨慎使用,比如大家常常想到的 SetProcessWorkingSetSize,其实对于windows来说,系统会自动在程序闲置时(如程序被最小化)释放内存的,自己用内存释放 时,往往会造成一些莫名的内存错误,造成自己的应用程序及系统不稳定。

 

posted @ 2018-11-17 09:15  net开发人员  阅读(605)  评论(0编辑  收藏  举报