ファイルサイズ不定(ただし最大は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ヒープの容量を見る限りでは特に変化は見られず、素人の私では判断できないので、もしもご存知の方がいらっしゃればアドバイスいただけると助かります。
よろしくお願いします
No.3ベストアンサー
- 回答日時:
基本的にはその考え方でいいと思います。
ちなみにあえていちいちnullを代入しなくても、次のnewした配列を代入すれば
前の配列は参照されなくなるので、ガーベジコレクションの対象になります。
ただ、不要になったらガーベジコレクションで自動的に解放してくれると言っても、
短時間で急速に大量のインスタンスを生成すると、解放処理が追いつかなかったり、
追いついても解放処理のせいでパフォーマンスが低下する可能性があります。
質問の例のように配列を生成しては破棄するの繰り返しをやると、そうなる可能性があります。
配列の個数が1024*10と決まっているのであれば、newするのは最初だけにして、
2回目移行は内容の書き換えで対応した方が、ヒープの使用効率という点では現実的でしょう。
配列の個数が決まっていなくても、最大の個数がわかるのなら、やはりそのようにすべきでしょう。
あと思ったのは、どうしても同時に10*1024のintが必要なのかな?ということでした。
intひとつずつ処理するようなやり方できないのかなーと。
Javaはガーベジコレクションがあるからメモリ確保し放題というわけではもちろんなく、
生成しなくて済むインスタンスはできるだけ生成しない方が望ましいですし、
メモリリークのような現象もあります。
(すでに不要なインスタンスを気づかずライフサイクルが長い場所で参照しちゃってて解放されない、みたいな)
No.2
- 回答日時:
> Javaではガーベッジコレクションで自動回収されるので
> 任意のタイミングで解放できないので、
>
> int p[] = new int[1024*10];
> p = null;
> p = new int[1024*10];
> p = null;
>
> みたいな方法で試しているのですが、
Javaではガーベッジコレクションが機能するので、
この使い方で問題ありません。
任意のタイミングで解放しなくても、
実行中にメモリ解放の必要性がでてきたら
自動的に解放してくれます。
No.1
- 回答日時:
メモリ領域が厳しいと言う前提条件でなら、単純に内容をクリアしては如何でしょう?(あるいは、クリアせずに領域を再利用できるように、データサイズを別に保持するとか。
)お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java配列の問題を教えてくださ...
-
cloneメソッドについて (java)
-
Java CSVファイルをカンマごと...
-
Javaでのカンマで配列を分ける方法
-
【C#】ハッシュテーブル(連想...
-
配列について
-
【Ajax通信&Java】配列の受け取...
-
BOOL値を逆にしたい
-
Java配列でNullPointerExceptio...
-
java キーボード入力された値の...
-
JAVA EOFの検出 (条件文で「...
-
System.err. printlnとSystem.o...
-
iterateで受け取った値を処理に...
-
EXCEL VBA で、0から?1から?
-
コマンドライン引数の例外処理...
-
SwingでJtableのヘッダ行が表示...
-
Eclipseのコンソールを常に表示...
-
ループ処理の際、最後だけ","を...
-
[JAVA]try 内の変数を外で!?
-
変数を動的に作るには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
[Ljava.lang.Stringってなんですか
-
javamailで複数人にメールを送...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
javaで大容量テキストファイル...
-
Javaで文字と数字が混ざったも...
-
ページング
-
C言語でunsigned char配列を連...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
C#で動的配列Listの中身をListB...
-
『args[]』とは?
-
同じ配列またはクラスを、2回...
-
java StringとString[]の違い
-
配列をセッションに割り当てた後で
-
【Ajax通信&Java】配列の受け取...
-
セッションを使ったint型の値の...
-
forループの評価(条件)式につ...
おすすめ情報