0

新しいプロジェクトで使用したいので、現在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 ブロックを使用することです。

4

2 に答える 2

0

dbcontext への最初の呼び出しは、すべての構成などを構築し、これをプロセス メモリ内に静的に格納します。これを確認するには、2 番目と 3 番目の呼び出しを追加してみてください。メモリ フットプリントは一定のままです。

于 2013-02-17T15:43:19.873 に答える
0

コードでリストを使い終わったら、リストを破棄します。実際には、IDisposable であるオブジェクトをすべて破棄します。

groupList.dispose

于 2013-02-17T14:02:07.957 に答える