----------------------------------c#如何释放内存?----------------------------------

by_封爱 版主 2015-07-09 01:41:07
我来描述下背景.可能我所谓的释放跟你们想象的不太一样.

你们可能觉得Dispose下或者using下甚至GC.Collect就可以释放内存..

但是我要说的不是一回事..

一个win程序加载的时候

我们假设有100个静态的List<T> =>t,窗体中有一个全局的timers.timer=>t以及List<int>=>lx
代码也简单

t.Elapsed += (o, e) =>
{
//可能通过一些逻辑判断从静态的list里取值并且给UI的文本框赋值
var list=static.t;
textbox1.BeginInvoke(new action(()=>{
textbox1.text=list.find(d=>d.name="小明").age;
lx.add(1);//这句我认为可能导致内存增加..所以有了下面一句
if (lx.Count >= 2000)
{
lx.RemoveRange(0, lx.Count - 2000);
}
}));
}

看起来似乎好像大概也没什么问题..静态变量加载的时候就有值了 lx集合也判断了.

但是这个程序运行很久之后 从任务管理器中看到这个exe的内存很高 并且持续++++

甚至运行2个月之后导致内存溢出或者其他无法捕获的错误(多内存错误)

所以我如何才能让我的exe得到及时的释放?
...全文
835 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
猪猪猪爱的 2015-07-13
  • 打赏
  • 举报
回复
可能是两个匿名lambda表达式的递归产生的,有可能死循环了 换一个写法 直接声明委托的方式 然后手动释放委托 别用表达式套表达式
於黾 2015-07-13
  • 打赏
  • 举报
回复
我写了一个测试 就是新建一个winform工程,默认有个主窗体 什么代码都不加 在我的笔记本上运行(直接运行exe而不是F5调试),它的内存就会不断的增加 而放到台式机上就完全不存在内存增长的问题
dylike 2015-07-13
  • 打赏
  • 举报
回复
引用DSAPI1.0.0.7 timer每N分钟或1分钟调用一次: DSAPI.内存相关.清理一下
程序员鼓励师 2015-07-12
  • 打赏
  • 举报
回复
fly4free 2015-07-11
  • 打赏
  • 举报
回复
dispose用于释放native代码创建的资源,从托管c++角度来讲,就会调用对象的!打头的析构函数 你给的代码跟这个没关系啊
sinat_29725645 2015-07-11
  • 打赏
  • 举报
回复
我感觉C语言就够学好久好久了
老李家的小二 2015-07-10
  • 打赏
  • 举报
回复
出现错误时,没有提示是第几行吗?
老李家的小二 2015-07-10
  • 打赏
  • 举报
回复
整错了
老李家的小二 2015-07-10
  • 打赏
  • 举报
回复
if (lx.Count >= 2000) { lx.RemoveRange(0, lx.Count - 2000); } lx.RemoveRange(0, lx.Count - 2000) -> lx.RemoveRange(0, 2000 - 2000) -> lx.RemoveRange(0,0) 是这样吗?
showjim 2015-07-09
  • 打赏
  • 举报
回复
问题应该不在这段代码上
showjim 2015-07-09
  • 打赏
  • 举报
回复
引用 14 楼 sbwwkmyd 的回复:
lx = lx.RemoveRange(0, lx.Count - 2000);
不好意思,搞错对象了,这里应该没有问题。
showjim 2015-07-09
  • 打赏
  • 举报
回复
lx = lx.RemoveRange(0, lx.Count - 2000);
Poopaye 2015-07-09
  • 打赏
  • 举报
回复
或者直接分配一个新的List,这样原List就能释放了
Poopaye 2015-07-09
  • 打赏
  • 举报
回复
.Net自带的List一旦分配了内存,无论你是Remove还是Clear都不会释放任何空间,如果有内存问题请自己实现一个容器
minidick 2015-07-09
  • 打赏
  • 举报
回复
试着把list.Add(model)注释掉,内存还是在缓慢增长。 问题出在不停地产生新的string,并赋值给model。及时的GC.Collect(),内存就不增长了。
失落的神庙 2015-07-09
  • 打赏
  • 举报
回复
BeginInvoke 这种情况用Invoke 同步委托吧。
by_封爱 版主 2015-07-09
  • 打赏
  • 举报
