C# MDI子窗体关闭,为什么内存不会释放?

时间:2021-12-20 23:51:53
用C#写了一个MDI窗体,发现每次子窗体关闭的时候,任务管理器中看到的内存都不会少
如果反复不断的开关子窗体,那么内存使用就会不断增加
要怎么样才能把占用的内存释放出来呢?

14 个解决方案

#1


清空对象

#2


怎么清空?

我用了GC.Collect();也不见效果

#3


GC.COLLECT()不建议频繁使用.没有非托管的对象,会有这样情况?
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.

#4


内存没有泄露,只是反复打开的时候,内存一直在增加

#5


打开一个就new一个对象?

#6


        /// <summary>
        /// 打开子窗体
        /// </summary>
        /// <param name="form"></param>
        private void AddSubForm(Form form)
        {
            if (FindSubForm(form.Text)) return;
            form.MdiParent = this;
            form.WindowState = FormWindowState.Maximized;
            form.Show();
        }
        /// <summary>
        /// 查找子窗体
        /// </summary>
        /// <param name="caption"></param>
        /// <returns></returns>
        private bool FindSubForm(string caption)
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm.Text == caption)
                {
                    frm.WindowState = FormWindowState.Maximized;
                    frm.Activate();
                    return true;
                }
            }
            return false;
        }

我是这么写的

#7


不会释放

打开时之创建一个实例

#8


垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.

#9


#region MDI子窗体实例化一次
        /// <summary>
        /// 名称:CheckChildOpenState
        /// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
        /// </summary>
        /// <param name="MdiForm">容器窗体</param>
        /// <param name="ChildForm">子窗体</param>
        public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
        {
            foreach (Form tempChildForm in MdiForm.MdiChildren)
            {
                if (tempChildForm.Name == ChildForm.Name.ToString())
                {
                    if (tempChildForm.WindowState == FormWindowState.Minimized)
                    {
                        tempChildForm.WindowState = FormWindowState.Normal;
                    }
                    tempChildForm.Activate();
                    return;
                }
            }
            ChildForm.MdiParent = MdiForm;
            ChildForm.Show();
        }
        #endregion


最后关闭的时候,清理一下。this.Dispose()

#10


引用 8 楼 zhulinxiaofeng 的回复:
垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.


我是想关子窗体的时候,就把子窗体的内存释放,用托管的,似乎一直在增加中

#11


引用楼主 yuyingying1986 的回复:
用C#写了一个MDI窗体,发现每次子窗体关闭的时候,任务管理器中看到的内存都不会少
 如果反复不断的开关子窗体,那么内存使用就会不断增加
 要怎么样才能把占用的内存释放出来呢?


窗口关闭的时候自动执行Form.Dispose() 方法,释放的是非托管资源。
GC.Collect()释放的才是托管资源

#12


Form.Close(),Form.Dispose(),GC.Collect()
上面的三个我全都用了,但是内存还是只增不少

#13


自已顶

#14


每次打开都会实例化一个对象,内存上都会增加这个事正常的呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。

#1


清空对象

#2


怎么清空?

我用了GC.Collect();也不见效果

#3


GC.COLLECT()不建议频繁使用.没有非托管的对象,会有这样情况?
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.

#4


内存没有泄露,只是反复打开的时候,内存一直在增加

#5


打开一个就new一个对象?

#6


        /// <summary>
        /// 打开子窗体
        /// </summary>
        /// <param name="form"></param>
        private void AddSubForm(Form form)
        {
            if (FindSubForm(form.Text)) return;
            form.MdiParent = this;
            form.WindowState = FormWindowState.Maximized;
            form.Show();
        }
        /// <summary>
        /// 查找子窗体
        /// </summary>
        /// <param name="caption"></param>
        /// <returns></returns>
        private bool FindSubForm(string caption)
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm.Text == caption)
                {
                    frm.WindowState = FormWindowState.Maximized;
                    frm.Activate();
                    return true;
                }
            }
            return false;
        }

我是这么写的

#7


不会释放

打开时之创建一个实例

#8


垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.

#9


#region MDI子窗体实例化一次
        /// <summary>
        /// 名称:CheckChildOpenState
        /// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
        /// </summary>
        /// <param name="MdiForm">容器窗体</param>
        /// <param name="ChildForm">子窗体</param>
        public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
        {
            foreach (Form tempChildForm in MdiForm.MdiChildren)
            {
                if (tempChildForm.Name == ChildForm.Name.ToString())
                {
                    if (tempChildForm.WindowState == FormWindowState.Minimized)
                    {
                        tempChildForm.WindowState = FormWindowState.Normal;
                    }
                    tempChildForm.Activate();
                    return;
                }
            }
            ChildForm.MdiParent = MdiForm;
            ChildForm.Show();
        }
        #endregion


最后关闭的时候,清理一下。this.Dispose()

#10


引用 8 楼 zhulinxiaofeng 的回复:
垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.


我是想关子窗体的时候,就把子窗体的内存释放,用托管的,似乎一直在增加中

#11


引用楼主 yuyingying1986 的回复:
用C#写了一个MDI窗体,发现每次子窗体关闭的时候,任务管理器中看到的内存都不会少
 如果反复不断的开关子窗体,那么内存使用就会不断增加
 要怎么样才能把占用的内存释放出来呢?


窗口关闭的时候自动执行Form.Dispose() 方法,释放的是非托管资源。
GC.Collect()释放的才是托管资源

#12


Form.Close(),Form.Dispose(),GC.Collect()
上面的三个我全都用了,但是内存还是只增不少

#13


自已顶

#14


每次打开都会实例化一个对象,内存上都会增加这个事正常的呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。