2013-04-01 2 views
8

VisualVM으로 자바 프로그램을 모니터링하면서 가비지 수집기의 동작에 흥미로운 패턴을 발견했습니다. '정상적인'가비지 콜렉션 실행 직후에 GC가 두 번째, 훨씬 더 많은 CPU 집약적 인 실행을 수행하여 추가 효과가없는 것으로 보입니다 (보다 적극적인 실행 이후 사용 된 힙은 더 가벼운 달리기 후입니다).덜 적극적인 공격을 한 직후에 Java 가비지 수집기가 공격적인 실행을하는 것처럼 보이는 이유는 무엇입니까?

가비지 콜렉터 실행 및 해당 힙 사용 변경 사항을 볼 수있는 VisualVM 출력에 표시했습니다.

interesting garbage collector behaviour

내 질문은 기본적으로 여기에 왜 일을 가비지 컬렉터가 무엇인가? 충분한 메모리가있을 때 실제로 CPU 사용량이 많은이 실행을 시도하는 이유는 무엇입니까? 아니면 그래프를 잘못 해석합니까?

프로그램의 성능은 실제로 영향을받지 않습니다. 단지 궁금합니다.

+1

나는 여기 왜 아무도 "왜"대답 할 수 있을지 의심 스럽다. 찾아 내기 위해서는 아마도 JVM 소스 코드를 읽어야 할 것이며, 언제든지 변경 될 수 있습니다. –

+1

@JimGarrison 질문에 대답하기에 JVM을 사용하는 SO 사용자가 한 명 이상 있어야합니다. – bdesham

답변

2

그래프를 보면 GC 실행에 대한 개요를 얻을 수 있지만, 특정 시점에 GC가 실행되는 이유를 연구하려면 을 자세히 조사해야합니다.

전체 GC 기록을 사용하도록 설정하려면 jstat도 수집하십시오. 예기치 않은 GC주기가 발생하여 로그에서 다시 추적하는 시간에 집중하십시오. 거기에 뭐가 보이니? 보십시오 :

  • 그것은 전체 또는 보조 GC입니까?
  • eden, perm, oldGen, survivor spaces 등의 직종은 무엇입니까?
  • 할당 속도, 라이브 데이터 세트 크기, 해당 간격의 프로모션 속도는 무엇입니까?

이 질문에 대답하는 것은 왜 GC가 실행의 문제를 발생할 수 있습니다.

업데이트 : GC를 사용자 정의하는 방법에 대한 기술적 인 세부 정보를 찾을 수 있습니다. 에서 : Is there a cookbook guide for GC problems?

+1

이 부분을 확장하려면 -verbose : gc 및 -XX : + PrintGCDetails를 사용하여 이것을 더 깊이 파고 들자. –

+1

GC에 대한 자세한 내용을 보려면 VisualVM 용 VisualGC 플러그인을 사용해보십시오. –