回复
以上程序中 内存会一直涨.....涨到一个点之后就不涨了..具体不清楚 跟什么有关系. (我猜是因为RemoveRange但是没有具体测试) 并且在过程中执行了list.clear的操作.内存还是一样没有变化...
引用 5 楼 duanzi_peng 的回复:
var list,,,,,, -》 这句不应该 搞到外部么? 每次计时使用 都应该clear吧
所以这个clear在哪也没什么用.
by_封爱 版主 2015-07-09
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
虽然我说不出原因,但我知道只要使用了 timers,那么就无一例外的造成内存占用慢慢的增加 timers.timer = 50 通常会在两小时内耗尽所有可用内存
那我还想2s一采集 那我用什么................就一个定时器 难道我还调度不成? 感觉小题大做啊... 或者还有其他的说明方案? 据说timer.timer是线程池管理的啊 没道理耗尽吧
by_封爱 版主 2015-07-09
  • 打赏
  • 举报
回复
为了更好的说明问题.我写了一个DEMO做测试..

public class common
    {
        public static List<int> a = new List<int>();
        public static List<int> b = new List<int>();
        public static List<int> c = new List<int>();
        public static List<int> d = new List<int>();
    }
   public class model
   {
       public string a { get; set; }
       public string b { get; set; }
       public string c { get; set; }
       public string d { get; set; }
   }
UI上拖4个文本框就够了. 代码如下

        public List<model> list { get; set; }
        private void Form1_Load(object sender, EventArgs e)
        {
            list = new List<model>();
            common.a = Enumerable.Range(1, 100).ToList();
            common.b = Enumerable.Range(1, 100).ToList();
            common.c = Enumerable.Range(1, 100).ToList();
            common.d = Enumerable.Range(1, 100).ToList();
            var timer = new System.Timers.Timer(666);
            timer.Enabled = true;
            timer.Elapsed += (a, b) =>
            {
                this.BeginInvoke(new Action(() =>
                {
                    var model = new model();
                    model.a = common.a.OrderBy(d => Guid.NewGuid()).FirstOrDefault().ToString();
                    model.b = common.b.OrderBy(d => Guid.NewGuid()).FirstOrDefault().ToString();
                    model.c = common.c.OrderBy(d => Guid.NewGuid()).FirstOrDefault().ToString();
                    model.d = common.d.OrderBy(d => Guid.NewGuid()).FirstOrDefault().ToString();

                    textBox1.Text = model.a;
                    textBox2.Text = model.b;
                    textBox3.Text = model.c;
                    textBox4.Text = model.d;

                    list.Add(model);
                    if (list.Count >= 2000)
                    {
                        list.RemoveRange(0, list.Count - 2000);
                    }
                }));
            };
        }
xuzuning 2015-07-09
  • 打赏
  • 举报
回复
虽然我说不出原因,但我知道只要使用了 timers,那么就无一例外的造成内存占用慢慢的增加 timers.timer = 50 通常会在两小时内耗尽所有可用内存
加载更多回复(5)
Node-RED是工业网物联网的重要组成部分,我最开始接触Node-RED,也算是一个偶然的机会吧,上班后领导安排我的第一个任务就是调研一下Node-RED,我之后上网查了一下,那个时候网上相对于Node-RED的资料也比较少,只知道它是IBM公司的一个开源项目。直到最近,发现许多大公司的产品都支持Node-RED,比如西门子公司的IoT2000,研华公司的WISE PaaS 网关,美国OPTO 22等设备中都安装了Node-RED,表明它在工业物联网和控制中已经广泛应用了。 那么工业物联网为什么要用它?它又处于工业物联网那个层次?它具有哪些特性?它帮助物联网解决了什么问题?为什么说它是柔性动态可重构的解决方案呢? ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 本门课程,老师将带领你从Node-RED的发展,工业物联网定位开始讲解,并带领着大家进行手把手安装Node-RED,实际操作演练Node-RED,并搭建一个物联网小平台,给大家带来更好的学习效果。  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 为了能够让小伙伴们快速了解本门课程的结构,本门课程从以下几个方面展开:Node-RED入门Node-RED安装与配置Node-RED教学实战Node-RED的优势与不足Node-RED能为我们带来什么Node-RED总结与展望

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