C# 客户端内存优化分析

背景概述

C# 开发客户端系统的时候,.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化,才能流畅的在哪些低端电脑上运行. 想要对C# 开发的客户端内存优化需要了解以下几个概念。

虚拟内存

 这里引用百度百科的概念:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

一句话概括虚拟内存既是使用磁盘,物理磁盘进行虚拟化出来的内存空间。

物理内存

物理内存(Physical memory)是相对于虚拟内存而言的。物理内存指通过物理内存条而获得的内存空间,而虚拟内存则是指将硬盘的一块区域划分来作为内存。内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存。常见的物理内存规格有256M、512M、1G、2G等,现如今随着计算机硬件的发展,已经出现4G、8G甚至更高容量的内存规格。当物理内存不足时,可以用虚拟内存代替。在应用中,自然是顾名思义,物理上,真实存在的插在主板内存槽上的内存条的容量的大小。看计算机配置的时候,主要看的就是这个物理内存。

GC 垃圾回收机制

简介

C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage 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回收实际上是调用了析构函数。

垃圾回收机制意味着你不需要担心处理不再需要的对象了。咱们关心的主要是非托管资源的释放。

垃圾回收时对象一共有三代 :0,1,2。每一代都有自己的内存预算,空间不足的时候会调用垃圾回收。为了提高性能都是按代回收,第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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xshell1分钟就会自动断_手术室自动门不能正常控制开关门维修案例

手术室自动门维修案例遵义市第五人民医院手术室的手术门。用户反映:不能正常控制开关门。一、原因分析:1.红外线安全传感器故障2.控制器故障3.直流电机故障4. 红外感应开关故障5.红外感应探头故障6.电源故障图1图2图3图4图5图6二、维修过程:1…

[蓝桥杯][基础练习VIP]芯片测试-思维

题目描述 有n块芯片,有好有坏,已知好芯片比坏芯片多。 每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与…

.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)...

18 | 日志框架&#xff1a;聊聊记日志的最佳姿势除了使用 CreateLogger 指定 logger 的名称&#xff0c;实际上还可以借助容器来构造 logger&#xff0c;通常情况下我们会定义自己的类namespace LoggingSimpleDemo {public class OrderService{ILogger<OrderService> _lo…

[蓝桥杯][基础练习VIP]完美的代价-贪心

题目描述 回文串&#xff0c;是一种特殊的字符串&#xff0c;它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串&#xff0c;它不一定是回文的&#xff0c;请你计算最少的交换次数使得该串变成一个完美的回文串。 交换的定义是&#xff1a;交换两…

安卓手机 python控制_PyAndroidControl:使用python脚本控制你的安卓设备

有的时候玩游戏或者干什么想写写安卓的脚本&#xff0c;不过用 java 或者 kotlin 写图像处理什么的太麻烦了&#xff0c;按键精灵的脚本我也懒得学。adb 倒是可以&#xff0c;但是很多时候要用电脑&#xff0c;又有些不太方便。感觉现在云手机比较方便吧&#xff0c;比如说&…

《ASP.NET Core 微服务实战》送书结果公告

如何构建基于.NET Core和云环境下的微服务技术体系&#xff1f;的送书抽奖结果已经出来了&#xff1a;当前只有一位同学填写了地址。其他几位同学抓紧填写&#xff0c;3/9 日还没有完成填写将作废&#xff0c;奖品可是热门的《ASP.NET Core 微服务实战》。另外我公司商城上上线…

MarkDown的介绍

文章目录markdown是什么优点缺点代码高亮markdown是什么 markdown是一种标记语言&#xff0c;常用文字排版 优点 易读&#xff08;看起来很舒服&#xff09;&#xff0c;易写&#xff08;语法简单&#xff09;跨平台使用&#xff08;mac/win/linux等&#xff09;其他网站和软件…

科学家的假想-substr的妙用

题目背景 DNA是一个神奇的序列&#xff0c;在某科学家的研究中&#xff0c;他发现世界上存在某种病毒入侵到人体内会使人变成小怪兽&#xff0c;按目前技术来说&#xff0c;科学家还无法制造出正义的奥特曼来消灭小怪兽。 题目描述 某科学家收集了世界上几乎所有的DNA病毒&am…

2020 年 Service Mesh 技术展望

背景有外文指出&#xff0c;2020 年 Service Mesh 技术将有以下三大发展&#xff1a;快速增长的服务网格需求&#xff1b;Istio 很难被打败&#xff0c;很可能成为服务网格技术的事实标准&#xff1b;出现更多的服务网格用例&#xff0c;WebAssembly 将带来新的可能。针对 Serv…

