1
私たちはメモリを使い果たすウィケットアプリケーションを持っています。私は次のエラーに遭う。wicketでメモリリークを解決する
java.lang.OutOfMemoryError: GC overhead limit exceeded
私は、ヒープ・ダンプを取ったとき、私は私のコードは以下のようになります
を次のように表示することができます。
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"), ""));
}
}
私が読んだところから、ウィケットはこのクラスのインスタンスをシリアル化してセッションに格納します。この漏れの原因ですか?これを防ぐ方法は?
上記のように、jMatを使用してヒープダンプを解析しました。 "これらの参照がクラスローダーでどのように保持されているか..."あなたは少し詳しく説明できますか?このオブジェクトを参照しているのは誰ですか? –
右。オブジェクトからクラスローダーへのパスを見つける必要があります。このようにして、GC化されていない理由を理解することができます。 –