0

我正在为 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
4

2 回答 2

2

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

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

于 2012-07-08T17:32:40.980 回答
1

在评论中,您说强制 GC 有效(有效 = 清理垃圾)。这就是它应该如何工作的方式。

GC 按需发生。需求要么是发生了大量分配,要么是内存压力,要么是手动触发。这些都没有发生,这就是垃圾没有被清理干净的原因。

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

于 2012-07-08T20:20:19.303 回答