我们有一个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"), ""));
}
}
从我读到的内容,wicket序列化此类的实例并存储在会话中。这是泄漏的原因吗?怎么预防这个?
答案 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/)。