ファイルサイズ不定(ただし最大は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で質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java Java・配列の問題です。 int 「」nums = new int「5」 ⤴︎ この5の事を言葉で 2 2023/06/21 22:30
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vectorから一部分を取り出す方...
-
javamailで複数人にメールを送...
-
【C#】ハッシュテーブル(連想...
-
java StringとString[]の違い
-
n番目に大きな値を探索する
-
javaでEUC-JP文字列→UTF-8への変換
-
動的配列確保
-
0から99の数字をランダムに...
-
cloneメソッドについて (java)
-
10個の要素数を持つ配列に0~99...
-
この警告はどうすれば?
-
forループの評価(条件)式につ...
-
九九の表の応用
-
『args[]』とは?
-
[Ljava.lang.Stringってなんですか
-
CSVファイルの、列だけ取得したい
-
ランダムでのboolean値の与え方
-
ResourceBundleのgetStringArra...
-
sqlparamaterでIN句を使いたい。
-
new int[変数]で確保しても良い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
[Ljava.lang.Stringってなんですか
-
main(String[] args) の args...
-
この警告はどうすれば?
-
【C#】ハッシュテーブル(連想...
-
javamailで複数人にメールを送...
-
jspでの二次元配列
-
配列をセッションに割り当てた後で
-
同じ配列またはクラスを、2回...
-
java
-
Javaで文字を漢字であるか否か...
-
csvファイルを2次元配列に格納
-
配列の中に複数存在する数がい...
-
配列で、値の入っている要素数...
-
JavaのBase64デコードで正しく...
-
C言語でunsigned char配列を連...
-
C#で動的配列Listの中身をListB...
-
【Ajax通信&Java】配列の受け取...
-
javaについて
-
javaでEUC-JP文字列→UTF-8への変換
おすすめ情報