我的应用程序的性能会随着一天的运行而恶化。
我怀疑它是垃圾收集器,我如何验证这一点?有没有办法找出造成垃圾收集开销的对象/函数?
是否有一种以编程方式手动执行垃圾收集以清除内存泄漏的方法?
谢谢,
编辑来自非托管api的调用的应用程序一端的,以接受数据,处理数据,然后在第二端从套接字发送消息。从第二端开始,它将返回它发送的消息的后续数据。应用程序打开5-6个套接字以从第二端发送和接收数据。它经常将大量数据记录到单独线程上的windows文件系统中。
我的测量包括在发送数据之前的时间戳(queryperformance ),以及当我从套接字上的另一个进程接收后续信息时再次使用时间戳。我注意到在我打开的多个套接字中,性能下降只发生在一个套接字连接上。
在套接字上的时间戳和sending.receiving数据之间的处理包括迭代两个数组列表,其中有不超过5-6个对象和一对回调。
任务MAnager窗口中的内存使用量并没有明显增加。运行6-7小时后,从96 to到100 to。
下面是运行perfmon的一些观察结果。
“终化幸存者”和“促进第0代的终结记忆”随着时间的推移逐渐增加。
“第0代收藏品”从开始的1819年到4小时后的6000部。“第1代收集”占第0代收集的10%-12%,“第2代收集”占1%或更少。COnsidering Gen 0的集合数都是累积的,这可能是不受关注的。
GC句柄“从850多个上升到4000。
发布于 2010-10-26 22:01:53
内存泄漏的可能性要大得多,手动调用GC无助于此:如果您的代码没有释放对象,它就无法释放对象。
编辑
由于GC句柄在增加,此页建议有一些非托管资源没有被释放。例如,我曾在位图中遇到过这种情况,但为了获得更具体的建议,您可能需要告诉我们更多关于您的应用程序的信息。
这是一条线可能会给你一些有用的洞察力。
发布于 2010-10-26 22:03:26
您可以调用GC.Collect()强制垃圾收集,但这不会修复内存泄漏。尝试内存分析器(如蚂蚁内存分析器)以查找内存泄漏。
蚂蚁记忆分析器
发布于 2010-10-27 02:10:04
这可能不一定是记忆问题。使用(在管理工具中查看)监视应用程序的CPU、内存、GDI对象计数、句柄计数,并查看在应用程序的整个生命周期中是否存在这些情况。
通常,您会发现您正在使用System.Drawing中的某些内容,而不是在其上调用find (),从而导致句柄泄漏。我发现句柄泄漏往往比内存泄漏更快地侵蚀性能。处理泄漏不会导致GC压力,这意味着你可能会像筛子一样漏手柄,而GC永远也不会知道两者的区别。
所以,长话短说:测量,测量,测量。那你就知道该修什么了。
https://stackoverflow.com/questions/4028390
复制相似问题