2017-02-14 31 views
1

我们有一个内存不足的应用程序。我得到以下错误。解决检票口内存泄漏问题

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

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

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

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

+0

正如您在上面看到的,我使用jMat来分析堆转储。 “这些引用如何保存在类加载器中......”你能说一点吗?你是指谁指的是这个对象? –

+0

对。您需要找到从对象到类加载器的路径。这样你就可以理解他们为什么不被GC编辑。 –