c get set 如何使用用dottrace set

C# WinForm应用程序降低系统内存占用方法总结 - 张军伟 - 博客园
这篇文章主要介绍了C# WinForm应用程序降低系统内存占用方法总结,本文总结了9个方法,同时给出了一个定期清理执行垃圾回收代码,需要的朋友可以参考下
微软的 .NET FRAMEWORK 现在可谓如火如荼了。但是,.NET 一直所为人诟病的就是&胃口太大&,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。
以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序,你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。
结论与展望:
创新设计大赛的项目已经快到交付的日期了,都说Winform占用内存大,于是想着看看自己写的基于手机邮件的远程关机软件(Mail_Based_Remote_Shutdown)占用内存情况,整个开发过程自己也在尽量写一些比较优美的代码来减少系统内存占用,今天看了下,刚打开时占用20M内存,然后一点点增加,最后到80多M,真是无法忍受,每次都是写了之后回过头来才发现自己的代码很丑,系统架构师的作用就体现出来了。
这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考:
1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多2、强制垃圾回收3、多dispose,close4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。5、发布的时候选择Release6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append7、this.Dispose();&&& this.Dispose(True);&& this.Close();&&& GC.Collect();&&&8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
附录:定期清理执行垃圾回收代码:
//在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// &summary&
/// 释放内存
/// &/summary&
public static void ClearMemory()
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
#endregion转载自:&性能分析(Performance Profiling):在dotTrace中在被测试程序中当某些特定操作持续的时间.可以定位运行最慢的代码(Locate the slowest-running parts in your code)找出性能瓶颈的制约(Identify performance bottlenecks down to any particular function)观察单个函数花费的CPU时间(Focus on a function to see what makes it consume CPU time)理清复杂的递归调用(Untangle complex recursive calls)比较前后时序优化功能(Compare function timings before and after optimization)性能分析包括几个分析方法,每一个都有其特定的用途。跟踪分析 vs 抽样分析(Tracing Profiling vs Sampling Profiling)Measuring Wall Time vs Thread Time即时内联内存分析:衡量分配的内存量和应用程序的对象释放。可以:获取有关内存使用全面统计查看哪些类和消费最多的内存空间确定举行可达对象为某对象分析源垃圾发电会话分析:在同一段时间内的分析的应用程序的不同方面。分析会话可通过dotTrace用户界面,或命令行或API运行快照:是一个文件,包含由dotTrace分析期间保存的数据,用视图表示。这些数据包括等参数:函数的执行时间函数调用次数函数占总花费时间的百分比对象包含类的个数对象分配的内存拥有的对象个数占用的内存&快照视图:是一个快照数据的可视化表示(期间收集到的分析会话),可从不同角度分析结果。 dotTrace提供了几视图性能分析视图调用树视图:树般的呼吁所有可执行的功能分组分析会话期间,他们可以通过线程或所有线程分组平面视图:查看会话期间所有方法或函数调用热点视图:查看会话期间时间花费最多的函数和方法反向视图:查看调用选定函数的函数内存分析视图类列表:内存分析的的默认视图,准确统计对象的数量和程序中各个类分配的内存量命名空间树:按命名空间分组对象外引用:显示引用外部对象的对象引用内引用:显示对该对象的引用分配树:以树结构显示分配到该对象的函数。过滤:显示或隐藏特定函数。请参阅创建和应用过滤器。打开独立的标签窗口:对于CPU快照,可以为一个函数打开一个新的标签窗口来显示函数花费CPU的时间率;对于内存快照,可以分析内存查看引用,查看静态数据等。Opening in a New Tab为CPU快照,另开一个新标签上显示的功能是指一个函数,作为一个消耗100%的资源根源的CPU一定比例的信息。内存快照,揭开了新标签组对象使您可以分析内存:鉴于参考,研究统计等见打开在新标签。折叠dotTrace因此可以折叠递归调用,过滤来电。折叠递归调用帮助用户有效地分析递归算法的性能。见折叠递归调用。折叠式过滤要求,确定可以在代码的部分,感兴趣的用户的性能瓶颈。见折叠滤波呼吁。垃圾收集器垃圾回收器回收的企图是不会被应用程序使用的对象使用的内存。见显示垃圾信息。举行可达的对象一个对象是持有另一个对象,如果它仍然未引用时,引用对象被删除。举行内存是由持有对象分配的内存量。可到达的对象是从另一个对象,如果存在一些应用程序中的名称,导致它,直接或通过其他到达对象的引用。见查看举行可达的对象。种对象活动对象:对象,在得到一个内存快照的时刻存在。新的对象:对象不存在时,内存的标志,而是由获得快照那一刻出现。死对象:对象时存在内存的标志,而是由获得快照那一刻死亡。垃圾:对象的分配和内存之间的标识和获取快照垃圾收集器收集。最后确定的对象:对象的定稿(处置终结)(见最后审定并最终确定对象)。见差异获取内存国模式,在内存中筛选国家和查看最终确定对象的差异。最后审定并最终确定对象解释确定物体的概念,让我们定义定稿。当从根不强引用仍然是一个对象,并在垃圾收集器收集它,该对象可最后定稿。在。NET,对象只有在完成覆盖Object.Finalize()方法。注意:在C#中有没有办法覆盖Object.Finalize()方法。相反,它可以创建一个析构函数。在编译时,编译器创建一个方法,载有析构函数,它调用的Finalize()基类的方法,然后执行析构函数的代码。然而,使用析构函数的缺点是,他们是在一个不确定的时间要求。因此,它不是一个析构函数,而是Dispose()方法,通常用于为那些不再需要免费资源。在Dispose()方法被调用,你应该当你不再需要的对象。如果你忘记调用它时,该方法将调用相应的Finalize()方法。然而,这是一个不好的做法留给到终结,因为在性能较低,效益低的应用程序的内存使用此结果。为了解决这一问题,dotTrace可以检测到定稿对象。对于其中的一些,你会发现,他们没有明确处理在您的代码。
阅读(...) 评论()1076人阅读
c#-winform(52)
微软的 .NET FRAMEWORK 现在可谓如火如荼了。但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。
以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序,你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。
结论与展望:
创新设计大赛的项目已经快到交付的日期了,
都说Winform占用内存大,于是想着看看自己写的基于手机邮件的远程关机软件(Mail_Based_Remote_Shutdown)占用内存情况,
整个开发过程自己也在尽量写一些比较优美的代码来减少系统内存占用,今天看了下,刚打开时占用20M内存,
然后一点点增加,最后到80多M,真是无法忍受,
每次都是写了之后回过头来才发现自己的代码很丑,系统架构师的作用就体现出来了。
这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考,待更新:
1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多
2、强制垃圾回收
3、多dispose,close
4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。
5、发布的时候选择Release
6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
7、this.Dispose(); & &this.Dispose(True); & this.Close(); & &GC.Collect(); &&
8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
附录:定期清理执行垃圾回收代码:
//在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
#region 内存回收
[DllImport(&kernel32.dll&, EntryPoint = &SetProcessWorkingSetSize&)]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// &summary&
/// 释放内存
/// &/summary&
public static void ClearMemory()
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
#endregion
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:566313次
积分:7793
积分:7793
排名:千里之外
原创:164篇
转载:230篇
评论:334条
QQ交流群-“未来程序员”欢迎你的加入!QQ群号:
(大家有什么好玩的,有一些关于生活上的电脑软件或硬件兴趣爱好的可以加群,大家一起讨论娱乐进步!)
声明:本人没有淘宝店,需要源码请加本人QQ,谢谢!
1.极客学院签约布道师(讲师)
ASP.net WebForm介绍视频课程:(请将网址复制到浏览器再打开);
2.作为80后的年轻时代大好青年,我们要做到:多读书,多看报,少吃零食,多睡觉。大家要明白,知识就像内裤,看不见却很重要,这个世界上唯一抗的住岁月摧残的,是什么呢?就是才华;
3.成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成;
文章:13篇
阅读:10106
文章:27篇
阅读:41831
文章:13篇
阅读:32639
文章:10篇
阅读:7101
文章:10篇
阅读:15293
阅读:2487
阅读:7508
文章:28篇
阅读:34129
(2)(1)(1)(1)(4)(5)(4)(2)(2)(12)(1)(7)(2)(1)(1)(3)(3)(1)(1)(8)(10)(7)(9)(36)(8)(4)(2)(9)(22)(13)(17)(3)(4)(16)(7)(14)(126)(28)随笔 - 51&
评论 - 70&
&&&&&&&&&&&
  当自己程序遇到性能问题,比如IIs请求反应缓慢,客户端程序执行缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过长,然后再分析应该怎样解决。
  Dottrace是由JetBrains/ 公司开发的一款产品,它分dottrace Performance和dottrace Memory 两个工具,dottrace Performance用来分析代码性能,比如函数执行时间,调用次数,消耗时间比率等,dottrace Memory一般用来分析内存占用情况。dottrace可以跟踪.net编写的:应用程序,IIS挂接的程序,windows服务,silverlight,WCF服务程序等。还可以把跟踪的文件,以快照的方式保存下来,保存为dtp后缀的文件。跟踪后的结果,如果能找到对应用户的代码信息,还可以直接查看对应的源代码,并选择在VS里直接编辑该方法对应的文件。
  以下是一个跟踪客户端程序的示例:
