1
우리는 메모리가 부족한 개찰구 응용 프로그램을 가지고 있습니다. 다음과 같은 오류가 발생합니다.개찰구에서 메모리 누수 해결
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"), ""));
}
}
내가 읽은 것으로부터,이 클래스의 인스턴스를 순회하고 세션에 저장합니다. 이 누설의 원인인가? 이걸 어떻게 막을 수 있니?
위와 같이 jMat을 사용하여 힙 덤프를 분석했습니다. "이러한 참조가 클래스 로더에서 유지되는 방법 ..."당신은 조금 더 정교하게 표현할 수 있습니까? –
. 객체에서 클래스 로더까지의 경로를 찾아야합니다. 이 방법을 사용하면 왜 GC 화되지 않았는지 이해할 수 있습니다. –