JProfiler 도움말Download

호출 트리 분할


호출 트리는 동일한 호출 스택의 반복 호출에 대해 누적됩니다. 이는 메모리 오버헤드와 데이터를 이해하기 쉽게 통합할 필요가 있기 때문입니다. 그러나 때로는 선택된 지점에서 누적을 중단하여 호출 트리의 일부를 별도로 볼 수 있습니다.

JProfiler는 호출 스택에 삽입되고 삽입된 노드 위의 메서드 호출에서 추출된 의미 정보를 보여주는 특별한 노드를 사용하여 호출 트리를 분할하는 개념을 가지고 있습니다. 이러한 분할 노드는 호출 트리 내에서 추가적인 페이로드 정보를 직접 볼 수 있게 하며, 포함된 서브트리를 별도로 분석할 수 있습니다. 각 분할 유형은 컨텍스트 메뉴의 작업으로 실시간으로 병합 및 분리할 수 있으며, 메모리 오버헤드를 제한하기 위해 분할 노드의 총 수에 제한이 있습니다.

호출 트리 분할 및 프로브

프로브는 관심 있는 선택된 메서드에서 수집한 정보에 따라 호출 트리를 분할할 수 있습니다. 예를 들어, "HTTP 서버" 프로브는 각 다른 URL에 대해 호출 트리를 분할합니다. 이 경우 분할은 매우 구성 가능하여 URL의 원하는 부분만 포함하거나 서블릿 컨텍스트의 다른 정보 또는 여러 분할 수준을 생성할 수 있습니다.

사용자 정의 프로브를 작성하면 임베디드인젝티드 사용자 정의 프로브 시스템을 사용하여 동일한 방식으로 호출 트리를 분할할 수 있습니다.

스크립트로 메서드 분할

프로브에 사용할 수 있는 동일한 분할 기능을 호출 트리에서 직접 스크립트로 메서드 분할 작업을 사용하여 사용할 수 있습니다. 아래 스크린샷에서는 다른 유형의 메시지 처리를 별도로 보기 위해 JMS 메시지 핸들러에 대한 호출 트리를 분할하려고 합니다.

프로브를 작성하는 대신 문자열을 반환하는 스크립트를 입력합니다. 이 문자열은 선택된 메서드에서 호출 트리를 그룹화하는 데 사용되며 분할 노드에 표시됩니다. null을 반환하면 현재 메서드 호출은 분할되지 않고 일반적으로 호출 트리에 추가됩니다.

스크립트는 여러 매개변수에 액세스할 수 있습니다. 선택된 메서드의 클래스, 비정적 메서드의 인스턴스, 모든 메서드 매개변수가 전달됩니다. 추가로 데이터를 저장할 수 있는 ScriptContext 객체를 얻습니다. 동일한 스크립트의 이전 호출에서 일부 값을 기억해야 하는 경우, 컨텍스트에서 getObject/putObjectgetLong/putLong 메서드를 호출할 수 있습니다. 예를 들어, 특정 메서드 매개변수 값이 처음으로 나타날 때만 분할하고 싶을 수 있습니다. 그런 경우 다음을 사용할 수 있습니다.

if (scriptContext.getObject(text) != null) {
    scriptContext.putObject(text);
    return text;
} else {
    return null;
}

분할 스크립트의 일부로 사용할 수 있습니다.

분할 노드는 선택된 메서드 아래에 삽입됩니다. 위의 스크린샷 예제에서는 이제 각 JMS 메시지 대상에 대한 처리 코드를 별도로 볼 수 있습니다.

분할 위치는 선택된 호출 스택이 아닌 메서드에 바인딩됩니다. 동일한 메서드가 호출 트리의 다른 곳에 있으면 역시 분할됩니다. 분할 수준 병합 작업을 사용하면 모든 분할이 단일 노드로 병합됩니다. 그 노드는 분할을 다시 분리할 기회를 제공합니다.

너무 많은 분할을 생성하면 제한된 메서드 분할로 레이블이 지정된 노드가 모든 추가 분할 호출을 단일 트리로 누적하여 포함합니다. 노드의 하이퍼링크를 사용하여 캡 카운터를 재설정하고 더 많은 분할 노드를 기록할 수 있습니다. 분할의 최대 수를 영구적으로 늘리려면 프로파일링 설정에서 캡을 늘릴 수 있습니다.

생성한 후 분할 메서드를 편집하려면 세션 설정 대화 상자로 이동하십시오. 특정 분할 메서드가 더 이상 필요하지 않지만 나중에 사용할 수 있도록 유지하려면 스크립트 구성 앞의 체크박스를 사용하여 비활성화할 수 있습니다. 이는 호출 트리에서 병합하는 것보다 낫습니다. 녹화 오버헤드가 상당할 수 있기 때문입니다.