- - PR -
メモリが解放されるのはいつ?
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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で確認できます。 |
|
投稿日時: 2005-07-26 21:18
どこで読んだか忘れましたが、JavaのStringはインスタンス毎に
文字列データを保持するわけではありません。 String a="abc"; String b="abc"; とした場合、スタック領域に"abc"が作成されてaもbも同じところを 参照するようです。これにより同じ文字列を指すStringを大量に作っても メモリを節約できます。その代わりaやbに対する参照が無くなっても 文字定数のメモリは解放されません。 Stringの代わりに自作のクラスで似たようなことをした場合は、 ちゃんとSystem.gc()で解放されると思いますよ。 |
|
投稿日時: 2005-07-26 21:47
自作のクラスなんか作らなくてもListで試せそうですね
|
|
投稿日時: 2005-07-27 22:54
皆様、たくさんの回答ありがとうございます。
当初の"メモリが解放されるのはいつ?"の疑問は解決いたしました。 まだ、OutOfMemoryError が出ているのですがそちらは、 -Xloggc や -Xrunhprof オプション等で地道に調査していきます。 今回もまた皆様に助けられました。ありがとうございました。 |