如何监控c#中的内存泄漏
本文关键字:内存 泄漏 何监控 监控 | 更新日期: 2023-09-27 18:11:46
我正在尝试做内存泄漏Visual c#。我使用了以下代码:
class Program
{
static void Main(string[] args)
{
List<float> s = new List<float>();
while (true) {
s.Add(10 ^ 10);
}
}
}
我运行了这个程序,在2分钟内,我得到了OutofMemory Exception。这是内存泄漏的真实代码吗?我在监控主内存空间,它有足够的空间。如果这是内存泄漏,那么是什么原因导致这个即使有空间在ram?我如何监控这个泄漏?
这不是内存泄漏。您添加的每个数字仍然可以从列表对象访问。你的代码只是使用了大量的内存,最终你耗尽了。
您可能已经达到单个对象的最大内存量。
垃圾收集器将确保当不再有对对象的引用时,与该对象关联的内存将被释放。
您的示例不是内存泄漏,您将耗尽内存,但您创建的所有对象都可以被运行的程序访问。泄漏是指内存中有无法访问的对象。下面是。net中最常见的泄漏原因,订阅静态事件的例子:
internal class Program
{
public static event EventHandler SomeStaticEvent;
private static void Main()
{
while (true)
{
var a = new A();
//here a goes out of scope but won't be collected by GC because Program still holds reference to "a" by a static event subsription
}
}
public class A
{
public A()
{
//if you comment this line, there is no reference from Program to A and a will be GC-ed and memory allocated will be released
Program.SomeStaticEvent+=ProgramOnSomeStaticEvent;
}
private void ProgramOnSomeStaticEvent(object sender, EventArgs eventArg){}
}
}
在订阅静态事件或长活对象的事件时要小心。您的程序正在泄漏,并且不容易发现原因。在对象超出作用域之前,始终取消订阅此类事件
你期望s.Add
做什么?每次执行时,它都会向列表中添加一个新元素。所以第一次,你会得到一个只有一个元素的列表,第二次s
现在是一个有两个元素的列表,第一百万次它会有一百万个元素在里面。它会一直这样,直到大到内存无法容纳。