垃圾收集与通用堆栈

时间:2012-07-08 17:18:24

标签: vb.net silverlight-4.0 garbage-collection

我正在为Silverlight中的自定义文本框控件编写多个撤消/重做系统。我现在正在做的事情是减少内存消耗。

所以我遇到的问题是我使用的堆栈在内存中保存的时间太长了。

我认为,当Count自然地达到0或者由于事件而清除堆栈时,完全擦除堆栈相对便宜。所以我试图用这个代码做到这一点,希望GC能够把它拿起......

TextHistory.Clear()
TextHistory = Nothing

但这肯定不起作用,这个堆栈可能会容纳50 MB或更多。顺便说一下,TextHistoryStack(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

2 个答案:

答案 0 :(得分:2)

Stack(Of T)使用T数组实现。在50 MB时,该数组已在大型对象堆上复制和生长多次,只能通过第2代收集。大型对象堆也不会被压缩,因此如果为数组副本分配了额外的空间,则该空间将保持分配状态GC收集数组后,剩下的“孔”将可用于其他对象。

如果您的堆栈实际上需要增长这么大,您可以通过链接列表实现自己的堆栈来使用大型对象堆。

答案 1 :(得分:1)

在评论中你说迫使GC工作(工作=清理垃圾)。这就是它应该如何运作。

GC按需发生。需求是大量的分配,内存压力或手动触发。这些都没有发生,这就是为什么垃圾没有得到清理。

GC不会基于时间运行(比如每分钟左右)。