1

私は新しいPOJOをインスタンス化するスプリングレストコントローラを持っています。このPOJOは、DBからXMLオブジェクトを逆シリアル化するために使用されます。スプリングブート - 私のRestcontrollerが新しいPOJOへの参照を解放しないのはなぜですか?

私はIDEAのMemory Viewプラグインを気づきました。私のアプリケーションの存続期間中、コントローラオブジェクトは1つしか作成されませんが(期待どおり)、コントローラーへのリクエストごとに新しいPOJOインスタンスが作成され、要求が完了した後。

メモリ不足の例外が発生しています。

これを解決するにはどうすればよいでしょうか?このコードで

@RestController 
public class VendorController { 

    private ChuckNorris chuckNorris; 

    @RequestMapping("/vendor") 
    public String vendors() { 
    ChuckNorris chuckNorris = new ChuckNorris(); 
    chuckNorris.setType("roundhouse"); 

    return "test"; 
    } 
} 

、すべての要求は、新たなチャック・ノリスオブジェクトを作成し、アプリケーションが終了するまで、彼らはメモリにたむろ。

答えて

0

作成したオブジェクトは、メソッドを終了した直後に解放する必要はありません。それらはgc()呼び出しで解放されます。 Gcコールは、タイミングやメモリなどの複数のパラメータに依存します.GCを手動で試して、オブジェクトがまだ存在するかどうかを調べることができます。

しかし、通常、コントローラからのオブジェクトへの参照を持つことは正しくありません。

なぜこれが必要ですか?

private ChuckNorris chuckNorris; 

コントローラにPOJOへの参照がある場合、POJOは破棄できません。コントローラのレベルにインスタンスを格納しないように、参照を削除してコードを書き直してください。

ビジネスロジックを理解せずにコードをどのくらい正確に書き換えることができるかはわかりません。

+0

私の実際の例では、コントローラはAutowiredサービスコンポーネントを呼び出します。 POJOを実際に作成し、別のAutowiredサービスを呼び出してそのPOJOを生成します。 しかし、完全なhttp要求/応答を完了してから別のhttp要求を実行すると、最初のPOJOはまだメモリ内に残ります。 サービスコンポーネントはすべてのリクエストに対して新しいPOJOを作成しますが、それに対する参照を解放することはありません。 – Faxy

関連する問題