2011-07-15 8 views
2

私はvb.netアプリケーション内でGoogleマップを使用しています。問題は、Windowsフォーム上にあるWebブラウザ上のマップを検索するたびにメモリ空間を使い続けるということです。私はフォームを閉じても、メモリから消えません。メモリのサイズはちょうど上がっています。 MDI形式を閉じると、それは消え去ります。 これはどのような解決策ですか?メモリの問題をどうやって管理するのですか?Googleマップのメモリ使用量はVB.Netフォーム

- >編集済み:チームメンバーの1人が解決策を見つけました。それはかなりうまくいった。それをやりたいときはいつでも関数を呼び出すだけです。 Form Closingイベントで使用しました。

<DllImport("psapi.dll")> _ 
    Public Function EmptyWorkingSet(ByVal hProcess As IntPtr) As Boolean 
    End Function 

    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
    Public Function GetCurrentProcess() As IntPtr 
    End Function 

    Public Sub FreeMemory() 
     EmptyWorkingSet(GetCurrentProcess()) 
    End Sub 

答えて

4

チェックアウトmy answer to this question.私はあなたの最善の策がいくつかのプロファイリングを行うことだと考えています。

私が作業していたアプリに対して、ANTSメモリプロファイラの試用版を実行しました。私が発見した問題は、このwalthroughの使用方法(具体的には図10〜15の詳細)に概説されています。

基本的に、私はあるフォーム上のいくつかのイベントを購読していましたが、そのフォームが閉じられたときにそれらからの購読を中止しませんでした。これは、まだフォームへの参照があったことを意味し、それはすべてのコントロールとメンバーとともに、決して収集されませんでした。

似たような状況があるかもしれませんが、最善の方法はプロファイラーのコードを見ることです。これは必ずしもこれである必要はありません(これは私が使ったものです)。それは確かにあなたの問題の根本原因を特定するのに役立ちます。

+0

私はメモリが漏れているのを追跡する方法を試みます。ちなみに、良い解決策であるかどうかという疑問に置かれた解決策についてコメントできれば幸いです。ご協力いただきありがとうございます。 – Hoorayo

+0

私は解決策に直接コメントすることはできませんが、編集した投稿への私の唯一の提案は、Form ClosingではなくDisposeから電話する価値があるかもしれないということです。また、デバッグ中にDisposeにブレークポイントを設定し、常に呼び出されるようにします。 –

2

これは.NETのリベラルなガベージコレクションからのものです。あなたが本当に記憶を心配しているなら、これを試してみてください。

最初に、削除するオブジェクトが廃棄されていることを確認します。これがWindowsフォームの場合、これは自動的に行われます。

System.GC.Collect()を呼び出します。あなたのメモリ使用量が減少するはずです。

+0

私はSystem.GC.Collect()を試しましたが、使用されているものの約20%しか削減しませんでした。フォームの読み込み時に占有されていたメモリの100%を削減しません。 – Hoorayo

0

MDIの親を使用し、マップを新しいMDIの子フォームに毎回(または定期的に未使用のものを閉じて)開くことができますか?