0

メモリ リークの問題が発生しており、以下のコードが原因であると思われます。シングルトン クラスに静的メソッドがあり、直接参照されている間にメモリ リークが発生しているのではないかと疑っています。

// This class is wired in spring xml and loaded as spring bean
public class SpringSingletonRestClient{

// instance method to make a web-service call
public ServiceResponse getResponseFromARestService(String RequestParam){.....}

// public static helper bean mapping method, that is used outside this class 
// for converting the service response object to different object
public static DomainResponse convertServiceResponseToDomainResponse(ServiceResponse serviceResponse){ //conversion logic.... }
 }

}

使用法

Class MainClass {

//injected as spring bean
SpringSingletonRestClient client;

public void someMethod(){
ServiceResponse serviceResponse = client.getResponseFromARestService(...);
DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);
// use domainResponse object
.......
.......
}

}

疑似を追加したばかりなので、さらに明確にする必要がある場合はお知らせください。メモリ使用量が高くなっており、Spring によって開始されたクラスで宣言されている静的メソッドを使用すると、ガベージ コレクションが正しく行われず、メモリ リークが発生していると思われます。

質問 - 静的メソッドが直接参照によって使用され、そのインスタンス変数によって使用されていない場合でも、Spring によって開始されたシングルトン クラスに静的メソッドがあるのは悪いことですか。

4

1 に答える 1

0

静的メソッドによってメモリ リークが発生することはありません。これは、メソッドがクラス フィールドを使用せず、クラス インスタンスなしで呼び出すことができることを意味します。Java ドキュメンテーションはこれを説明します - セクションクラスメソッドをチェックしてください

通常、メモリ リークは、「グローバル」フィールドが参照を保持し、その使用を停止しないために発生します。これはコレクションかもしれません。メモリ使用量をプロファイリングし、最も使用されているオブジェクトをリストするには、JConsole のようなものを使用する必要があります。これは、それを絞り込むのに役立ちます。

編集 (詳細): オブジェクトを初期化せずに静的メソッドを呼び出しています。つまり、new SpringSingletonRestClient()どこにもありません。

DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);

上記の行では、春は無関係です。メソッドが手続き型言語内の単純な関数であるかのようです。したがって、これによってメモリ リークが発生することはありません。

于 2013-02-15T20:34:18.123 に答える