1.选择要追踪的程序类型:
因为是客户端程序,这里我们选择Standalone Application。
2.选择可执行程序路径和参数并配置追踪方式:
如上图,Application、Arguments分别对应可执行程序的路径和需要的参数。
profiling type 有三种类型:
Tracing:它是通过获取CLR内部一个方法开始执行和结束执行的时间差来计算的分析时间。
Line-by-line:它是通过收集代码执行的每条语句的时间来,它计算出的时间更精确。
Sampling:它是抽样的方式,每隔一段时间(windows下大概是10ms),会暂停所有线程,并抓取堆栈里的信息,然后计算出代码执行时间差,这个选项可能会导致一些执行很短的方法抓取不到的问题。
Measure的三种类型:
Wall time(performance counter): 它是通过Performance Counter API来收集的信息,一般操作系统和各个硬件设备都提供性能计数的API供程序调用。
Thread time:它只支持Sampling的分析方式,它通过一个固定的线程来抓取堆栈信息计算时间,并且它只计算自己内部程序执行的时间,不管等待其他IO的时间。
Wall time(CPU instruction):它是通过读取TSC processor register里记录的方法进入和退出时间差的方式来计算的。
  根据上面的选项方式,一般我们要想完整分析自己程序的执行时间,建议可以采用Line-byline(或Tracing)和Wall time(CPU instruction)或Wall time(performance counter)的方式,因为如果用抽样和Thread time的搭配方式,会只计算自己内部时间,不能计算自己程序和外部程序交互的时间,会让自己分析性能时产生误导。