搭积木-贪心

题目背景 最近的m天小明都去幼儿园陪小朋友们玩去了~ 题目描述 每个小朋友都拿到了一些积木&#xff0c;他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多&#xff0c;有的小朋友拿得少&#xff0c;有些小朋友需要拿到其他 小朋友的积木才能完成他的…

python实现辗转相除法求最大公约数和最小公倍数

辗转相除法数学原理 辗转相除法也称欧几里得算法&#xff0c;是用来求两个正整数的最大公约数的算法。接下来我们用实例来解释一下。假如我们需要求12和21的最大公约数&#xff0c;用辗转相除法是这样实现的&#xff1a; 21 / 12 1 &#xff08;余 9&#xff09; 12 / 9 1&a…

登录系统_执照管理系统登录与执照转换操作指南

执照管理系统登录与执照转换操作指南注&#xff1a;本操作指南适用于所有已经在CCAR-R2执照管理系统中注册的人员(无论是否参加过考试&#xff0c;无论有无考试通过科目).已经在旧系统中完成注册的人员无需在新系统中再次注册。只有完成本指南中的有关操作&#xff0c;才能正常…

BeetleX之XRPC远程委托调用

BeetleX.XRPC是基于接口的远程通讯组件,它不仅可以把接口提供客户端调用,同样也支持服务端创建客户端的接口实例并主动调用客户端的方法.接口有着非常的规范性和约束性,但前提你是必须制定相应的接口并实现才行;为了让通讯在.NET平台使用变得更简便,在新版中组件支持远程委托调…

常用决策树模型ID3、C4.5、CART算法

决策树概述 决策树&#xff08;decision tree&#xff09;&#xff1a;是一种基本的分类与回归方法&#xff0c;下面提到的ID3、C4.5、CART主要讨论分类的决策树。 在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;可以认为是if-then的集合&#xff0c…

android webview卡顿检测_Android webview隐藏后跳转新页面input输入卡顿与白屏渲染慢的问题说明及修复方案...

关于此问题的说明:Android System WebView 内核的bug&#xff1a;当webview页面中存在持续渲染(如跑马灯效果。banner轮播等)。页面被隐藏后会导致JS阻塞影响页面渲染效率。从66.0.3359.126版本到最新都存在此问题。注意&#xff1a;此问题必须是页面隐藏hide后&#xff0c;并且…

hdu4841 圆桌问题-vector容器模拟

Problem Description 圆桌上围坐着2n个人。其中n个人是好人&#xff0c;另外n个人是坏人。如果从第一个人开始数数&#xff0c;数到第m个人&#xff0c;则立即处死该人&#xff1b;然后从被处死的人之后开始数数&#xff0c;再将数到的第m个人处死……依此方法不断处死围坐在圆…

五分钟了解Consul

Hi&#xff0c;大家好&#xff0c;我叫consul&#xff0c;翻译成中文叫做“领事”&#xff0c;其实我更喜欢叫自己为中介&#xff0c;因为我觉得自己做的事情和房产中介非常像。比如说想要卖房的房东到我这边登记&#xff0c;我将房屋信息登录到我的表格中&#xff08;服务注册…

决策树可视化保姆级教程

决策树可视化指南 决策树是机器学习的一种经典的模型&#xff0c;因其泛化性能好&#xff0c;可解释性强而被广泛应用到实际商业预测中。通常在我们完成决策树模型搭建后&#xff0c;我们会进一步研究分析我们搭建好的模型&#xff0c;这时候模型的可视化就显得尤为重要。下面…

ubtunu打开firefox_ubuntu中火狐浏览器问题(也许是)

带宽2M&#xff0c;虽然不多&#xff0c;但是看个网页还是够的在ubuntu中使用火狐浏览器经常会出现以下情况打开某网页&#xff0c;一直都打不开&#xff0c;下方显示正在链接到 某某网页很久之后也许还没连上&#xff0c;接着会有不能上网的提示&#xff0c;然后刷新下大部分…

如何运用领域驱动设计 - 领域事件

开篇距离发布上一篇该系列的文章好像已经过了快一个半月了&#xff0c;好吧&#xff0c;我托更了????。一晃就已经到了3月份&#xff0c;在这樱花????盛开的季节&#xff0c;终于得重新连载该系列了。在停更的期间时不时会收到大家关于DDD的留言和问题&#xff0c;一旦…