추가질문) 전자정부프레임2.5 /java1.6/ Heap 메모리반환문제
- 작성자 :
- 한*천
- 작성일 :
- 2014-04-24 10:16:47
- 조회수 :
- 789
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
이해가 안되 추가질문합니다.
시스템이 죽는것은 메모리반환이 안되기 때문인데,
스트레스테스트결과
1개의 화면에서 한번에 heap이 full차서 죽는게 아니라,
반복적으로 많이 조회를 하면, 점차적으로 heap이 차서 죽습니다
이해가 안되는게,
왜? 한번조회하고 나면 , ArrayList를 release 해주지 않고 계속 가지고 있느냐 입니다.
예를들면)
대부분의 java화일에서는
아래처럼 EgovMap 객체를 사용해 query 결과를 리턴 받습니다.
...
List<AlarmVo> alarmList = Service.select(chargerAlarmVO);
List<CodeVo> chgerAlarmStatList = Service.select(codeVO);
List<CodeVo> chgerProdList = Service.select(codeVO);
List<StationVo> stationList = Service.select(sv);
...
답변자님 말씀은 저렇게 가지고온 데이터가 너무 많아서 heap이 찬다는 말씀인데,
전술했다시피 한번에 죽지 않습니다.
문제는 메모리를 release해주지 않아 JVM이 GC를 못하는데 있는게 아닌지 생각됩니다.
이부분에 대해 시스템적으로나,
개선할 부분이 있는지 아니면, 확인 부탁합니다
시스템이 죽는것은 메모리반환이 안되기 때문인데,
스트레스테스트결과
1개의 화면에서 한번에 heap이 full차서 죽는게 아니라,
반복적으로 많이 조회를 하면, 점차적으로 heap이 차서 죽습니다
이해가 안되는게,
왜? 한번조회하고 나면 , ArrayList를 release 해주지 않고 계속 가지고 있느냐 입니다.
예를들면)
대부분의 java화일에서는
아래처럼 EgovMap 객체를 사용해 query 결과를 리턴 받습니다.
...
List<AlarmVo> alarmList = Service.select(chargerAlarmVO);
List<CodeVo> chgerAlarmStatList = Service.select(codeVO);
List<CodeVo> chgerProdList = Service.select(codeVO);
List<StationVo> stationList = Service.select(sv);
...
답변자님 말씀은 저렇게 가지고온 데이터가 너무 많아서 heap이 찬다는 말씀인데,
전술했다시피 한번에 죽지 않습니다.
문제는 메모리를 release해주지 않아 JVM이 GC를 못하는데 있는게 아닌지 생각됩니다.
이부분에 대해 시스템적으로나,
개선할 부분이 있는지 아니면, 확인 부탁합니다
A
안녕하세요. 한기천님.
좀더 확인해봐야겠지만, EgovMap 자체는 일반적인 Map이기 때문에 GC에 의해 release되야 합니다.
그래서 일반적으로 페이징처리되지 않고 많은 데이터를 조회하는 경우가 포함되어 있는 경우,
발생되는 현상을 설명드린 것입니다.
바로 OutOfMemory가 발생하지 않는 이유는 해당 업무가 매번 호출되는 것이 아니라 주로 통계쪽이라 엑셀다운로드와 같은 잘 사용되지 않는 업무에 의해 발생되기 때문입니다.
그리고
List<AlarmVo> alarmList = Service.select(chargerAlarmVO);
List<CodeVo> chgerAlarmStatList = Service.select(codeVO);
List<CodeVo> chgerProdList = Service.select(codeVO);
List<StationVo> stationList = Service.select(sv);
로 받으신 부분들은 EgovMap을 사용하지 않으시고 VO를 사용하신 부분이라 EgovMap 과도하게 메모리를 차지하는 부분과는 상관이 없습니다.
추가적으로 EgovMap 자체가 말씀하신 것 처럼 release가 되지 않는다고 하면 해당 EgovMap List 객체를 가지고 있는 쪽에서 Controller 등에 멤버 변수로 정보를 가지고 있는 경우 같습니다.
이 경우는 local 변수 방식으로 변경을 하셔야 할 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.
좀더 확인해봐야겠지만, EgovMap 자체는 일반적인 Map이기 때문에 GC에 의해 release되야 합니다.
그래서 일반적으로 페이징처리되지 않고 많은 데이터를 조회하는 경우가 포함되어 있는 경우,
발생되는 현상을 설명드린 것입니다.
바로 OutOfMemory가 발생하지 않는 이유는 해당 업무가 매번 호출되는 것이 아니라 주로 통계쪽이라 엑셀다운로드와 같은 잘 사용되지 않는 업무에 의해 발생되기 때문입니다.
그리고
List<AlarmVo> alarmList = Service.select(chargerAlarmVO);
List<CodeVo> chgerAlarmStatList = Service.select(codeVO);
List<CodeVo> chgerProdList = Service.select(codeVO);
List<StationVo> stationList = Service.select(sv);
로 받으신 부분들은 EgovMap을 사용하지 않으시고 VO를 사용하신 부분이라 EgovMap 과도하게 메모리를 차지하는 부분과는 상관이 없습니다.
추가적으로 EgovMap 자체가 말씀하신 것 처럼 release가 되지 않는다고 하면 해당 EgovMap List 객체를 가지고 있는 쪽에서 Controller 등에 멤버 변수로 정보를 가지고 있는 경우 같습니다.
이 경우는 local 변수 방식으로 변경을 하셔야 할 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.