ただいまガベージコレクションの動作について学習しております。
マネージヒープメモリがいっぱいになったらガベージコレクションが作動する、と認識していますがいまいち実感がわきません。
実際にコードを書いてヒープの状態を確認したいと思うのですがやり方がいまいちわかりません。
ヒープの状態を確認できるクラス等ありましたらご教授いただけたらと思います。
また参考になるガベージコレクションのページ等あればあわせてよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
マネージヒープの状態を確認できるライブラリとして、GCクラスがあります。
参考:GCクラス(System):http://msdn.microsoft.com/ja-jp/library/system.gc.aspx
マネージヒープに割り当てられているメモリ量は、**GC.GetTotalMemory(False)**で取得できます。
実際にマネージヒープに割り当てられているメモリ量が変化していく様子のプログラムを載せておきます。
lang
1Imports System ' GCクラスはSystem名前空間に所属しています。 2 3Module Module1 4 5 Sub Main() 6 7 ' GC.GetTotalMemory( False )でマネージヒープに割り当てられている量をバイト単位で取得し、表示します。 8 ' 注:あくまでも目安です。 9 Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) ) 10 11 ' ガベージ用データを生成します。 12 Console.WriteLine( "Integer型配列(要素数 10万)を30回生成します。" ) 13 Dim x() As Integer 14 For index = 1 To 30 15 ReDim x( 100000 ) 16 ' そのガベージ用データが割り当てられているジェネレーション( 普通は 0 です )のガベージコレクション実行回数と、 17 ' マネージヒープに割り当てられている量を取得し、表示します。 18 Console.WriteLine( "GC Count : {0}, Manage heap : {1} B", GC.CollectionCount( GC.GetGeneration( x ) ), GC.GetTotalMemory( False ) ) 19 Next 20 21 ' ガベージ用データの変数の参照先をNothingにします。 22 x = Nothing 23 Console.WriteLine( "Integer型配列の参照先をNothingにしました。" ) 24 ' 参照先をNothingにした後のマネージヒープ割り当てられている量を取得し、表示します。 25 Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) ) 26 27 ' ガベージコレクションを実行します。 28 GC.Collect() 29 Console.WriteLine( "ガベージコレクションを実行しました。" ) 30 ' ガベージコレクション実行後のマネージヒープ割り当てられている量を取得し、表示します。 31 Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) ) 32 33 End Sub 34 35End Module 36
以下に、私の環境(OSはWindows 8.1 64 bit、Visual Studio 2013でx86用コンソールアプリを作成、.NET Frameworkのバージョンは4.5)で実行した時の結果を示します。
Manage heap : 29580 B
Integer型配列(要素数 10万)を30回生成します。
GC Count : 0, Manage heap : 437804 B
GC Count : 0, Manage heap : 837836 B
GC Count : 0, Manage heap : 1237868 B
GC Count : 0, Manage heap : 1637900 B
GC Count : 0, Manage heap : 2037932 B
GC Count : 0, Manage heap : 2437964 B
GC Count : 0, Manage heap : 2837996 B
GC Count : 0, Manage heap : 3238028 B
GC Count : 1, Manage heap : 839848 B
GC Count : 1, Manage heap : 1239864 B
GC Count : 1, Manage heap : 1639880 B
GC Count : 1, Manage heap : 2039896 B
GC Count : 1, Manage heap : 2439912 B
GC Count : 1, Manage heap : 2839928 B
GC Count : 1, Manage heap : 3239944 B
GC Count : 1, Manage heap : 3639976 B
GC Count : 2, Manage heap : 839848 B
GC Count : 2, Manage heap : 1239864 B
GC Count : 2, Manage heap : 1639880 B
GC Count : 2, Manage heap : 2039896 B
GC Count : 2, Manage heap : 2439912 B
GC Count : 2, Manage heap : 2839928 B
GC Count : 2, Manage heap : 3239944 B
GC Count : 2, Manage heap : 3639960 B
GC Count : 3, Manage heap : 839848 B
GC Count : 3, Manage heap : 1239864 B
GC Count : 3, Manage heap : 1639880 B
GC Count : 3, Manage heap : 2039896 B
GC Count : 3, Manage heap : 2439912 B
GC Count : 3, Manage heap : 2839928 B
Integer型配列の参照先をNothingにしました。
Manage heap : 2839928 B
ガベージコレクションを実行しました。
Manage heap : 39800 B
参考になれば幸いです。
それと、ガベージコレクションについての参考になるページを2つ載せておきます。
・@IT:.NET TIPS ガベージ・コレクタを明示的に動作させるには? - C# VB.NET
URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html
・.NETにおけるマネージヒープとガベージコレクション - Qiita
URL:http://qiita.com/mima_ita/items/8303f2a476e8630f0728
投稿2015/01/09 13:06
総合スコア66
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/31 07:54