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 に答える