2011-08-14 7 views
3

私は現在、アプリケーションをメンテナンスしており、Spring配線でSingletonとして定義されたオブジェクトの多くが、そのメソッド内の他のオブジェクトの新しいインスタンスを作成することに気づいています。Spring Singletonで新しいインスタンスを作成するとメモリリークが発生しますか?

たとえば、login()メソッドが呼び出されるたびにLoginDetailsの新しいインスタンスを作成するLoginService Singletonがあります。 LoginDetailsは一時的なもので、login()メソッドの実行にのみ必要です。

私が質問したのは、SpringがLoginService用の単一のオブジェクトを作成した場合、それを作成したオブジェクトへの参照としてガーベジコレクションとしてマークされたLoginDetailsのインスタンスは決して終了しませんでしたか?

私が何を意味するかの例は次のとおりです。

public void deleteCustomer(Long customerId, HttpServletRequest request) { 

    CustomerType customerType = new CustomerType(); 
    customerType.setCustomerId(customerId); 

    CustomerDeleteRequestType deleteRequest = new CustomerDeleteRequestType(); 
    deleteRequest.setCustomer(customerType); 

    CustomerDeleteResponseType deleteResponse = mmmwsClient.executeRequest(deleteRequest); 
    log.debug("Delete Response Recieved from Server for Customer Name Update " + deleteResponse.getServiceResult()); 

} 

使用するフィールドが唯一の方法で変数ではなく、私はこの方法が終了すると、それらへの参照が破壊されるだろうと思いインスタンス変数であるため?

Spring Singletonに関する私の理解は正しいですか?

おかげ

答えて

5

シングルトンは(インスタンスフィールドに格納することで)それが作成するオブジェクトへの参照を維持しない場合、および他の到達可能なオブジェクトは、これらのオブジェクトへの参照を保持していない場合は、それらが到達不能になりましたガベージコレクタはそれらを収集します。

オブジェクトを作成する人は、ガベージコレクタにとって重要ではありません。オブジェクトへの参照があるのは誰ですか。

+0

私のシングルトンクラスにはインスタンス変数はありません。新しいオブジェクトは作成され、メソッドフィールドのみに配置され、使用されます。問題の更新例(ごめんなさい。これは最初の部分に含める必要があります): – Elwood

+0

メソッドはフィールドではありません。メソッドにオブジェクトを配置しません。メソッド内でオブジェクトを使用します。方法は単なる論理です。ローカルに作成されたオブジェクトを除き、メソッドの実行中にのみメモリ内にオブジェクトを保持しません。メソッドが返ってくると、作成したオブジェクトがオブジェクトによって参照されていなければ、ガベージコレクションされます。 –

+0

それは理にかなっています。私たちがメモリリークを起こしているかどうかは問題ではないかと思います!答える時間をとってくれてありがとう。 – Elwood

1

私は正直なところ質問していません...しかし、夜遅くなるので私と一緒に裸です。

私はthisページを見ましたが、メソッドが呼び出されるたびに新しいインスタンスが作成されるようです。彼らはようにあなたがそれを使用している場合

、良い代替は次のようになります。

private static MessageResourceSingleton singleton; 

public static MessageResourceSingleton getInstance() { 
    if (singleton == null) { 
     singleton = new MessageResourceSingleton(); 
    } 
    return singleton; 
} 

「私は完全にあなたがで取得しているものを理解していない可能性がありますが、私たちに何のいくつかの例を示すことができた場合それを使用して再たくさんを助けるだろう。

+0

時間を割いていただきありがとうございます。質問を更新しました – Elwood

関連する問題