2013-09-26 2 views
2

힙이 완전히 사용되지 않아도 반복되는 전체 GC가 발생합니다.사용 가능한 힙이 포함 된 반복 전체 GC

gc 로그는 다음과 같습니다. http://d.pr/i/iFug (파란 선은 사용 된 힙이고 회색 직사각형은 전체 GC입니다.) Frequent full GC with empty heap

그러나, 스레드 문제에 대한 실제 답변을 제공하지 않았다

이 질문에 게시 된 것과 유사한 문제가 될 것으로 보인다. 내 응용 프로그램은 RMI를 사용하며 프로덕션 서버는 업그레이드 45 전에 실제로 1.6을 사용하여 GC 간격을 1 분에서 1 시간으로 늘립니다 (http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html). 그러나 나머지 로그에서 Full-GC-every-1-min 패턴을 볼 수는 없습니다.

무엇이 원인 일 수 있습니까?

답변

1

아마도 가장 큰 원인은 힙의 현재 크기에 도달했기 때문일 수 있습니다. 힙의 크기는 사용자가 설정 한 최대 크기보다 작으며 프로그램이 실행될 때 조정됩니다.

예컨대 최대 1GB를 설정하고 초기 힙 크기는 256MB 일 수 있으며 256MB가되면 전체 GC를 수행하고이 GC 다음에 400MB가 더 나은 크기가 될 것이라고 결정할 수 있으며이 크기에 도달하면 전체 GC 수행 등.

여유 공 간이 가득 차거나 여유 공간을 찾지 못한 경우 주요 콜렉션이 생성됩니다. 예 : 조각난 경우.

생존자 공간이 너무 작은 경우에도 전체 컬렉션을 얻을 수 있습니다.

간단히 말해서 가장 많이 사용 된 원인은 gc 튜닝 매개 변수입니다. 시스템이 원하는 방식으로 작동 할 때까지 튜닝 매개 변수를 단순화하는 것이 좋습니다.

+0

동일한 최소 및 최대 힙을 가진 JVM을 시작할 것이므로 그렇게 할 수 없습니다. GC 튜닝을 해보고 싶지만, 불행하게도 이것은 프로덕션에서 발생했으며 테스트 환경에서 재현 할 수있게되었습니다. – halfwarp

0

연결된 스레드에서 언급했듯이 명시 적 GC를 비활성화하고 FullGC 패턴이 다시 발생하는지 확인하십시오 : -XX:+DisableExplicitGC. RMI 코드가 소정의 간격으로 명시적인 GC를 방아쇠를 붙이고있는 경우가있어, 경우에 따라서는 바람직하지 않을 수도 있습니다.

FullGC가 여전히 발생하면 스레드 덤프 및 힙 덤프를 사용하여 문제를 분석합니다.

또한,을 사용하여 Eden, Survivor, OldGen 공간의 직업을 확인하십시오.

+0

그럴 수는 있지만 부작용은 무엇입니까? 나는 테스트 환경에서 이것을 재현하고 싶지만, 나는 할 수 없다. – halfwarp

+0

부작용이 있어서는 안되며,'System.gc()'를 호출하는 것이 바람직하지 않습니다 - 이것은 성능에 해를 끼칠 수 있으므로'-XX : + DisableExplicitGC'를 사용하고 GC가 작업을하도록하는 것이 좋습니다 . 기본적으로이 플래그는 명백한 GC를 트리거하려고하는 불량 라이브러리/코드로부터 보호됩니다. –

관련 문제