• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaのJavaのガベージ・コレクション)

Javaのガベージ・コレクションについて

このQ&Aのポイント
  • Javaのガベージ・コレクションについて質問です。
  • Javaのガベージ・コレクションには問題点があります。
  • Javaのガベージ・コレクションを一括メモリーにロードして実行する方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>Q1)javaのコードを一括メモリーにロードし、実行する方法はありますか? >(つまり、ガベージ・コレクションの機能は使用しないようにする) コードを一括ロードするというのはできなくもないですが、 それをしたからといってGCの機能を使用しないということにはなりません。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>メモリーバッファーを確保しますのは、mainの確保しますと、最初の一回だけ確保したことに >なりますが、このメモリーの参照が、他の複数のクラスからの参照が出来難いような気がします。 1回だけの確保の手段はmain内でやる以外にもあります。 #1の補足に書かれている >static volatile float[] SNIMbuff=new float[Fs*8*4*10/9];//Fs=48000 >static volatile byte [] readDataByteBUFF=new byte[Fs*8*16*10/9]; も、1回だけの確保です。 GCといってもJavaの場合は、GCといってもFull GCとScavenge GCがありますし停止したようになるのはFull GC時ですのでFull GCが起きにくいようなコーディングをする必要があります(どのような場合にFull GCが起きるのかなどはご自分で調べられた方がよろしいかと思います) またGCの様子を調べるのにVisualvmなどのツールもありますから、それらのツールを活用されるのもよろしいのではないでしょうか。

すると、全ての回答が全文表示されます。
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

余計なことをごちゃごちゃ書いてしまったから伝わらないのかもしれませんねすみません。 事実の確認です。以下の質問にYesかNoだけで答えてください。 (1)newという文字列はあなたのコード中にその2行しか存在しないのか (2)その2行は最初の1回だけしか呼ばないことは確実か

すると、全ての回答が全文表示されます。
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

>Q1)これらのバッファーメモリーをnew使用しなくて、確保する方法はありますか? >これらのメモリーは、プログラムの起動から終了までメモリー上に確保して置きたいものです。 「プログラムの起動から終了までメモリー上に確保している」のなら問題ありませんよ。 回答をきちんと読んでくださいね。newすること自体が悪いなんて私は書いていないんですよ。「オブジェクトが必要になったときに毎回newすること」が悪いのです。 最初の1回しか行っていないのであれば問題ありません。 で、あなたのコードではその2個所以外にはnewしている個所は一切存在しないということなのでしょうか? >つまり、無意識の内でサンプルを参照しまして利用しましたが、その意味が判っていません。 根本的にはそういうところが問題なのではないかと思います。意味もわからず無意識でコードを書いているのですよね…。まずは自分の書いたコードはどんな意味なのか理解するよう努力してみてはいかがでしょうか。

bakabon_X
質問者

補足

毎度、お世話になります メモリーバッファーを確保しますのは、mainの確保しますと、最初の一回だけ確保したことに なりますが、このメモリーの参照が、他の複数のクラスからの参照が出来難いような気がします。 public static void main(String[] args) { float points[] = new float[1500000]; ..... ..... } 基本的な質問で御免なさい。

すると、全ての回答が全文表示されます。
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

>Q1)javaのコードを一括メモリーにロードし、実行する方法はありますか? 表現の問題だけかもしれませんが、Javaはコードを一括メモリにロードしてから実行しますよ。基本的に。動的なクラスロードも可能ですが、あえて意図してそうコーディングしない限り発生しません。 >(つまり、ガベージ・コレクションの機能は使用しないようにする) 「使用しない」は不可能ですが、発生頻度を低減させたりGCの時間を短くしたりすることは出来ます。 GCは不要なオブジェクトの掃除です。ですので不要になるオブジェクトを作らなければそれで済みます。あなたのプログラムの中では、オブジェクトが必要になったときに毎回newして新しいオブジェクトを作成しているのではないでしょうか?もしそうだとしたらそれが原因です。 オブジェクトは箱です。でnewすることは新しい箱を作ることです。で、そこにデータを入れて使い終わったらポイ捨て。もう二度と使わない箱がごみとして沢山たまるから掃除しなければならない。そういうことです。 ではどうすればいいか。「使いたくなったらnew」をやめる事です。まずは一度に使用するオブジェクトの数を想定する。そして、アプリ起動のタイミングで、想定した数のオブジェクトを空の状態で作る。例えば100個。そしてその100個の空のオブジェクトをキューに貯めておく。そして、オブジェクトを使いたくなったらキューから取り出し、使い終わったらキューに戻す。そうするだけでゴミオブジェクトは発生しなくなりGCは発生しなくなります。 キューは空の状態で始まり、取り出そうと思ったときになければnewをする、使い終わったら戻す、でもいいかもしれません。 厳密にはStringオブジェクトなどはどうしても発生するでしょうから、GCの発生を完全になくすことはまず無理ですが、上記の事を行えば発生頻度を低減させ、発生してもGC時間を短く抑えることが出来ます。 あと、強いて言えば、起動時のVMのメモリを大きくするとか。小さかったらGCが頻発します…。が、それなりに力のある方だと思いますので、まさかそんなところでつまづいてはいませんよね…?

bakabon_X
質問者

補足

pringlez さま 貴重な情報を有難うございます。 私は、バッファーメモリーを確保するために、下記の如くnewを使用しています。 つまり、無意識の内でサンプルを参照しまして利用しましたが、その意味が判っていません。 もし、このバッファーメモリーがGCの対象になっておれば、好ましい状態ではありません。 Q1)これらのバッファーメモリーをnew使用しなくて、確保する方法はありますか? これらのメモリーは、プログラムの起動から終了までメモリー上に確保して置きたいものです。 static volatile float[] SNIMbuff=new float[Fs*8*4*10/9]; //Fs=48000 static volatile byte [] readDataByteBUFF=new byte[Fs*8*16*10/9]; 以上、お手数ですがコメント頂けますと、大変に有難いです。

すると、全ての回答が全文表示されます。

関連するQ&A