0

VB.NET 2010、フレームワーク 3.5

カスタム オブジェクト タイプのリストを作成した後、メモリを元に戻す方法を見つけようとしています。リストをスコープ外に強制すると、使用しているメモリが再割り当てされることはわかっていますが、実用的に行う方法が必要です。誰もこれを行う方法を知っていますか?

Public Class List_Of_T_Test
    Private MyTestClass As New List(Of TestClass)


Private Sub List_Of_T_Test_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Const LIST_COUNT As Integer = 5000000
    Dim Count As Integer = 0

    MsgBox("Note 'PF usage' on Windows Task Manager 'before the 5m list' is created")

    Do Until Count > LIST_COUNT ' 5 million iterations 
        MyTestClass.Add(New TestClass With {.Value1 = CStr(Count), .Value2 = CStr(Count + 1)})
        Count = Count + 1
    Loop

    MsgBox("Note 'PF usage' on Windows Task Manager 'after the 5m list' was created")

    DestroyMyTestClassList()

    MsgBox("When flow arrives here, I need MyTestClass to be gone, all memory to have been reallocated, or close to where it was before the list was created")

End Sub

Private Sub DestroyMyTestClassList()

    ' Does anyone know what code to put here, code that would totally destroy 
    ' the MyTestClass and the 5 million items in it, reallocate the memory used 
    ' by the list Of(T) MyTestClass

    ' MyTestClass.Clear()   ' Doesn't work  ??
    ' MyTestClass = Nothing ' Doesn't work  ?

End Sub
Public Class TestClass

    Public Property Value1 As String
    Public Property Value2 As String

End Class

End Class

範囲外にするという考えは理解していますが、フォームを破棄したり、閉じたり、別のフォームをロードしたりしても、メモリはまだ戻ってきませんでした。GC は回収ビジネスか何かに手を出していなかったと思います。GCの動作をもう少し観察する必要があると思います

Jods という名前のこのフェラーは、なぜ私がこれをプログラムで行いたいのかについて興味を持っていました。私がやっている仕事の種類は、本質的に非常に動的な大量の種類のカスタム リストを作成しているため、それらを破棄し、古いものがなくなったことを確認して再構築する方法が必要です。これらのアプリは何週間もノンストップで実行されることがあります。. 記憶力などに注意が必要です。

誰かに興味がある場合は、オブジェクトのリストからメモリを再割り当てしているように見える以下のコードを参照してください

Public Class List_Of_T_Test
Private MyTestClass As New List(Of TestClass)

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Const LIST_COUNT As Integer = 5000000
    Dim Count As Integer = 1

    Do Until Count > LIST_COUNT ' 5 million iterations 
        MyTestClass.Add(New TestClass With {.Value1 = CStr(Count), .Value2 = CStr(Count + 1)})
        Count = Count + 1
    Loop
    MsgBox(MyTestClass.Count.ToString)
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    ' This seems to completely reallocate the memory, paste this into a form's code, 
    ' add two buttons, click button1 once, or few times while watching the 
    ' 'Windows Task Manager' PF Usage.

    ' Then Click button2 once and the memory spike levels off, it all comes back

    MyTestClass = New List(Of TestClass)
    GC.Collect()  ' ?
End Sub

Private Class TestClass

    Public Property Value1 As String
    Public Property Value2 As String

End Class

End Class
4

2 に答える 2

2

なぜプログラムでそれを行う方法が必要なのか、私は非常に興味があります。オブジェクトが使用されなくなった場合 (すべての参照が到達不能/スコープ外/または null に設定されている)、メモリはガベージ コレクターの次の実行によって回収されます。

コードでコレクションをトリガーしたい場合は、GC.Collect() を呼び出す必要があります。ファイナライザーがある場合は、GC.WaitForPendingFinalizers() を呼び出してから、GC.Collect() を再度呼び出す必要があります。

これらのメソッドを呼び出すことは一般的に嫌われていることに注意してください。そのため、あなたのケースに興味があります。

于 2013-07-22T17:47:42.673 に答える