我正在为Silverlight中的自定义文本框控件编写多个撤消/重做系统。我现在正在做的事情是减少内存消耗。
所以我遇到的问题是我使用的堆栈在内存中保存的时间太长了。
我认为,当Count
自然地达到0或者由于事件而清除堆栈时,完全擦除堆栈相对便宜。所以我试图用这个代码做到这一点,希望GC能够把它拿起......
TextHistory.Clear()
TextHistory = Nothing
但这肯定不起作用,这个堆栈可能会容纳50 MB或更多。顺便说一下,TextHistory
是Stack(Of Moment)
。这是Moment
类......
Public Class Moment
Public Text As String
Public SelectionStart As Integer
Public SelectionLength As Integer
Public Sub New(ByRef _Text As String, _SelectionStart As Integer, _SelectionLength As Integer)
Text = _Text
SelectionStart = _SelectionStart
SelectionLength = _SelectionLength
End Sub
End Class
答案 0 :(得分:2)
Stack(Of T)使用T数组实现。在50 MB时,该数组已在大型对象堆上复制和生长多次,只能通过第2代收集。大型对象堆也不会被压缩,因此如果为数组副本分配了额外的空间,则该空间将保持分配状态GC收集数组后,剩下的“孔”将可用于其他对象。
如果您的堆栈实际上需要增长这么大,您可以通过链接列表实现自己的堆栈来使用大型对象堆。
答案 1 :(得分:1)
在评论中你说迫使GC工作(工作=清理垃圾)。这就是它应该如何运作。
GC按需发生。需求是大量的分配,内存压力或手动触发。这些都没有发生,这就是为什么垃圾没有得到清理。
GC不会基于时间运行(比如每分钟左右)。