3.点击Run后会运行追踪程序
然后点击上图中的Get Snapshot就会产生程序执行的调用堆栈快照,里面就有我们最关心的执行时间。
4.下图是生成的结果:
上图中左侧红框中对应结果的五个视图:
Overview:这个可以看到该性能分析文件的抓取方式,比如上面例子为Line-by-line,Wall Time(CPU instruction)的方式,抓取的URL地址等,还会有该视图下的系统配置情况以及当前的模块以及方法个数等信息。
Threads Tree:记录当前每个线程执行的方法,以及方法的性能情况。
Call Tree:不管线程,按所有请求的入口为一条数据展现,但里面展现的排序是按照执行时间高低排序的,不是按照代码顺序展现的。
Plain List:展现所有非内核代码的方法列表,并展现每个方法执行时间和被调用次数。
Hot Spots:它会把所有代码包括内核代码的方法,按照执行时间排序顺序展现到列表,并记录每个方法的执行时间比率和时间等信息。
上图中展示的就是Threads Tree视图,从这个视图中我们可以看到主线程以及多个托管线程的执行时间和每个方法执行的时间,这样我们就很容易定位到程序的瓶颈所在。dottrace更多的应该是应用在iis网站性能分析上,它还能进行代码调试,能够分析 .NET 框架和 Silverlight 应用程序的语句级代码覆盖。同时集成了 ReSharper 的单元测试工具集,突出显示单元测试未覆盖的代码,可以检测出覆盖任何特别代码位置的单元测试,生成基于 XML 的代码覆盖报告。
  更多dottrace介绍,请猛击。
阅读(...) 评论()

我要回帖

更多关于 setclassname如何使用 的文章

 

随机推荐