Java GC의 또 다른 문제 swap
- Posted at 2009/04/24 11:59
- Filed under Program/JAVA
neptune에 multi-row selection 기능(like, between) 을 구현하고 테스트 하는 중에 계속 GC로 인해 10 ~ 30초 정도 시스템이 멎는 증상이 발생하였습니다. 지난번부터 계속 GC가 문제를 일으키고 있는데 UseConcMarkSweepGC 옵션으로 해결된 것 같은 문제가 다시 재현되었습니다.
일주일 삽질 끝에 발견한 것은 테스트 하는 장비의 환경이 바뀌어서 물리적인 메모리가 작아졌기 때문이었습니다. 메모리가 모자라서 GC가 오래 걸렸다라기 보다는 메모리는 여유 있는데 메모리 swap이 발생하면서 GC 도는 시간이 오래 걸린 증상이었습니다.
GC 로그를 보면
[ParNew: 52353K->6528K(59008K), 7.8146970 secs] 331439K->326208K(2090624K), 7.8233400 secs] [Times: user=0.43 sys=0.00, real=7.82 secs]
GC 시간 7초 정에 user 시간은 0.43인 것을 볼 수 있습니다. 나머지 시간의 swap 메모리를 로딩하거나 디스크로 내리는데 걸린 wait 시간으로 볼 수 있습니다. 프로그램을 잘못 만든것이 아닌가 하고 열심히 튜닝했었는데 결국 원인은 외부에 있었네요...
일주일 삽질의 결과입니다. ㅋ
Posted by 김형준
- Response
- No Trackback , 5 Comments
Trackback URL : http://www.jaso.co.kr/trackback/344
Comments List
-
고생 많으셨겠어요ㅜㅜ 저런 문제들은 너무 힘들게 하더라구요..너무..
-
원인을 찾기가 가장 어려운 것 같습니다. 원인만 찾으면 해결책은 항상 있는데 ㅋㅋㅋ
-
-
안녕하세요.
비슷한 현상이 발생하여 검색하던 중 블로그를 방문하게 되었습니다.
위 문제를 어떻게 해결하셨는지 궁금합니다.
외부 요인이라고 하셨는데 어떤 경우에 그런 현상이 재현될 수 있을까요?-
여러 프로세스를 수행하고 각 프로세스가 사용하는 실제적인 메모리의 총합이 장비가 가지고 있는 물리적인 메모리보다 크게 설정하게 되면 swap 영역을 사용하게 되겠죠. swap과 GC가 동시에 수행되면 GC쪽에 hang이 걸리고 JVM위에서 수행되는 프로세스의 모든 쓰레드가 hang 되는 상황이 발생합니다.
-
-
많은 참고가 되었습니다.
자세한 답변 감사드립니다.^^





