解决wicket中的内存泄漏问题

时间:2017-02-14 12:24:10

标签: memory-leaks wicket

我们有一个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"), ""));
    }    
}

从我读到的内容,wicket序列化此类的实例并存储在会话中。这是泄漏的原因吗?怎么预防这个?

1 个答案:

答案 0 :(得分:1)

看起来Wicket页面不是GC编辑的,它们保留了所有组件。

我建议您进行堆转储,看看这些引用是如何保存在类加载器中的。 Eclipse Memory Analyzer(http://www.eclipse.org/mat/)是非常好的工具。

另一个好工具是Intellij IDEA Memory View(https://blog.jetbrains.com/idea/2016/08/jvm-debugger-memory-view-for-intellij-idea/)。