JProfiler 도움말

호출 트리 분석

호출 트리는 JProfiler가 기록한 실제 호출 스택을 보여줍니다. 호출 트리를 분석할 때, 해석을 더 쉽게 하기 위해 호출 트리에 몇 가지 변환을 적용할 수 있습니다. 이러한 변환은 시간이 오래 걸릴 수 있으며, 호출 트리 뷰의 기능과 호환되지 않는 방식으로 출력 포맷을 변경하므로, 분석 결과가 담긴 새로운 뷰가 생성됩니다.

이러한 분석을 수행하려면, 호출 트리 뷰에서 노드를 선택하고 툴바 또는 컨텍스트 메뉴에서 호출 트리 분석 액션 중 하나를 선택하세요.

호출 트리 뷰 아래에 중첩된 뷰가 생성됩니다. 동일한 분석 액션을 다시 실행하면, 기존 분석이 대체됩니다. 여러 분석 결과를 동시에 유지하려면 결과 뷰를 고정할 수 있습니다. 이 경우, 동일한 유형의 다음 분석은 새로운 뷰를 생성합니다. 고정된 뷰의 경우, 뷰 상단에 이름을 변경할 수 있는 이름 변경 버튼이 표시되며, 이는 왼쪽의 뷰 선택기에서 표시되는 이름을 변경하는 데 사용할 수 있습니다.

라이브 세션에서는 결과 뷰가 호출 트리와 함께 업데이트되지 않으며, 분석이 수행된 시점의 데이터를 보여줍니다. 현재 데이터로 분석을 다시 계산하려면 reload 액션을 사용하세요. 호출 트리 자체를 다시 계산해야 하는 경우(예: 자동 업데이트가 비활성화된 할당 트리 등)에도 reload 액션이 이를 처리합니다.

호출 트리 스냅샷

"호출 트리 스냅샷 생성" 분석은 현재 호출 트리의 정적인 복사본을 단순히 생성합니다. 이는 JProfiler 스냅샷을 저장하거나 열지 않고도 다양한 사용 사례를 비교할 때 유용합니다. 또한, 호출 트리가 계속 기록되는 동안에도 고정된 복사본으로 작업할 수 있는 방법을 제공합니다.

"호출 트리 스냅샷 생성" 분석은 "CPU 뷰" 섹션의 "호출 트리" 뷰에서만 사용할 수 있습니다. 호출 트리 스냅샷 뷰를 고정하면 여러 개의 호출 트리 스냅샷을 동시에 가질 수 있습니다. 다른 분석과 달리, 호출 트리 스냅샷은 별도의 데이터 집합을 구성하므로 JProfiler 스냅샷에 저장됩니다.

호출 트리 뷰에서 사용할 수 있는 호출 트리 분석 외에도, 호출 트리 스냅샷에는 상위 뷰의 핫스팟을 계산하는 "핫스팟 계산" 액션이 제공되며, 이는 "CPU 뷰" 섹션의 "핫스팟" 뷰와 유사합니다. 호출 트리 스냅샷 뷰 아래에 중첩된 뷰에서 접근 가능한 모든 분석은 상위 호출 트리 스냅샷의 데이터를 사용하며, 최상위 호출 트리 뷰의 데이터와는 다릅니다.

재귀 접기

재귀를 사용하는 프로그래밍 스타일은 분석하기 어려운 호출 트리를 만듭니다. "재귀 접기" 호출 트리 분석은 모든 재귀가 접힌 호출 트리를 계산합니다. 호출 트리에서 현재 선택의 상위 노드는 분석을 위한 호출 트리 루트 역할을 합니다. 전체 호출 트리를 분석하려면 최상위 노드 중 하나를 선택하세요.

동일한 메서드가 호출 스택 상위에서 이미 호출된 경우 재귀로 감지됩니다. 이 경우, 해당 서브트리는 호출 트리에서 제거되고 해당 메서드의 첫 번째 호출 위치에 다시 연결됩니다. 호출 트리의 해당 노드에는 아이콘이 접두사로 붙으며, 툴팁에는 재귀 횟수가 표시됩니다. 그 노드 아래에서는 서로 다른 깊이의 스택이 병합됩니다. 병합된 스택의 개수도 툴팁에 표시됩니다. 접힌 재귀의 총 개수는 헤더에 표시되며, 원래 호출 트리에 설정된 호출 트리 파라미터 정보 위에 나타납니다.

단순한 재귀의 경우, 병합된 스택의 개수는 재귀 횟수에 1을 더한 값입니다. 따라서 재귀 툴팁에 "1회 재귀"가 표시된 노드는, 그 하위에 "2개 병합 스택"이 표시된 노드를 포함하는 트리를 가집니다. 더 복잡한 경우에는 재귀가 중첩되어 병합된 호출 트리가 겹치므로, 병합된 스택의 개수는 스택 깊이에 따라 달라집니다.

호출 트리에서 서브트리가 상위로 병합되기 위해 제거되는 지점에는, 특수한  "이동된 노드" 플레이스홀더가 삽입됩니다.

누적된 아웃고잉 호출 분석

호출 트리에서는 선택한 메서드의 아웃고잉 호출을 볼 수 있지만, 해당 메서드가 호출된 특정 호출 스택에 대해서만 볼 수 있습니다. 동일한 관심 메서드가 여러 호출 스택에서 호출되었을 수 있으며, 이러한 모든 호출을 누적한 호출 트리를 분석하면 더 나은 통계를 얻을 수 있습니다. "누적된 아웃고잉 호출 계산" 분석은 선택한 메서드의 모든 아웃고잉 호출을 합산한 호출 트리를 보여줍니다. 이때 메서드가 어떻게 호출되었는지에 관계없이 모두 포함됩니다.

선택한 메서드에 대해 JProfiler는 재귀 호출을 고려하지 않고 모든 최상위 호출을 수집하여 결과 트리에 누적합니다. 헤더에는 이러한 최상위 호출 사이트가 몇 개 합산되었는지 표시됩니다.

뷰 상단에는 결과 트리에서 재귀를 접을 수 있는 체크박스가 있습니다. 이는 "재귀 접기" 분석과 유사합니다. 재귀가 접힌 경우, 최상위 노드와 첫 번째 아웃고잉 호출 레벨은 메서드 호출 그래프와 동일한 수치를 보여줍니다.

백트레이스 계산

"백트레이스 계산" 분석은 "누적된 아웃고잉 호출 계산" 분석을 보완합니다. 후자와 마찬가지로, 선택한 메서드의 모든 최상위 호출을 재귀 호출을 고려하지 않고 합산합니다. 하지만, 아웃고잉 호출을 보여주는 대신, 선택한 메서드의 호출에 기여한 백트레이스를 보여줍니다. 호출은 가장 깊은 노드에서 시작하여 상단의 선택한 메서드로 진행됩니다.

이 분석은 핫스팟 뷰와 유사하지만, 기본적으로 선택한 메서드에 대해 자체 시간(self-time)이 아닌 전체 시간(total time)을 합산하며, 핫스팟 뷰는 자체 시간이 전체 시간에서 상당한 비율을 차지하는 메서드만 보여줍니다. 뷰 상단에는 합산 모드라는 라디오 버튼 그룹이 있으며, 자체 시간으로 설정할 수 있습니다. 이 선택을 하면, 선택한 메서드의 합산 값이 핫스팟 뷰의 기본 모드와 일치합니다.

백트레이스에서는 백트레이스 노드의 호출 횟수와 시간은 오직 선택한 메서드와 관련이 있습니다. 즉, 해당 호출 스택을 따라 호출된 횟수와 시간이 선택한 메서드의 값에 얼마나 기여했는지를 보여줍니다. "누적된 아웃고잉 호출 계산" 분석과 마찬가지로, 재귀를 접을 수 있으며, 백트레이스의 첫 번째 레벨은 메서드 호출 그래프의 인커밍 호출과 동일합니다.

호출 그래프에서의 호출 트리 분석

호출 그래프에서는 각 메서드가 유일하지만, 호출 트리에서는 메서드가 여러 호출 스택에 나타날 수 있습니다. 하나의 선택된 메서드에 대해 "누적된 아웃고잉 호출 계산"과 "백트레이스 계산" 분석은 호출 트리와 호출 그래프의 관점을 연결해줍니다. 선택한 메서드를 중심에 두고, 아웃고잉 및 인커밍 호출을 트리 형태로 보여줍니다. 호출 그래프 보기 액션을 사용하면 언제든 전체 그래프로 전환할 수 있습니다.

때로는 반대로 관점을 전환하여 그래프에서 트리 뷰로 변경하고 싶을 수 있습니다. 호출 그래프에서 작업할 때, 그래프 내 임의의 선택된 노드에 대해 동일한 호출 트리 분석을 사용하여 누적된 아웃고잉 호출과 백트레이스를 트리로 표시할 수 있습니다.

IntelliJ IDEA 통합에서는, 에디터의 거터에 표시되는 호출 그래프에 이러한 트리를 바로 표시하는 액션이 포함되어 있습니다.

할당별 클래스 표시

이전 호출 트리 분석과는 약간 다르게, 할당 호출 트리 및 할당 핫스팟 뷰에서는 "클래스 표시" 분석이 제공됩니다. 이 분석은 호출 트리를 다른 트리로 변환하는 것이 아니라, 모든 할당된 클래스를 테이블로 보여줍니다. 결과 뷰는 기록된 객체 뷰와 유사하지만, 특정 할당 지점에만 제한됩니다.

호출 트리를 보여주는 분석 결과 뷰에서는 "누적된 아웃고잉 호출 계산"과 "선택한 메서드로의 백트레이스 계산" 분석 모두 사용할 수 있습니다. 이들을 실행하면 독립적인 파라미터를 가진 새로운 최상위 분석이 생성됩니다. 이전 분석 결과 뷰에서 제거된 호출 트리는 새로운 최상위 분석에 반영되지 않습니다.

반면, 클래스 표시 액션은 호출 트리 분석 결과 뷰에서 사용해도 새로운 최상위 분석을 생성하지 않습니다. 대신, 원래 뷰에서 두 단계 아래에 중첩된 분석을 생성합니다.