- ベストアンサー
同じ配列またはクラスを、2回以上newしたとき
ファイルサイズ不定(ただし最大は10KB)のファイルを複数個読み込む際、ファイル個数分の配列を用意し生成するとメモリ不足になりかねないので、 読み込んだデータを使い終わったらすぐに破棄して別のデータを生成するといったような、1つの配列を使い回す方法を考えています。 (読み込んだbyte型の配列データは即座に4byte区切りでint型配列に変換し格納しています) C++なら int *p; p = new int[1024*10]; delete p; p = new int[1024*10]; delete p; みたいな方法で明示的に解放ができますが、 Javaではガーベッジコレクションで自動回収されるので 任意のタイミングで解放できないので、 int p[] = new int[1024*10]; p = null; p = new int[1024*10]; p = null; みたいな方法で試しているのですが、 こういった方法はやっぱりマズいのでしょうか? JAVAヒープの容量を見る限りでは特に変化は見られず、素人の私では判断できないので、もしもご存知の方がいらっしゃればアドバイスいただけると助かります。 よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的にはその考え方でいいと思います。 ちなみにあえていちいちnullを代入しなくても、次のnewした配列を代入すれば 前の配列は参照されなくなるので、ガーベジコレクションの対象になります。 ただ、不要になったらガーベジコレクションで自動的に解放してくれると言っても、 短時間で急速に大量のインスタンスを生成すると、解放処理が追いつかなかったり、 追いついても解放処理のせいでパフォーマンスが低下する可能性があります。 質問の例のように配列を生成しては破棄するの繰り返しをやると、そうなる可能性があります。 配列の個数が1024*10と決まっているのであれば、newするのは最初だけにして、 2回目移行は内容の書き換えで対応した方が、ヒープの使用効率という点では現実的でしょう。 配列の個数が決まっていなくても、最大の個数がわかるのなら、やはりそのようにすべきでしょう。 あと思ったのは、どうしても同時に10*1024のintが必要なのかな?ということでした。 intひとつずつ処理するようなやり方できないのかなーと。 Javaはガーベジコレクションがあるからメモリ確保し放題というわけではもちろんなく、 生成しなくて済むインスタンスはできるだけ生成しない方が望ましいですし、 メモリリークのような現象もあります。 (すでに不要なインスタンスを気づかずライフサイクルが長い場所で参照しちゃってて解放されない、みたいな)
その他の回答 (2)
- nknk80
- ベストアンサー率65% (17/26)
> Javaではガーベッジコレクションで自動回収されるので > 任意のタイミングで解放できないので、 > > int p[] = new int[1024*10]; > p = null; > p = new int[1024*10]; > p = null; > > みたいな方法で試しているのですが、 Javaではガーベッジコレクションが機能するので、 この使い方で問題ありません。 任意のタイミングで解放しなくても、 実行中にメモリ解放の必要性がでてきたら 自動的に解放してくれます。
- soramame99
- ベストアンサー率46% (12/26)
メモリ領域が厳しいと言う前提条件でなら、単純に内容をクリアしては如何でしょう?(あるいは、クリアせずに領域を再利用できるように、データサイズを別に保持するとか。)