网站开发浏览器兼容性,南通建设招聘信息网站,网站开发流程比较合理,品牌设计logo背景概述C# 开发客户端系统的时候#xff0c;.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化#xff0c;才能流畅的在哪些低端电脑上运行. 想要对C# 开发的客户端内存优化需要了解以下几个概念。虚拟内存这里… 背景概述C# 开发客户端系统的时候.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化才能流畅的在哪些低端电脑上运行. 想要对C# 开发的客户端内存优化需要了解以下几个概念。虚拟内存 这里引用百度百科的概念虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存一个连续完整的地址空间而实际上它通常是被分隔成多个物理内存碎片还有部分暂时存储在外部磁盘存储器上在需要时进行数据交换。目前大多数操作系统都使用了虚拟内存如Windows家族的“虚拟内存”Linux的“交换空间”等。一句话概括虚拟内存既是使用磁盘物理磁盘进行虚拟化出来的内存空间。物理内存物理内存Physical memory是相对于虚拟内存而言的。物理内存指通过物理内存条而获得的内存空间而虚拟内存则是指将硬盘的一块区域划分来作为内存。内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存。常见的物理内存规格有256M、512M、1G、2G等现如今随着计算机硬件的发展已经出现4G、8G甚至更高容量的内存规格。当物理内存不足时可以用虚拟内存代替。在应用中自然是顾名思义物理上真实存在的插在主板内存槽上的内存条的容量的大小。看计算机配置的时候主要看的就是这个物理内存。GC 垃圾回收机制简介C#中和Java一样是一种系统自动回收释放资源的语言在C#环境中通过 GCGarbage Collect进行系统资源回收在数据基本类型中介绍到C#数据类型分为引用类型和值类型值类型保存在Stack上随着函数的执行作用域执行完毕而自动出栈所以这一类型的资源不是GC所关心 对象。GC垃圾回收主要是是指保存在Heap上的资源。.NET的GC机制有这样两个问题- 首先GC并不是能释放所有的资源。它不能自动释放非托管资源。- 第二GC并不是实时性的这将会造成系统性能上的瓶颈和不确定性。 GC并不是实时性的这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口IDisposable接口定义了Dispose方法这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。托管资源和非托管资源上面介绍到GC只释放托管资源那么什么是托管资源和非托管资源。- 托管资源 托管资源指的是.NET可以自动进行回收的资源主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的有.NET运行库在合适调用垃圾回收器进行回收。- 非托管资源非托管资源指的是.NET不知道如何回收的资源最常见的一类非托管资源是包装操作系统资源的对象例如文件窗口网络连接数据库连接画刷图标 等。这类资源垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下方法是空的对于非托管对象需要在此方法中编写回收非托管资源的代码以便垃圾回收器正确回收资源。总结托管资源是释放由GC来完成释放的时间吧不一定一般是系统感觉内存吃紧会进行紧急回收资源。一个对象想成为被回收首先需要成为垃圾GC是通过判断对象及其子对象有没有指向有效的引用如果没有GC就认为它是垃圾。垃圾回收机制通过一定的算法得到哪些没有被被引用、或者不再调用的资源当这些垃圾达到一定的数量时会启动垃圾回收机制GC回收实际上是调用了析构函数。垃圾回收机制意味着你不需要担心处理不再需要的对象了。咱们关心的主要是非托管资源的释放。垃圾回收时对象一共有三代 012。每一代都有自己的内存预算空间不足的时候会调用垃圾回收。为了提高性能都是按代回收第0代超预算之后就回收第0代的对象而存活下来的对象就提升为第1代依次类推而往往经过多次0代的垃圾回收才能回收一次第1代。GC进行垃圾回收是系统决定的下面是进行强制回收的执行代码非特殊情况下不要使用此方法会影响系统效率削弱垃圾回收器中优化引擎的作用而垃圾回收器可以确定运行垃圾回收的最佳时间//对所有代进行垃圾回收。
GC.Collect();
//对指定的代进行垃圾回收。
GC.Collect(int generation);
//强制在 System.GCCollectionMode 值所指定的时间对零代到指定代进行垃圾回收。
GC.Collect(int generation, GCCollectionMode mode);
关于 SetProcessWorkingSetSize 和内存释放 在应用程序中往往为了释放内存等使用一些函数其实对于内存操作函数要谨慎使用比如大家常常想到的 SetProcessWorkingSetSize其实对于windows来说系统会自动在程序闲置时如程序被最小化释放内存的自己用内存释放 时往往会造成一些莫名的内存错误造成自己的应用程序及系统不稳定。SetProcessWorkingSetSize的作用- 物理内存转移到虚拟内存中 - msdn解释使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.SetProcessWorkingSetSize 的劣势- 危害如果 SetProcessWorkingSetSize 函数被正常使用,是非常有用处的.但是为了蒙骗用户的眼睛,每秒,甚至几十毫秒就把大量内存往虚拟内存里面压,就会带来无可预计的危害.看看这篇文章怎么 说:“因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置 程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换.”.优化内存代码[DllImport(kernel32.dll)]
private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);private void FlushMemory()
{GC.Collect();GC.WaitForPendingFinalizers();if (Environment.OSVersion.Platform PlatformID.Win32NT){SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);}
}