-1

VB.NETでデスクトップアプリケーションを開発しました。フレームワークは3.5であり、SQLServer2005としてのバックエンドです。

以下は、マスターフォームで書き込んだ[フォームを閉じたときにメモリを解放する]コードで、すべてのフォームが継承されています。

  Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean
Private Declare Function EmptyWorkingSet Lib "psapi.dll" (ByVal hProcess As IntPtr) As Long

Private Sub frmEMR_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.RemoveMemoryPressure(GC.GetTotalMemory(True))
    EmptyWorkingSet(Process.GetCurrentProcess.Handle)
    SetProcessWorkingSetSize(Process.GetCurrentProcess.Handle, -1, -1)
End Sub

私はこのヒープメモリを書いていましたが、論争の的になっています。

また、管理されていないメモリが増加しています。

誰かがこれから私を助けることができますか?

ありがとうございます。それでは、お元気で

ヘマルシャー

4

2 に答える 2

1

後でwithを呼び出すと、ワーキング セットも空になるため、呼び出しても意味がありません。EmptyWorkingSetSetProcessWorkingSetSize-1, -1

RemoveMemoryPressureまた、 の戻り値で呼び出している理由もわかりませんGetTotalMemory。これは意味がありません...

私のアドバイスは次のとおりです。

  • ガベージ コレクションをいじらないでください (何をしているのかわからない場合)。ガベージコレクターがそれを行います。

メモリが不足している場合は、メモリ リークが発生している可能性があります。理解できない関数をランダムに呼び出しても修正されません。

あなたの問題は、管理されていないリソースを正しく処理していないことが原因であるに違いありません。また、実装するフレームワークのクラスを使用していて、それらを破棄していないことも確かです (キーワードをIDisposable呼び出すDisposeか使用することによって)。using

これらのオブジェクトはすべて破棄してください。問題が解決しない場合は、メモリ プロファイラーまたはSOSを使用して、メモリ リークの原因を特定します。

魔法のようにバグを修正してくれる特効薬はありません。

また、StackOverflow の同じトピックに関する多数の質問もご覧ください。

于 2012-07-02T10:58:11.800 に答える
1

メモリ リークに対処するときの私の最初のルールは、すべてのコードを調べて、オブジェクトにdispose()それを使用するメソッドがあるかどうかを確認することです。あなたのアプリケーションが何をしているのか分からないので、推測するしかありませんが、.NET SQL オブジェクトの多くがdispose()close()関数を持っていることは知っています。アプリでこれらを大量に使用している場合は、それらを破棄するのを忘れている可能性があります。

于 2012-07-02T10:32:11.513 に答える