日期:2014-05-18  浏览次数:21370 次

Queue.Dequeue 及时释放资源
我有一个全局变量Queue<T>,里面塞N笔对象,然后一笔笔移出对象,为什么该对象对应的内存资源不释放。

有什么办法可以做到及时释放呢,即移一笔,对应的内存就释放掉。

因设计问题,只能是全局变量,这Queue永远出不了作用域,是不是就只能永远这么涨下去。


PS:T是一个蛮复杂的结构体,所以内存涨的很快。

------解决方案--------------------
内存并不是立刻就能看到效果,回收机制只在适时的是会才会把内存交还给系统
------解决方案--------------------
回收与否和Enq/Deq无关
移出以后手动回收就是了,重写一下对象的回收机制
另外如果无法改变对象,那只能定期轮询GC.Collect,就像你说的下下策
------解决方案--------------------
如果说,你的T设计的非常好,大小可以固定,那么你移除的对象即使不回收内存,下次添加新对象进入时,也不会重新分配空间,而是直接使用上次移除的对象占有的空间。只有当下次要获取连续空间时,找不到一个可用的连续空间,才会重新向系统申请新的内存空间,导致内存上涨。
如果每次都申请新的内存空间,并导致内存上涨,那么你是否调用GC.Collect 强制回收都一样,GC.Collect回收后,GC里面将清理一遍,必然导致下次申请空间需要像系统申请,但是你既然总是要像系统申请内存(这肯定是设计问题),那么还不如调用GC.Collect把不能使用的内存缓存给清空了更好。
------解决方案--------------------
GC.WaitForFullGCComplete 方法 查询CLR引发的完整垃圾回收完成的状态。(默认只是回收托管资源)
------解决方案--------------------
探讨
引用:
会不会是Queue的容量问题。可尝试使用TrimExcess方法以减少容量

没用。