- PR -

メモリが解放されるのはいつ?

投稿者投稿内容
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-07-26 20:24
> メモリリークとは、ある領域のメモリが再利用できない状態のこと
> ということでよろしいでしょうか?
> (JVM にまかせとけばこっちの心配はいらない?)
その通りです。で、これはJavaでは通常は発生しないのですが、
参照が残っているとき似たような状況が発生します。
以下の記事では「メモリ・リテンション」と呼んでます。
http://www.atmarkit.co.jp/fjava/rensai3/devedge05/devedge05_1.html

> あと、基本的な質問なのですが、
> new したときに、-Xmx で指定したサイズを超えてしまうと
> 即座に OutOfMemory になるという理解でよろしいでしょうか?
Anthyhime氏のアーティクルの通り、FULL GCが発生します。

ここらへんの挙動はjava -verbose:gc や、
Javaデバッグツール http://www.okisoft.co.jp/esc/debugtool/
紹介されているvigualgcで確認できます。
yuk@lavans
会議室デビュー日: 2005/07/26
投稿数: 5
投稿日時: 2005-07-26 21:18
どこで読んだか忘れましたが、JavaのStringはインスタンス毎に
文字列データを保持するわけではありません。
String a="abc";
String b="abc";
とした場合、スタック領域に"abc"が作成されてaもbも同じところを
参照するようです。これにより同じ文字列を指すStringを大量に作っても
メモリを節約できます。その代わりaやbに対する参照が無くなっても
文字定数のメモリは解放されません。

Stringの代わりに自作のクラスで似たようなことをした場合は、
ちゃんとSystem.gc()で解放されると思いますよ。
yuk@lavans
会議室デビュー日: 2005/07/26
投稿数: 5
投稿日時: 2005-07-26 21:47
自作のクラスなんか作らなくてもListで試せそうですね
ねま
会議室デビュー日: 2004/11/10
投稿数: 18
投稿日時: 2005-07-27 22:54
皆様、たくさんの回答ありがとうございます。

当初の"メモリが解放されるのはいつ?"の疑問は解決いたしました。

まだ、OutOfMemoryError が出ているのですがそちらは、
-Xloggc や -Xrunhprof オプション等で地道に調査していきます。

今回もまた皆様に助けられました。ありがとうございました。

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