CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

关于占用内存不能释放的问题!

楼主Bmonkey(CPP.UNIX|曾经得DotNeter)2005-08-26 10:55:45 在 .NET技术 / C# 提问

偶有一个程序,调用了动态库和机具进行操作,每次操作之后内存都要增加很多,而且窗口关闭之后内存仍然不释放掉,调用gc.collect也没用,请问这中问题该如何解决? 问题点数:200、回复次数:16Top

1 楼lyb_abiandbel(专注于OO分析与设计)回复于 2005-08-26 11:10:27 得分 0

不用过多考虑内存释放的问题,除非你的程序使用了很多非托管的资源,那就要用Dispos(),  
   
  否则不要过多使用,会影响程序性能,  
   
  垃圾回收机制会自动处理无用的托管资源释放的问题,  
   
  .net是自动的,不需要考虑太多。Top

2 楼redcomet2004(光荣的罗马)回复于 2005-08-26 11:14:43 得分 0

托管的没什么办法控制,只要别忘了Dispos就行Top

3 楼xrascal(横刀夺爱)回复于 2005-08-26 11:15:09 得分 0

垃圾回收机制会自动处理无用资源。  
  但是它不会马上释放。  
   
  如果可以的话,最好还是用程序主动释放无用资源。Top

4 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-26 11:33:36 得分 0

在最小化的时候,程序占用的内存下去了,(应该是此时执行垃圾收集了吧?)但是如果一直最大话的话那内存占用一直位置着,我gc.collect也不行,请问该如何解决这个问题??  
   
  快给点意见啊,偶分多,解决了再发分Top

5 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-26 11:37:46 得分 0

偶有一个类,没次操作都要调用两个动态库不止一次,动态库应该算非托管资源了吧,那么我是否应该自己实现该类的dispose呢?Top

6 楼Sunmast(速马@Redmond, WA)回复于 2005-08-26 11:52:46 得分 0

>>>   在最小化的时候,程序占用的内存下去了,(应该是此时执行垃圾收集了吧?)  
  No,   此时只是物理内存中的一部分数据被交换到虚拟内存(页面文件)中而已,并不触发垃圾收集条件  
   
  非托管资源不受GC管理,要自己进行释放操作。实现Dispose模式只是一种标准的做法Top

7 楼andywang110001(痞子王)回复于 2005-08-26 12:05:08 得分 0

GC.Collect();GC.WaitForPendingFinalizers();不过有一点性能损失Top

8 楼tangyong12(海洋之星)回复于 2005-08-26 12:17:40 得分 0

调用用dispose方法试试Top

9 楼weisunding(鼎鼎)回复于 2005-08-26 12:42:52 得分 0

没有办法,用GC.Collect都不是最好办法Top

10 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-26 13:48:36 得分 0

我在msdn里面看了看释放非托管的例子,它对于IntPtr类型的有一个释放,认为是非托管资源。那么请问,如下:  
   
  [DllImport(conEncrypt,   SetLastError=true,   CharSet=CharSet.Ansi),   SuppressUnmanagedCodeSecurity]  
  internal   static   extern   int   EncryptOfDES_HD(byte[]   Key,   byte[]   Source,   int   Blocks);  
   
  [DllImport(conConversion,   SetLastError=true),   SuppressUnmanagedCodeSecurity]  
  internal   static   extern   int   Conversion(ref   int   Command,   IntPtr   buffer,   int   nSizeOfParameter);  
   
  如果象如上的两个非托管方法,调用的话,那么传入上面两个方法的参数Key,Command,一个是byte[]类型的一个是int型的,它们也被认为是非托管资源吗?如果是,   那么该如何释放啊?Top

11 楼Sunmast(速马@Redmond, WA)回复于 2005-08-26 14:57:19 得分 0

传入参数都不需要手工释放,传出参数数据如果是在堆上分配的,则需要用Marshal.FreeCoTaskMem手工释放Top

12 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-28 08:13:04 得分 0

问题大概解决了,不是这块的问题,但是就绪问问  
  我对于堆上传入参数用了Marshal.FreeCoTaskMem来释放了的.但是偶还是不清楚,在p/invoke下,是否全部参数都不需要手动释放呢?我看msdn上有个释放非托管类型的资源的例子,它就对IntPtr类型进行了释放,而且又是通过p/invoke调用的kenerl32.dll的一个close....的方法进行的,偶有点迷惑了,请讲解讲解.^_^Top

13 楼wxwx110(无敌大馒头)回复于 2005-08-28 08:30:05 得分 0

吸构函数还是要学的不能完全依靠.NET的垃圾回收,那东西什么时候释放内存真的没准,所以当使用完对象后最好都要切断它和托管堆的连接,同时调用相应的方法来释放掉就象C++中的代码一样Top

14 楼Sunmast(速马@Redmond, WA)回复于 2005-08-28 10:32:14 得分 200

传入参数都在GC堆上分配内存,所以可以不管  
  调用结束后,如果还有任何在CRT堆上的数据,则必须手工释放;如果有系统对象,比如说一个GDI句柄,也必须调用相关的方法释放资源Top

15 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-28 17:17:56 得分 0

版主的意思就是,简单数据类型都是可以不需要去管理的?  
  IntPtr是系统对象?Top

16 楼Bmonkey(CPP.UNIX|曾经得DotNeter)回复于 2005-08-28 19:17:40 得分 0

自己再好好理解一下,结贴了.Top

相关问题

  • resin服务器,为什么不能将session的bean占用的内存释放调呀?
  • 线程中释放占用的内存问题。
  • Application("*******")所占用的内存如何释放?
  • 这样释放CArray占用的内存正确吗?
  • 怎样释放类对象占用的内存? 散分!散分!
  • 请教如何释放Console窗口占用的内存
  • 数据库占用内存可以定期释放吗?
  • aspnet_wp占用的内存怎么释放?
  • return DataSet 后如何释放 DataSet 所占用内存?!
  • 怎样彻底Free掉动态创建的webbrowser,释放占用的内存??---Free好像不能,Quit也不可以!

关键词

  • .net
  • 内存
  • 垃圾
  • 动态库
  • 数据
  • 解决
  • 释放
  • 调用
  • 占用
  • 资源

得分解答快速导航

  • 帖主:Bmonkey
  • Sunmast

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo