1

Tomcat Webserver로 작성된 Java 응용 프로그램이 있습니다. 자바 임무 컨트롤을 사용하면 스트레스 상황에서 GC가 매우 우세하다는 것을 압니다. GC주기마다 CPU는 매우 높아집니다. 알아두면 좋겠지 만, 각 GC주기가 정확히 무엇을하고 있는지, 특히 어떤 개체가 승격되고 있는지, 어떤 개체가 해제되는지 알고 싶습니다. 해방 된 사물들에 대해서, 나는 그들이 어떤 유형인지뿐만 아니라 그들이 창조 된 곳을 알고 싶다. 단지 많은 것들이 생성 될 수 있기 때문에 내가 바이트 [] 또는 문자열을 많이 가지고 있음을 알고 있지만 분명히 도움이되지 않습니다. 그러나 단지 몇 개만 제 통제하에 있으며 지배적입니다.Java GC가 높습니다. 어떤 개체가 GCed인지 찾는 방법입니다.

누구든지 도구 또는 방법을 알고 있습니다.

미리 감사드립니다.

+0

[비행 기록] (https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr005.html)을 사용 했습니까? – nullpointer

+0

예, Flight Recorder는 GC가 CPU 스파이크를 일으킨다는 것을 알았습니다. 그러나 JFR은 내가 필요로하거나 설명하는 정보를 제공하지 않습니다. 또는 적어도 해당 정보를 얻는 방법을 모르겠습니다. –

+0

JFR 프로필과 함께 GC 로그가 원인을 알기에 충분할 수 있습니다. – nullpointer

답변

1

수집되는 대상이 아니라 개체 할당을 기록해야합니다. 점근 적으로 모음과 할당은 동일하지만, 후자는 그것이 발생할 때 훨씬 더 많은 정보를 제공 할 수 있습니다.

다양한 Java 프로파일 링 솔루션이 이러한 기능을 제공합니다.

2

옵션 1 - Java Flight Recorder allocation profiling option을 사용하십시오. 당신이 죽은 물건에 관심이 있다는 것을 이해합니다. 그러나 새로운 물건의 대다수는 곧 죽을 것입니다.

옵션 2 - SJK 데드 오브젝트 히스토그램. SJK는 힙의 클래스 히스토그램을 거의 사용하지 않고 (jmap -histo과 동일) 차이점을보고합니다. 죽은 사람과 죽은 사람을 계산할 수있는 옵션이 있습니다.