質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Visual Basic .NET

    96questions

    Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

ヒープ領域のサイズ取得

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,750

ranran

score 122

ただいまガベージコレクションの動作について学習しております。

マネージヒープメモリがいっぱいになったらガベージコレクションが作動する、と認識していますがいまいち実感がわきません。
実際にコードを書いてヒープの状態を確認したいと思うのですがやり方がいまいちわかりません。

ヒープの状態を確認できるクラス等ありましたらご教授いただけたらと思います。
また参考になるガベージコレクションのページ等あればあわせてよろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

マネージヒープの状態を確認できるライブラリとして、GCクラスがあります。
参考:GCクラス(System):http://msdn.microsoft.com/ja-jp/library/system.gc.aspx

マネージヒープに割り当てられているメモリ量は、GC.GetTotalMemory(False)で取得できます。

実際にマネージヒープに割り当てられているメモリ量が変化していく様子のプログラムを載せておきます。
Imports System        ' GCクラスはSystem名前空間に所属しています。

Module Module1

    Sub Main()

        ' GC.GetTotalMemory( False )でマネージヒープに割り当てられている量をバイト単位で取得し、表示します。
        ' 注:あくまでも目安です。
        Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) )

        ' ガベージ用データを生成します。
        Console.WriteLine( "Integer型配列(要素数 10万)を30回生成します。" )
        Dim x() As Integer
        For index = 1 To 30
            ReDim x( 100000 )
            ' そのガベージ用データが割り当てられているジェネレーション( 普通は 0 です )のガベージコレクション実行回数と、
            ' マネージヒープに割り当てられている量を取得し、表示します。
            Console.WriteLine( "GC Count : {0}, Manage heap : {1} B", GC.CollectionCount( GC.GetGeneration( x ) ), GC.GetTotalMemory( False ) )
        Next

        ' ガベージ用データの変数の参照先をNothingにします。
        x = Nothing
        Console.WriteLine( "Integer型配列の参照先をNothingにしました。" )
        ' 参照先をNothingにした後のマネージヒープ割り当てられている量を取得し、表示します。
        Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) )

        ' ガベージコレクションを実行します。
        GC.Collect()
        Console.WriteLine( "ガベージコレクションを実行しました。" )
        ' ガベージコレクション実行後のマネージヒープ割り当てられている量を取得し、表示します。
        Console.WriteLine( "Manage heap : {0} B", GC.GetTotalMemory( False ) )

    End Sub

End Module

以下に、私の環境(OSはWindows 8.1 64 bit、Visual Studio 2013でx86用コンソールアプリを作成、.NET Frameworkのバージョンは4.5)で実行した時の結果を示します。

Manage heap : 29580 BInteger型配列(要素数 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/31 16:54

    返事が遅くなってしまい申し訳ありません。
    プログラム&URLまで載せていただきありがとうございます。
    参考にし、よりいっそう知識を深めていきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    "java.lang.OutofMemoryError: java heap space"の対処法

    Javaで、あるプログラム実行時に以下のようなエラーが出ることがあります。 ヒープスペース不足のため起きている(?)ようなのでヒープスペースを増やしたいのですが、 具体的にはどう

  • 解決済

    Javaのメモリ領域について

    Javaのメモリの扱いについて教えてください。 ローカル変数はスタック領域に、privateやstaticはヒープ領域に格納されると思います。 そこで。 「private stri

  • 解決済

    unsortedTypeLinkedについて

    これはIsFullの関数の実装コードですが、 tryの中の文章に違和感を感じます。 location=new NodeTypeでheapにデータが置かれるのは理解できますが、 もと

  • 解決済

    メモリリークの調査方法について

    仕事で、以下の言語で記述したアプリケーションがメモリリークしていないかどうか確認するように言われました。 Java JavaScript C++(MFC) テスト環境は、開発ツ

  • 解決済

    配列の変数に関して

    いつもお世話になっています 配列の変数についてお伺いしたいことがあり、質問いたしました 書籍には変数を宣言したとき、スタック領域に確保されるとありました そこで質問なので

  • 解決済

    SwiftのFor文について

    OSX10.11.4, Xcode7.3, Swift2.2です。 個人的にアプリ開発を始めようと思ったのですが、For文内でメモリが増えてしまい、 思うようにできず困っていま

  • 解決済

    C#(CS2013)の配列に関する質問です。

    C#(CS2013)の配列に関する質問です。 ボールドテキスト**ボールドテキスト**下記のコードは、ArrayByteA/Bをそれぞれ、staic領域およびヒープ領域に とっ

  • 解決済

    各言語において扱える配列の大きさについて

    配列におさめる数を比較的小さな数とした場合、 各言語(例、C, C++, Python, Ruby, Haskell 等)において扱える配列の大きさはどれくらいでしょうか?

同じタグがついた質問を見る

  • Visual Basic .NET

    96questions

    Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。