![]() |
1
18
NET Framework使用托管内存,所有内容(除了分配的非托管资源)都被垃圾收集。
如果在类中打开文件、数据库连接或任何其他非托管资源,请实现IDisposable接口,并在Dispose方法中取消分配非托管资源。 任何实现IDisposable的类都应该显式关闭,或者使用类似块的方法(我认为很酷)使用;
|
![]() |
2
11
GC的第一件事是它是不确定的;如果您希望及时清理资源,请实施
用于调查内存泄漏。。。“SOS”是最简单的路线之一;您可以使用SOS查找类型的所有实例,以及可以看到的内容,等等。 |
![]() |
3
3
一般来说,在C#中,您越不担心内存分配,您的情况就越好。当我在收集方面遇到问题时,我会让档案员告诉我。
|
![]() |
4
3
我能想到的内存泄漏的主要来源是:
|
![]() |
5
1
内存管理需要考虑的另一件事情是,如果您正在实现任何观察者模式,而不是正确地处理引用。 对象A监视对象B 对象B被释放如果从A到B的引用未被释放,则GC将不会正确地释放该对象。由于事件处理程序仍然被分配,GC不会将其视为未使用的资源。 如果你有一小组你正在使用的对象,这可能与我无关。但是,如果您使用数千个对象,这可能会在应用程序的整个生命周期中导致内存逐渐增加。
嗯 |
![]() |
6
1
我建议使用 .NET Memory Profiler
.NET内存探查器将帮助您:
看看他们的视频教程: |
![]() |
7
1
我想建议一些额外的资源;在学习.NET GC的细节以及如何解决.NET应用程序中的内存问题时,我发现以下内容非常有价值。 CLR via C# 杰弗里·里克特是一位 书仅就GC和内存这一章而言,这是值得购买的价格。 这 blog (由一位Microsoft“ASP.NET升级工程师编写)经常是我获取有关使用WinDbg、SOS和发现某些类型内存泄漏的提示和技巧的来源。Tess甚至设计了.NET调试演示/实验室,它将引导您了解常见的内存问题以及如何识别和解决这些问题。 |
![]() |
8
0
CLR profiler 学习如何正确使用它需要一些时间,但毕竟它是免费的。(它多次帮助我发现内存泄漏) |
![]() |
9
0
确保对象被删除或在.NET行话中被垃圾收集的最佳方法是确保对象的所有根引用(可通过方法和对象跟踪到线程调用堆栈上第一个方法的引用)都设置为null。
循环引用不会造成惩罚或内存泄漏的可能性,因为GC会在对象图中标记它访问过的对象。在委托或事件处理程序的情况下,通常会忘记删除事件中对目标方法的引用,因此如果事件是根事件,则无法收集包含目标方法的对象。 |
![]() |
10
0
注意:以下仅适用于包含非托管资源的类型。它对纯托管类型没有帮助。
|
![]() |
SkyBlue · Java Spring服务的内存/垃圾收集器问题 1 年前 |
![]() |
Guy_Hanan · 一个关于C++程序内存泄漏的问题 1 年前 |
![]() |
yeerk · 在Python中跟踪特定对象的引用(内存泄漏) 1 年前 |
|
Priyanshu Sinha · Django内存泄漏/工人人数减少 1 年前 |
![]() |
lHumanizado · Golang defer并不总是执行 2 年前 |