C# 创建内存泄漏的C代码。

C# 创建内存泄漏的C代码。,c#,memory,memory-leaks,C#,Memory,Memory Leaks,我想编写一个简单的C#程序/控制台应用程序来创建一个缓慢且可控的内存泄漏。我希望程序慢慢消耗掉系统内存。我需要这个来做我正在测试的其他东西 有人建议我使用: Marshal.AllocHGlobal(numbytes) 附在计时器上的 以下是我试图实现的代码: class Program { static Timer timer = new Timer(); static void Main(string[] args) { timer.Elapsed

我想编写一个简单的C#程序/控制台应用程序来创建一个缓慢且可控的内存泄漏。我希望程序慢慢消耗掉系统内存。我需要这个来做我正在测试的其他东西

有人建议我使用:

Marshal.AllocHGlobal(numbytes)
附在计时器上的

以下是我试图实现的代码:

class Program
{
    static Timer timer = new Timer();

    static void Main(string[] args)
    {
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

        start_timer();
        Console.Read();
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        IntPtr hglobal = Marshal.AllocHGlobal(100);
        Marshal.FreeHGlobal(hglobal);

        Process proc = Process.GetCurrentProcess();
        Console.WriteLine(proc.PrivateMemorySize64);
    }

    private static void start_timer()
    {
        timer.Start();
    }
}

输出似乎表明内存仍在管理中,垃圾收集正在完成它的工作。有人能帮我解决这个问题吗?我的目标是确实造成内存泄漏并耗尽系统资源。有人请建议我的代码有什么问题,或者一个更好的选择

对于泄漏,您需要实际泄漏内存。现在,您不会泄漏任何,因为您释放了它:

    IntPtr hglobal = Marshal.AllocHGlobal(100);
    // DO NOT DO THIS IF YOU WANT A LEAK: Marshal.FreeHGlobal(hglobal);

对于泄漏,您需要实际泄漏内存。现在,您不会泄漏任何,因为您释放了它:

    IntPtr hglobal = Marshal.AllocHGlobal(100);
    // DO NOT DO THIS IF YOU WANT A LEAK: Marshal.FreeHGlobal(hglobal);

对于泄漏,您需要实际泄漏内存。现在,您不会泄漏任何,因为您释放了它:

    IntPtr hglobal = Marshal.AllocHGlobal(100);
    // DO NOT DO THIS IF YOU WANT A LEAK: Marshal.FreeHGlobal(hglobal);

对于泄漏,您需要实际泄漏内存。现在,您不会泄漏任何,因为您释放了它:

    IntPtr hglobal = Marshal.AllocHGlobal(100);
    // DO NOT DO THIS IF YOU WANT A LEAK: Marshal.FreeHGlobal(hglobal);


当你说“内存泄漏”时,你是指GC不会释放的内存分配吗?为什么不直接将数据推送到引用列表中?创建一个无限循环来进行一些计算。调用
Marshal.FreeHGlobal
deallocate您刚才分配的内存?我很好奇这是什么应用程序。听起来很有趣。我认为雅各布的建议是最好的。只需分配一个
列表
,然后在循环中向其添加对象。你可以拥有真正的粒度控制,因为如果你想每秒增加16个字节,你可以定义一个具有3个int的类(假设我们在32位窗口上,12个字节用于对象4作为参考),然后在循环中放入1000毫秒的睡眠。当你说“内存泄漏”时,你是指GC不会释放的内存分配吗?为什么不直接将数据推送到引用列表中?创建一个无限循环来进行一些计算。调用
Marshal.FreeHGlobal
deallocate您刚才分配的内存?我很好奇这是什么应用程序。听起来很有趣。我认为雅各布的建议是最好的。只需分配一个
列表
,然后在循环中向其添加对象。你可以拥有真正的粒度控制,因为如果你想每秒增加16个字节,你可以定义一个具有3个int的类(假设我们在32位窗口上,12个字节用于对象4作为参考),然后在循环中放入1000毫秒的睡眠。当你说“内存泄漏”时,你是指GC不会释放的内存分配吗?为什么不直接将数据推送到引用列表中?创建一个无限循环来进行一些计算。调用
Marshal.FreeHGlobal
deallocate您刚才分配的内存?我很好奇这是什么应用程序。听起来很有趣。我认为雅各布的建议是最好的。只需分配一个
列表
,然后在循环中向其添加对象。你可以拥有真正的粒度控制,因为如果你想每秒增加16个字节,你可以定义一个具有3个int的类(假设我们在32位窗口上,12个字节用于对象4作为参考),然后在循环中放入1000毫秒的睡眠。当你说“内存泄漏”时,你是指GC不会释放的内存分配吗?为什么不直接将数据推送到引用列表中?创建一个无限循环来进行一些计算。调用
Marshal.FreeHGlobal
deallocate您刚才分配的内存?我很好奇这是什么应用程序。听起来很有趣。我认为雅各布的建议是最好的。只需分配一个
列表
,然后在循环中向其添加对象。你可以有真正的细粒度控制,也就是说,如果你想每秒增加16个字节,你可以用3个int定义一个类(假设我们在32位窗口上,12个字节用于对象4作为参考),然后在循环中放入1000毫秒的睡眠仍然没有泄漏。输出显示,当proc.PrivateMemorySize64达到22585344时,它会下降到一个较低的数字,并增长到22585344。这只是继续下去。此外,任务管理器显示系统内存使用没有增加。我在这里遗漏了什么吗?@Zolt是22585344进程虚拟地址空间的大小?所以我注释掉了
Marshal.FreeHGlobal(hglobal)仍然没有泄漏。输出显示,当proc.PrivateMemorySize64达到22585344时,它会下降到一个较低的数字,并增长到22585344。这只是继续下去。此外,任务管理器显示系统内存使用没有增加。我在这里遗漏了什么吗?@Zolt是22585344进程虚拟地址空间的大小?所以我注释掉了
Marshal.FreeHGlobal(hglobal)仍然没有泄漏。输出显示,当proc.PrivateMemorySize64达到22585344时,它会下降到一个较低的数字,并增长到22585344。这只是继续下去。此外,任务管理器显示系统内存使用没有增加。我在这里遗漏了什么吗?@Zolt是22585344进程虚拟地址空间的大小?所以我注释掉了
Marshal.FreeHGlobal(hglobal)仍然没有泄漏。输出显示,当proc.PrivateMemorySize64达到22585344时,它会下降到一个较低的数字,并增长到22585344。这只是继续下去。此外,任务管理器显示系统内存使用没有增加。我是不是遗漏了什么?@Zolt是22585344进程虚拟地址空间的大小?