新しいプロジェクトで使用したいので、現在EFで少し遊んでいますが、自分では説明できない小さなメモリの問題に遭遇しました。
状況は次のとおりです。
データを表示するグリッドを含む新しいフォームを開きます。OnLoad
エンティティ フレームワーク モデルを使用してデータベースからデータを取得する場合:
Using db As New OfficeDatabaseModelContainer(DatabaseManager.Instance.ProductiveConnectionString)
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, db.User, GetType(User), groupList)
End Using
このコードにより、約 10MB のメモリが追加されます (テストにより、データベースから 15,000 行を読み取りました)。フォームを閉じると、フォームとデータを含むグリッドをプログラムで破棄します。ただし、データベース モデルのコンテキストの 10MB はメモリに残ります。usingブロックでデータを取得したので、破棄する必要がありますが。
フォームを 10 回開くと、常に新しい量のデータがメモリに追加されますが (これは理にかなっています)、破棄されたデータはクリアされません。
フォームを閉じながら電話をかけようとしましGC.Collect()
たが、どちらも役に立ちません。
メモリ リークは、グリッドなどに起因するものではありません。次のコードを使用して証明しました。
Dim userList = DatabaseManager.Instance.ProductiveDatabase.User
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, userList, GetType(User), groupList)
このようにして、シングルトン クラスでデータベース モデルの静的プロパティを取得します。はモデルのインスタンスで、 UserProductiveDatabase
はテーブル User を表します。この方法で同じオブジェクトへの同じ参照を常に使用しているため、メモリ使用量を最大 10MB に維持したい場合は何度でもフォームを呼び出すことができます。
私が間違っていることがあるはずです。モデルの使用法とメモリ使用量を可能な限り低く保つことに関して、インターネットを検索しました。ここでのベスト プラクティスは、モデルの操作中に using ブロックを使用することです。