이미지 출력 관련 질문입니다.
- 작성자 :
- 배*훈
- 작성일 :
- 2014-03-31 12:27:37
- 조회수 :
- 754
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
메인 페이지에 getImage.do 액션을 이용하여 출력하고 있습니다.
이미지 출력 하는 부분에서 메모리 반환이 잘 되지 않는 것 같아서 질문 드립니다.
일정 시간 동안은 문제가 없다고 5~6시간 후 메모리를 확인 해보면 old generation 영역이 full이 나고 full gc 이후에도 메모리가 반환 되지
않고 있습니다.
response.getBufferSize를 찍어보면 buffer size가 계속해서 증가하는 것을 확인 하였습니다.
heap dump 확인 결과 org.apache.catalina.connector.OutputBuffer의 byte[]이 100M에서 80M정도 잡고 있네용(27 instances)
어떤 부분 소스를 변경 해야 할 지 감이 오질 않네요
혹, 서버나 WAS를 튜닝 해야 하는지 ...
현재 운영 서버는 centos6, tomcat6, java6을 사용 중입니다.
답변 부탁드립니다.
이미지 출력 하는 부분에서 메모리 반환이 잘 되지 않는 것 같아서 질문 드립니다.
일정 시간 동안은 문제가 없다고 5~6시간 후 메모리를 확인 해보면 old generation 영역이 full이 나고 full gc 이후에도 메모리가 반환 되지
않고 있습니다.
response.getBufferSize를 찍어보면 buffer size가 계속해서 증가하는 것을 확인 하였습니다.
heap dump 확인 결과 org.apache.catalina.connector.OutputBuffer의 byte[]이 100M에서 80M정도 잡고 있네용(27 instances)
어떤 부분 소스를 변경 해야 할 지 감이 오질 않네요
혹, 서버나 WAS를 튜닝 해야 하는지 ...
현재 운영 서버는 centos6, tomcat6, java6을 사용 중입니다.
답변 부탁드립니다.
A
안녕하세요. 배기훈님.
해당 부분 확인 결과 내부적으로 사용되는 stream이 finally 처리로 정상 close되었고, local 변수 방식으로 사용되고 있어서 별다른 문제의 소지가 있진 않은 것 같습니다.
tomcat쪽의 OutputBuffer도 getImage.do에서만 사용하는 것이 아니라 모든 페이지 요청에 대하여 사용되는 부분이라, 판단이 어려운 것 같습니다.
아마도 27개 인스턴스가 있다는 것으로 봐서는 27개 요청이 처리중에 있는 것으로 하나당 3M 정도의 데이터를 가지고 있는데, 개별 처리로 봐서는 많은 데이터는 아닌 것 같습니다.
response의 getBufferSize의 값이 증가하는 부분도 개별 처리(response) 상에서 증가는 하는 것인지, 다른 요청에 대하여 증가하는 것인지도 확인이 필요한 것 같습니다.
(해당 API에 대한 처리 방식은 구현체마다 다르지만, Spec 상으로는 setBufferSize에 의해 지정된 값은 참조용이고 실제 bufferSize는 구현체에 따라 증가하거나 감소할 수 있는 가능성이 있습니다.)
이런 경우는 하나의 heap dump를 분석하시는 것이 아니라 시간차이를 두고 3개 정도의 heap dump를 가지고 실제 반환되지 않는 메모리 부분을 찾으셔야 할 것 같습니다. 현재 시점에 많이 있는 데이터가 문제가 아니라 GC가 되더라고 반확되지 않는 부분들이 어떤 부분에 의해 할당되는지 등의 추가적인 분석이 필요할 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.
해당 부분 확인 결과 내부적으로 사용되는 stream이 finally 처리로 정상 close되었고, local 변수 방식으로 사용되고 있어서 별다른 문제의 소지가 있진 않은 것 같습니다.
tomcat쪽의 OutputBuffer도 getImage.do에서만 사용하는 것이 아니라 모든 페이지 요청에 대하여 사용되는 부분이라, 판단이 어려운 것 같습니다.
아마도 27개 인스턴스가 있다는 것으로 봐서는 27개 요청이 처리중에 있는 것으로 하나당 3M 정도의 데이터를 가지고 있는데, 개별 처리로 봐서는 많은 데이터는 아닌 것 같습니다.
response의 getBufferSize의 값이 증가하는 부분도 개별 처리(response) 상에서 증가는 하는 것인지, 다른 요청에 대하여 증가하는 것인지도 확인이 필요한 것 같습니다.
(해당 API에 대한 처리 방식은 구현체마다 다르지만, Spec 상으로는 setBufferSize에 의해 지정된 값은 참조용이고 실제 bufferSize는 구현체에 따라 증가하거나 감소할 수 있는 가능성이 있습니다.)
이런 경우는 하나의 heap dump를 분석하시는 것이 아니라 시간차이를 두고 3개 정도의 heap dump를 가지고 실제 반환되지 않는 메모리 부분을 찾으셔야 할 것 같습니다. 현재 시점에 많이 있는 데이터가 문제가 아니라 GC가 되더라고 반확되지 않는 부분들이 어떤 부분에 의해 할당되는지 등의 추가적인 분석이 필요할 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.