Java GC의 또 다른 문제 swap

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 시간으로 볼 수 있습니다. 프로그램을 잘못 만든것이 아닌가 하고 열심히 튜닝했었는데 결국 원인은 외부에 있었네요...
일주일 삽질의 결과입니다. ㅋ

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/344

Comments List

  1. sstm 2009/04/29 07:16 # M/D Reply Permalink

    고생 많으셨겠어요ㅜㅜ 저런 문제들은 너무 힘들게 하더라구요..너무..

    1. 김형준 2009/04/29 09:23 # M/D Permalink

      원인을 찾기가 가장 어려운 것 같습니다. 원인만 찾으면 해결책은 항상 있는데 ㅋㅋㅋ

  2. laiya 2009/05/19 17:38 # M/D Reply Permalink

    안녕하세요.
    비슷한 현상이 발생하여 검색하던 중 블로그를 방문하게 되었습니다.
    위 문제를 어떻게 해결하셨는지 궁금합니다.
    외부 요인이라고 하셨는데 어떤 경우에 그런 현상이 재현될 수 있을까요?

    1. 김형준 2009/05/19 18:06 # M/D Permalink

      여러 프로세스를 수행하고 각 프로세스가 사용하는 실제적인 메모리의 총합이 장비가 가지고 있는 물리적인 메모리보다 크게 설정하게 되면 swap 영역을 사용하게 되겠죠. swap과 GC가 동시에 수행되면 GC쪽에 hang이 걸리고 JVM위에서 수행되는 프로세스의 모든 쓰레드가 hang 되는 상황이 발생합니다.

  3. laiya 2009/05/21 11:15 # M/D Reply Permalink

    많은 참고가 되었습니다.
    자세한 답변 감사드립니다.^^

Leave a comment
« Previous : 1 : ... 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : 60 : ... 345 : Next »