none
OutOfMemoryの原因調査方法について RRS feed

  • 質問

  • 始めまして。

    現在、.NET REMOTINGを使用した通信のアプリケーションを作成しているのですが、
    時々(1週間に1度など)OutOfMemoryExceptionが発生してしまいます。

    このような場合に、ガーベジコレクタのログやオブジェクトプロファイリングなどを用いて、
    原因を特定出来るような機能はありますでしょうか?(JAVAにはあると聞きます)

    よろしくお願いします。
    2007年10月6日 14:33

回答

すべての返信

  • 利用しているメモリ使用量が増大してるんですかねぇ…。

    必要のないメモリはちゃんと解放 (Dispose() とか) されてますよね??

     

    このあたりの調査なら、DevPartner (サードパーティ製品) かパフォーマンスモニタ使いますかねぇ。

     

    DevPartner ファミリー

    < http://www.compuware.co.jp/products/devpartner_fm/ >

     

    .NET Framework のパフォーマンス カウンタ

    < http://msdn2.microsoft.com/ja-jp/library/w8f5kw2e.aspx >

    2007年10月7日 9:32
  • ぽてくりさん、

    アドバイスいただき、ありがとうございます。

    早速ですがパフォーマンスカウンタの.NET CLR Memoryオブジェクトを使用して、
    Generation 0、1、2のオブジェクト数の推移を調べてみましたところ、
    やはり徐々に増加している傾向が見られたのですが、
    そのオブジェクトがいったい何なのかが追い切れませんでした。

    こちらに関しては、追跡調査する方法はありますでしょうか?


    DevPartnerに関しては、
    可能であれば試用品をダウンロードして試してみます。

    2007年10月7日 12:51
  •  YOSHIKAZU さんからの引用
    こちらに関しては、追跡調査する方法はありますでしょうか?

     

    CLR Profier などが有名です.

     

    http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld06/directxworld06_02.html

    の「オブジェクトの寿命や、GCヒープの中を見る」を参考にしてください.

    2007年10月7日 19:38
  •  YOSHIKAZU さんからの引用
    早速ですがパフォーマンスカウンタの.NET CLR Memoryオブジェクトを使用して、
    Generation 0、1、2のオブジェクト数の推移を調べてみましたところ、
    やはり徐々に増加している傾向が見られたのですが、
    そのオブジェクトがいったい何なのかが追い切れませんでした。

    こちらに関しては、追跡調査する方法はありますでしょうか?

     

    うーん…少なくとも私の知る限りはそのような方法を取ることはできないのではないかなぁ…と思います。

    NyaRuRu さんのおっしゃるように CLR Profier をご利用になられてはいかがでしょうか?

     

    根本的にはどこでメモリが破棄されていないかをデバッグしながらチェックするしかないと思いますけどね。

     

    # NyaRuRu さん

    # なんかあったよなぁ…と思いつつ、おかげ様で思い出すことができました。 < CLR Profier

    # ありがとうございます。

    2007年10月9日 13:58
  • 質問の回答になるかどうか不明ですが、

    最近使用しているプロファイラで使い勝手が良いものがありましたので、

    ご連絡しておきます。

     

    YourKit-Profiler

    http://www.yourkit.com/home/index.jsp

     

     

     

     

    2008年2月7日 6:34