2017-02-14 23 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"), "")); 
    }  
} 

Из того, что я читал, завершает сериализацию калитки этого класса и хранит в сеансе. Это причина этой утечки? как это предотвратить?

ответ

1

Похоже, что страницы Wicket не являются GC-ed, и они поддерживают все свои компоненты.

Я предлагаю вам взять кучу кучи и посмотреть, как эти ссылки хранятся в загрузчике классов. 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/).

+0

Как вы можете видеть выше, я использовал jMat для анализа кучи кучи. «Как эти ссылки хранятся в загрузчике классов ...» Можете ли вы немного разобраться? Вы имеете в виду, кто имеет в виду этот объект? –

+0

Справа. Вам нужно найти путь от объекта к загрузчику классов. Таким образом, вы сможете понять, почему они не GC-ed. –