2014-10-17 2 views
4

현재 길게 실행되는 JVM 응용 프로그램 (그루비 클래스 포함)을 실행하고 있으며 이상한 동작을 관찰했습니다.GC 작업없이 JVM 메모리가 정리되었습니다.

응용 프로그램을 실행하고 내 Groovy 클래스를 업데이트합니다 (메타 클래스 정보를 올바르게 정리하는 등 - 누출이 없음). 그래서 permgen에서 수집 할 수있는 여러 클래스가 있음을 알게되었습니다 (일반적으로 permgen isn을 관찰합니다. 열심히 모았습니다. 나는 permgen을 모으는 풀 GC 일 뿐이라고 믿습니다. 이상한 점은, 아무런 활동이없는 상태에서 응용 프로그램을 실행하면 약 1 시간 정도 지나면 메모리 사용량이 갑자기 감소하지만 (힙 및 퍼텐겐이지만 permgen에서는 가장 많이 발음됩니다), visualvm은 GC/CPU 활동이 일어나지 않았다고보고합니다 . 어떻게 등록 된 GC 활동과 permgen에 그런 큰 방울 (~ 80메가바이트는) 다음

내 VisualVM과의 스크린 샷

enter image description here

내 질문 로깅이있다? visualvm은 GC/CPU 활동을 기록합니다.

+0

그 동안 gc 로그가 있습니까? 그들은 무슨 일이 일어나고 있는지 보여줄 수 있습니까? –

+0

기본 차트를 벗어나는 로그가 없습니다. 왼쪽 상단 그래프는 CPU/GC 활동을 나타내며, 볼 수 있듯이 permgen 사용률이 큰 드롭에 해당하는 활동은 없습니다 (오른쪽 상단). gc 로그이지만 visualvm은 대개 GC/CPU를 꽤 정확하게 그려줍니다. – rhinds

답변

0

visualgc 플러그인을 설치하여이 상황에서 gc가 작동하는 방식을 조사하십시오. 나는 많은 새로운 세대의 객체가 떨어 졌다고 생각하지만, 스크린 샷을 통해 그것을 말할 수는 없다.

+0

그것은 permgen (이미지의 그래프 오른쪽 상단 permgen입니다) 떨어지고있다 - 그래서 새로운 세대. 질문은 GC 활동이 기록되지 않은 채로 ~ 80MB의 permgen이 수집 된 방법에 관한 것입니다 (이미지의 왼쪽 상단 그래프). – rhinds

+0

어떻게 재현 할 수 있습니까? – user3118958

+0

가장 쉬운 방법은 클래스를 반복적으로로드하는 것입니다. 그런 다음 GC를 사용할 수 있도록 풀어 놓습니다 (예 : Groovy 사용, 클래스 로더 작성, 클래스로드, 클래스 로더 폐기). GC를 모니터링하는 동안 이렇게하면 permgen은 Full-GC 중에 만 수집되므로 permgen은 수집 할 수있는 클래스가 아주 많을 수 있습니다. 그런 다음 응용 프로그램을 실행 (새로운 클래스가로드되지 않음)시킨 다음 나중에 (일반적으로 약 1 시간 이상) 그냥 방금 떨어 뜨 렸습니다. – rhinds