关于占用内存不能释放的问题!
偶有一个程序,调用了动态库和机具进行操作,每次操作之后内存都要增加很多,而且窗口关闭之后内存仍然不释放掉,调用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




