- PR -

メモリリークの発生について

1
投稿者投稿内容
hiro
会議室デビュー日: 2006/01/07
投稿数: 19
投稿日時: 2007-07-04 16:03
いつも参考にさせて頂いています。

早速ですが、質問があります。
このたび、作成したプログラムにおいて、メモリリークが発生しています。
メモリリークの発生原因となるような処理はどのようなものがあります
でしょうか?
また、メモリリークの原因となっている箇所を探し出せるような
方法などがないでしょうか?
色々とネット上を探してみましたが、いまいち参考になりそうな
ものが見つかりません。

ご回答の程、よろしくお願い致します。
マーサ
ベテラン
会議室デビュー日: 2004/11/26
投稿数: 87
投稿日時: 2007-07-04 16:23
引用:
hiroさんの書き込み (2007-07-04 16:03) より:

このたび、作成したプログラムにおいて、メモリリークが発生しています。


どの様にして、メモリリークが発生している事が分かったのでしょうか?

引用:
メモリリークの発生原因となるような処理はどのようなものがあります
でしょうか?
また、メモリリークの原因となっている箇所を探し出せるような
方法などがないでしょうか?
色々とネット上を探してみましたが、いまいち参考になりそうな
ものが見つかりません。


メモリリークに関しては過去スレにも何回か出ていたと思いますが、参考になりませんでしたか?

メモリリークの発生原因は確保したメモリを開放していないに限ります。
#直接でなくても、間接的にメモリが確保されていれば。

hiroさんが作成したプログラムがどの様な物なのか分からないので、何とも言えないですが。。。

環境やプログラムで何をしようとしているのかを記述した方が解決に至りやすいですよ。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-07-04 16:32
あるインスタンスへの参照が実行中のスレッドから辿って到達できる場合、
GCの対象とはなりません。(俗に言う強参照)

JDK6ならjmap/jhatである程度解析できますが、
多分、GCや参照の仕組みをある程度理解していないとつらいかも知れません。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-04 16:43
Javaのガーベッジコレクションの動きを理解するのが近道でしょう。

ソフト参照とか弱参照とかがあるとちょっと話がややこしいですが、
通常は参照されているオブジェクトは回収されない、というシンプルなルールに尽きます。
static変数でListやMapを用意して参照をずっと持っておくような作りになっているとずっと回収されません。

変数宣言はできるだけ狭いスコープで行うことを心がけることです。
一時変数なのにインスタンスフィールドにしていたり、staticフィールドにしていたりすると回収されないばかりか、作りによっては前の値が残っていてバグの元になるのでやめましょう。

以下は駄目な例。
コード:
public class Hoge {
  private List temp; // 作業用の一時変数をフィールドにしている

  public void hoge() {
    // forのブロックの中で完結する変数をブロックの外で宣言している
    int i;
    for (i=0; i<10; i++) {
      temp = new ArrayList();
      ...
    }
  }
}



変数宣言が必要最小限のスコープで行われているソースコードでは、
ガーベッジコレクションに回収されないオブジェクトは寿命の長いオブジェクトおよび、
それらのオブジェクトから参照されているオブジェクトに絞れます。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-04 16:51
引用:

また、メモリリークの原因となっている箇所を探し出せるような
方法などがないでしょうか?



使ったことは無いですが、BEA JRockit Memory Leak Detector なんていう物が
ございます。
http://edocs.beasys.co.jp/e-docs/wljrockit/docs50/

ツールを使わずにメモリリークが発生していることが分かる状態でしたら、
結構原因となるコードも見つかりやすそうですけどね。


1

スキルアップ/キャリアアップ(JOB@IT)