2017-02-14 11 views
1

私たちはメモリを使い果たすウィケットアプリケーションを持っています。私は次のエラーに遭う。wicketでメモリリークを解決する

java.lang.OutOfMemoryError: GC overhead limit exceeded 

私は、ヒープ・ダンプを取ったとき、私は私のコードは以下のようになります

enter image description here

を次のように表示することができます。

public class CommonPanel extends Panel { 

    private static ResourceModel SUCCESS_MESSAGE; 
    private static ResourceModel VALIDATE_ZERO_MSG; 
    private static Model<SomeInfoObject> someInfo; 

    public CommonPanel(String id, boolean isRedirect) { 
     super(id); 

     someInfo = Model.of(); 

     SUCCESS_MESSAGE = new ResourceModel("successMessage"); 
     VALIDATE_ZERO_MSG = new ResourceModel("zero.message"); 

     Form<MyObject> form = new Form<>("myForm", new CompoundPropertyModel<>(new MyObject())); 
     Label successLabel= new Label("success", SUCCESS_MESSAGE); 
     add(successLabel.setVisible(isRedirect)); 
     add(new Label("title", getPanelTitle(id))); 

     FeedbackPanel errorFeedbackPanel = new BootstrapFilteredFeedbackPanel("errorFeedbackPanel", FeedbackType.ERROR); 
     errorFeedbackPanel.setOutputMarkupPlaceholderTag(true); 
     form.add(errorFeedbackPanel); 

     SomeInfoPanel someInfoPanel = new SomeInfoPanel("somePanel", someInfo); 
     someInfoPanel.setOutputMarkupId(true); 
     someInfoPanel.setOutputMarkupPlaceholderTag(true); 
     form.add(someInfoPanel); 

//...................more code here 

    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     SUCCESS_MESSAGE.detach(); 
     VALIDATE_ZERO_MSG.detach(); 
     someInfo.detach(); 
    } 
} 

public class SomeInfoPanel extends Panel { 

    public SomeInfoPanel(String id, IModel<SomeObject> model) { 
     super(id, model); 
     add(new FallbackLabel("name", PropertyModel.of(model, "someName"), "")); 
    }  
} 

私が読んだところから、ウィケットはこのクラスのインスタンスをシリアル化してセッションに格納します。この漏れの原因ですか?これを防ぐ方法は?

答えて

1

WicketのページはGC化されておらず、すべてのコンポーネントを保持しているようです。

ヒープダンプを取って、これらの参照がどのようにクラスローダーに保持されているかを確認することをお勧めします。 Eclipse Memory Analyzer(http://www.eclipse.org/mat/)はこれには非常に良いツールです。

もう1つの優れたツールは、Intellij IDEAメモリビュー(https://blog.jetbrains.com/idea/2016/08/jvm-debugger-memory-view-for-intellij-idea/)です。

+0

上記のように、jMatを使用してヒープダ​​ンプを解析しました。 "これらの参照がクラスローダーでどのように保持されているか..."あなたは少し詳しく説明できますか?このオブジェクトを参照しているのは誰ですか? –

+0

右。オブジェクトからクラスローダーへのパスを見つける必要があります。このようにして、GC化されていない理由を理解することができます。 –

関連する問題