2017-03-22 21 views
0

デーモンプロセスを作成しようとしています。以下は私のサンプルコードスニペットです。無限ループ内のJavaオブジェクトの作成

public void listener() { 
    MyObject obj = null; 

    while(true) { 
     obj = new MyObject(); 
     obj.process(); 
    } 
} 

または私はこの方法は、データベースselectinsert intoテーブルを行うWebサービスを接続し、応答メッセージを取得し、ユーザーにメッセージを送信します。この

public void listener() { 
    MyObject obj = new MyObject(); 

    while(true) { 
     obj.process(); 
    } 
} 

process()のように作成するものとします。

どちらが正しいですか?

+1

これは、 'MyObject'と' MyObject.process'が何であるか、そしてこれが何をすべきかによって異なります。 – user2357112

+0

プロセスはdbの選択と挿入を行い、Webサービスに接続してメッセージを処理します。 – Easy2DownVoteHard2Ans

答えて

0

フレッシュのための良い質問。私は感謝します。

最初の1つは、ループの繰り返しごとに新しいオブジェクトoを作成します。ガベージコレクタは頻繁にきれいになります。

第2のものです。したがって、いつでも利用可能になります。オブジェクトを常に再利用したい場合は、そのオブジェクトを使用してください。

これは無限のプロセスなので、オブジェクトを再利用するための2番目のオプションに進みます。

1

これは完全に何でMyObjectが行い、どのようにprocess(()が実装されているかによって異なります。 MyObjectがステートレスで、1つのコールで後続の呼び出しを妨げる可能性のある残り物が残っていない場合は、すべての繰り返しで新しいインスタンスを使用してガベージコレクタをスラッシングする代わりに、単一のインスタンスを最適化して使用できます。

+0

@ムレイニク。ご回答有難うございます。あなたは、ステートレスなことを言ってください。 – Easy2DownVoteHard2Ans

+1

@EasyToDownVoteHardToAnsステートレスとは、ステート(つまりデータメンバー)がなく、任意のメソッドを呼び出すと、それ以降のメソッド呼び出しの結果にはなりません。 – Mureinik

+0

@ Mureinikありがとうございます。 – Easy2DownVoteHard2Ans

0

最初のサンプルでは、​​ヒープサイズが満杯になり、ヒープサイズがいっぱいになるまでjava.lang.OutOfMemoryErrorをスローするまで、objを作成します。

2つ目のサンプルでは、​​1つのオブジェクトがあり、常にprocess()メソッドを呼び出します。

+3

ループの繰り返しのたびに、新しく作成されたオブジェクトはもはやアクセスできないので、 'OutOfMemoryError'がスローされる前にガベージコレクションされます。 – Hoopje

関連する問題