2017-02-14 6 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

개찰 페이지가 GC로 작성되지 않았고 모든 구성 요소가 계속 유지되는 것처럼 보입니다.

힙 덤프를 가져 와서 이러한 참조가 클래스 로더에 저장되는 방법을 살펴 보시기 바랍니다. 이클립스 메모리 분석기 (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 화되지 않았는지 이해할 수 있습니다. –