동일한 호출 스택의 반복된 호출에 대해 호출 트리가 누적됩니다. 이는 메모리 오버헤드와 데이터를 이해하기 쉽게 통합해야 할 필요성 때문에 필수적입니다. 그러나 때로는 선택한 지점에서 누적을 중단하여 호출 트리의 일부를 별도로 확인하고 싶을 수 있습니다.
JProfiler에는 호출 스택에 삽입되어 삽입된 노드 위의 메서드 호출에서 추출된 의미론적 정보를 보여주는 특수 노드로 호출 트리를 분할하는 개념이 있습니다. 이러한 분할 노드를 사용하면 호출 트리 내에서 직접 추가 페이로드 정보를 확인하고 여기에 포함된 서브트리를 별도로 분석할 수 있습니다. 각 분할 유형은 컨텍스트 메뉴의 액션을 통해 즉석에서 병합 및 병합 해제할 수 있으며, 메모리 오버헤드를 제한하기 위해 총 분할 노드 수에 상한이 적용됩니다.
호출 트리 분할 및 프로브
프로브는 관심 있는 선택된 메서드에서 수집한 정보에 따라 호출 트리를 분할할 수 있습니다. 예를 들어 "HTTP server" 프로브는 서로 다른 각 URL별로 호출 트리를 분할합니다. 이 경우 분할을 다양하게 구성할 수 있으므로, URL에서 원하는 부분만 포함하거나 서블릿 컨텍스트의 다른 정보를 포함할 수 있으며 여러 분할 레벨을 생성할 수도 있습니다.
자체 프로브를 작성하는 경우에도 임베디드 및 인젝티드 커스텀 프로브 시스템 모두에서 동일한 방식으로 호출 트리를 분할할 수 있습니다.
스크립트로 메서드 분할
프로브에서 사용할 수 있는 것과 동일한 분할 기능을 스크립트로 메서드 분할 액션을 통해 호출 트리에서 직접 사용할 수 있습니다. 아래 스크린샷에서는 여러 유형의 메시지 처리를 별도로 확인하기 위해 JMS 메시지 핸들러에 대한 호출 트리를 분할하려고 합니다.
프로브를 작성하는 대신 문자열을 반환하는 스크립트를 입력하기만 하면 됩니다. 이 문자열은 선택한 메서드에서 호출 트리를 그룹화하는 데 사용되며 분할 노드에 표시됩니다. null을
반환하면 현재 메서드 호출은 분할되지 않고 평소와 같이 호출 트리에 추가됩니다.
스크립트는 여러 매개변수에 접근할 수 있습니다. 선택한 메서드의 클래스, 정적이 아닌(non-static) 메서드의 인스턴스, 그리고 모든 메서드 매개변수가 전달됩니다. 또한 데이터를 저장하는 데 사용할
수 있는 ScriptContext 객체가 제공됩니다. 동일한 스크립트의 이전 호출에서 일부 값을 다시 가져와야 하는 경우 컨텍스트에서
getObject/putObject 및 getLong/putLong 메서드를 호출할 수 있습니다. 예를 들어 메서드 매개변수의 특정 값이 처음 나타났을 때만
분할하도록 설정할 수 있습니다. 이 경우 다음과 같은 코드를
if (scriptContext.getObject(text) == null) {
scriptContext.putObject(text, text);
return text;
} else {
return null;
}
분할 스크립트의 일부로 사용할 수 있습니다.
분할 노드는 선택한 메서드 아래에 삽입됩니다. 위 스크린샷의 예에서는 이제 각 JMS 메시지 대상별 처리 코드가 별도로 표시됩니다.
분할 위치는 선택한 호출 스택이 아니라 메서드에 바인딩됩니다. 호출 트리의 다른 위치에 동일한 메서드가 존재하는 경우, 해당 메서드도 함께 분할됩니다. 분할 레벨 병합 액션을 사용하면 모든 분할이 단일 노드로 병합됩니다. 이 노드를 통해 분할을 다시 병합 해제할 수 있습니다.
너무 많은 분할이 생성되면 상한이 적용된 메서드 분할이라는 레이블이 지정된 노드에 추가적인 모든 분할 호출이 단일 트리로 누적되어 포함됩니다. 노드의 하이퍼링크를 사용하면 상한 카운터를 리셋하고 분할 노드를 추가로 녹화할 수 있습니다. 최대 분할 수를 영구적으로 늘리려면 프로파일링 설정에서 상한을 늘릴 수 있습니다.
분할 메서드를 생성한 후 편집하려면 세션 설정 대화상자로 이동하십시오. 특정 분할 메서드가 더 이상 필요하지 않지만 나중에 사용하기 위해 유지하려는 경우 스크립트 구성 앞의 체크박스를 사용하여 비활성화할 수 있습니다. 녹화 오버헤드가 상당할 수 있으므로 호출 트리에서 단순히 병합하는 것보다 이 방법이 더 좋습니다.













