C# 內存回收机制

x99599100 2014-09-29 03:52:36
写了一个发报表的程序,但发现程序占用的内存越来越大!想请教下怎么回收内存!
代码内容大致如下:

string sql="*****";//SQL语句内容省略
datatable dt=oraclehelper.gettable();//执行SQL语句
//下面经过一大堆数据的处理
string body="***********";//把得到的内容写成HTML存在STRING变量中
//最后通过System.Net.Mail 发送邮件;


table的内容比较大 用了System.gc 不太会用,可能没写好.有没有大神解答下
...全文
292 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justin-Liu 2014-09-30
  • 打赏
  • 举报
回复
引用 16 楼 x99599100 的回复:
[quote=引用 15 楼 FoxDave 的回复:] 把用完就该释放的资源释放,内存不会越来越大的,不用考虑GC
我都把用過的table 和變量釋放了.還是占內存很大.難道dispose()方法無效?[/quote] table不用dispose 非托管对象需要dispose
x99599100 2014-09-30
  • 打赏
  • 举报
回复
引用 15 楼 FoxDave 的回复:
把用完就该释放的资源释放,内存不会越来越大的,不用考虑GC
我都把用過的table 和變量釋放了.還是占內存很大.難道dispose()方法無效?
Justin-Liu 2014-09-30
  • 打赏
  • 举报
回复
把用完就该释放的资源释放,内存不会越来越大的,不用考虑GC
x99599100 2014-09-30
  • 打赏
  • 举报
回复
引用 11 楼 smthgdin 的回复:
1.把那些实现Idisposede的类型的创建包在using()里; 2.你看异常处理那里是不是有直接抛出的代码?是的话,omail.Dispose()不执行,资源不释放。 在catch后加上finally在里面释放一些资源。
我試試看
x99599100 2014-09-30
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
问题还是在 oraclehelper.gettable 这个里面,贴出它的代码 有没有正确释放资源
OracleConnection conn2 = new OracleConnection(connstring); DataTable dt = new DataTable(); OracleDataAdapter adapter = new OracleDataAdapter(sql, conn2); adapter.Fill(dt); return dt;
threenewbee 2014-09-30
  • 打赏
  • 举报
回复
问题还是在 oraclehelper.gettable 这个里面,贴出它的代码 有没有正确释放资源
smthgdin_020 2014-09-29
  • 打赏
  • 举报
回复
1.把那些实现Idisposede的类型的创建包在using()里; 2.你看异常处理那里是不是有直接抛出的代码?是的话,omail.Dispose()不执行,资源不释放。 在catch后加上finally在里面释放一些资源。
x99599100 2014-09-29
  • 打赏
  • 举报
回复
好像是發送郵件的問題,我把發郵件的方法拿掉就不會增加了!
        public void mail2(string body, string tomail, string tomail_name)
        {
            MailAddress from = new MailAddress("*****", "");
            MailAddress to = new MailAddress(tomail, tomail_name);
            MailMessage omail = new MailMessage(from, to);
            omail.Subject = "******";
            omail.Body = body;
            omail.IsBodyHtml = true;
            omail.BodyEncoding = System.Text.Encoding.GetEncoding("****");
            omail.Priority = MailPriority.High;
            SmtpClient client = new SmtpClient();
            client.Host = "mail.compeq-sz.com.cn";
            client.Credentials = new NetworkCredential("******", "xxx");
            try
            {
                client.Send(omail);
                ///Label7.Text = "xxxx";
            }
            catch (Exception ex)
            {
                ///Label7.Text = "ssss";
            }
            omail.Dispose();
        }
大神求幫助!
wrqlgd 2014-09-29
  • 打赏
  • 举报
回复
内存占用越来越多又不一定是这几行代码的问题……
x99599100 2014-09-29
  • 打赏
  • 举报
回复
引用 6 楼 sunny906 的回复:
DataTable里的数据用完就Clear

            string sql = "*****";//SQL语句内容省略
            DataTable dt = oraclehelper.gettable();//执行SQL语句
            //下面经过一大堆数据的处理
            string body = "***********";//把得到的内容写成HTML存在STRING变量中
            dt.Clear();
            //最后通过System.Net.Mail 发送邮件;
我加了,但是好像没有用!
sunny906 2014-09-29
  • 打赏
  • 举报
回复
不用显示地调用GC.Collect();因为调用GC只是通知CLR回收内存,至于什么回收则由回收机制决定
sunny906 2014-09-29
  • 打赏
  • 举报
回复
DataTable里的数据用完就Clear

            string sql = "*****";//SQL语句内容省略
            DataTable dt = oraclehelper.gettable();//执行SQL语句
            //下面经过一大堆数据的处理
            string body = "***********";//把得到的内容写成HTML存在STRING变量中
            dt.Clear();
            //最后通过System.Net.Mail 发送邮件;
x99599100 2014-09-29
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
你还是建立一个线程吧,不要放到timer里 放到timer里,如果你一个没有执行完,timer时间到了,会立即执行下一个 你的dt对象会越来越多的 放到线程里,加个while循环,一次执行完,再执行下一个.
但是内存的占用越来越大,除了TABLE还有什么会占用内存的吗?
  • 打赏
  • 举报
回复
System.GC.Collect(); 回收的是继承IDispose接口的资源 table放个百八十万的没事。
於黾 2014-09-29
  • 打赏
  • 举报
回复
还有,从你给出的这点代码,根本看不出有任何资源需要释放.
於黾 2014-09-29
  • 打赏
  • 举报
回复
你还是建立一个线程吧,不要放到timer里 放到timer里,如果你一个没有执行完,timer时间到了,会立即执行下一个 你的dt对象会越来越多的 放到线程里,加个while循环,一次执行完,再执行下一个.
x99599100 2014-09-29
  • 打赏
  • 举报
回复
这些代码是写在timer里面的,一直挂在服务器.不会关闭

110,535

社区成员

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

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

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