- - PR -
メモリリークの発生について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-04 16:03
いつも参考にさせて頂いています。
早速ですが、質問があります。 このたび、作成したプログラムにおいて、メモリリークが発生しています。 メモリリークの発生原因となるような処理はどのようなものがあります でしょうか? また、メモリリークの原因となっている箇所を探し出せるような 方法などがないでしょうか? 色々とネット上を探してみましたが、いまいち参考になりそうな ものが見つかりません。 ご回答の程、よろしくお願い致します。 | ||||||||
|
投稿日時: 2007-07-04 16:23
どの様にして、メモリリークが発生している事が分かったのでしょうか?
メモリリークに関しては過去スレにも何回か出ていたと思いますが、参考になりませんでしたか? メモリリークの発生原因は確保したメモリを開放していないに限ります。 #直接でなくても、間接的にメモリが確保されていれば。 hiroさんが作成したプログラムがどの様な物なのか分からないので、何とも言えないですが。。。 環境やプログラムで何をしようとしているのかを記述した方が解決に至りやすいですよ。 | ||||||||
|
投稿日時: 2007-07-04 16:32
あるインスタンスへの参照が実行中のスレッドから辿って到達できる場合、
GCの対象とはなりません。(俗に言う強参照) JDK6ならjmap/jhatである程度解析できますが、 多分、GCや参照の仕組みをある程度理解していないとつらいかも知れません。 | ||||||||
|
投稿日時: 2007-07-04 16:43
Javaのガーベッジコレクションの動きを理解するのが近道でしょう。
ソフト参照とか弱参照とかがあるとちょっと話がややこしいですが、 通常は参照されているオブジェクトは回収されない、というシンプルなルールに尽きます。 static変数でListやMapを用意して参照をずっと持っておくような作りになっているとずっと回収されません。 変数宣言はできるだけ狭いスコープで行うことを心がけることです。 一時変数なのにインスタンスフィールドにしていたり、staticフィールドにしていたりすると回収されないばかりか、作りによっては前の値が残っていてバグの元になるのでやめましょう。 以下は駄目な例。
変数宣言が必要最小限のスコープで行われているソースコードでは、 ガーベッジコレクションに回収されないオブジェクトは寿命の長いオブジェクトおよび、 それらのオブジェクトから参照されているオブジェクトに絞れます。 | ||||||||
|
投稿日時: 2007-07-04 16:51
使ったことは無いですが、BEA JRockit Memory Leak Detector なんていう物が ございます。 http://edocs.beasys.co.jp/e-docs/wljrockit/docs50/ ツールを使わずにメモリリークが発生していることが分かる状態でしたら、 結構原因となるコードも見つかりやすそうですけどね。 |
1