JProfiler 도움말Download

오프라인 프로파일링


JProfiler로 애플리케이션을 프로파일링하는 두 가지 근본적으로 다른 방법이 있습니다: 기본적으로 JProfiler GUI에 attach된 상태로 프로파일링합니다. JProfiler GUI는 녹화를 시작하고 중지할 수 있는 버튼을 제공하며, 모든 녹화된 프로파일링 데이터를 보여줍니다.

JProfiler GUI 없이 프로파일링하고 나중에 결과를 분석하고 싶은 상황이 있을 수 있습니다. 이러한 시나리오를 위해 JProfiler는 오프라인 프로파일링을 제공합니다. 오프라인 프로파일링을 통해 프로파일링 에이전트와 함께 프로파일된 애플리케이션을 시작할 수 있지만 JProfiler GUI와 연결할 필요는 없습니다.

그러나 오프라인 프로파일링은 여전히 몇 가지 작업을 수행해야 합니다. 최소한 하나의 스냅샷을 저장해야 하며, 그렇지 않으면 나중에 분석할 프로파일링 데이터가 제공되지 않습니다. 또한, CPU 또는 할당 데이터를 보려면 어느 시점에서 녹화를 시작해야 합니다. 마찬가지로 저장된 스냅샷에서 힙 워커를 사용하려면 힙 덤프를 트리거해야 합니다.

프로파일링 API

이 문제에 대한 첫 번째 해결책은 컨트롤러 API입니다. API를 사용하면 코드에서 모든 프로파일링 작업을 프로그래밍 방식으로 호출할 수 있습니다. api/samples/offline 디렉토리에는 컨트롤러 API를 실제로 사용하는 방법을 보여주는 실행 가능한 예제가 있습니다. 해당 디렉토리에서 ../gradlew를 실행하여 컴파일하고 실행하며, 테스트 프로그램이 호출되는 방법을 이해하기 위해 Gradle 빌드 파일 build.gradle을 공부하십시오.

컨트롤러 API는 런타임에 프로파일링 작업을 관리하는 주요 인터페이스입니다. 이는 JProfiler 설치의 bin/agent.jar에 포함되어 있거나 다음 좌표로 Maven 종속성으로 사용할 수 있습니다.

group: com.jprofiler
artifact: jprofiler-probe-injected
version: <JProfiler version>

그리고 저장소

https://maven.ej-technologies.com/repository

프로파일링 API가 애플리케이션의 일반 실행 중에 사용되는 경우, API 호출은 조용히 아무 작업도 수행하지 않습니다.

이 접근 방식의 단점은 개발 중에 JProfiler 에이전트 라이브러리를 애플리케이션의 클래스패스에 추가하고, 소스 코드에 프로파일링 지침을 추가하고, 프로그래밍 방식의 프로파일링 작업을 변경할 때마다 코드를 다시 컴파일해야 한다는 것입니다.

트리거

트리거를 사용하면 소스 코드를 수정하지 않고 JProfiler GUI에서 모든 프로파일링 작업을 지정할 수 있습니다. 트리거는 JProfiler 구성 파일에 저장됩니다. 구성 파일과 세션 ID는 오프라인 프로파일링이 활성화된 상태로 시작할 때 명령줄에서 프로파일링 에이전트에 전달되어, 프로파일링 에이전트가 해당 트리거 정의를 읽을 수 있습니다.

소스 코드에 API 호출을 추가하는 프로파일링 API와 달리, 트리거는 JVM에서 특정 이벤트가 발생할 때 활성화됩니다. 예를 들어, 메소드의 시작 또는 끝에서 특정 프로파일링 작업에 대한 API 호출을 추가하는 대신, 메소드 호출 트리거를 사용할 수 있습니다. 또 다른 사용 사례로는, 주기적으로 스냅샷을 저장하기 위해 자체 타이머 스레드를 생성하는 대신 타이머 트리거를 사용할 수 있습니다.

각 트리거에는 관련 이벤트가 발생할 때 수행되는 작업 목록이 있습니다. 이러한 작업 중 일부는 컨트롤러 API의 프로파일링 작업에 해당합니다. 또한, 메소드 호출을 매개변수 및 반환 값과 함께 출력하는 작업이나 메소드에 대한 인터셉터 스크립트를 호출하는 작업과 같은 컨트롤러 기능을 초과하는 다른 작업도 있습니다.

오프라인 프로파일링 구성

JProfiler에서 시작된 세션을 구성한 경우, 메인 메뉴에서 세션→변환 마법사→애플리케이션 세션을 오프라인으로 변환을 호출하여 오프라인 세션으로 변환할 수 있습니다. 이렇게 하면 적절한 VM 매개변수를 사용하여 시작 스크립트를 생성하고, JProfiler UI에서 사용하는 동일한 세션의 프로파일링 설정을 가져옵니다. 호출을 다른 컴퓨터로 이동하려면 세션→세션 설정 내보내기를 사용하여 세션을 구성 파일로 내보내고, 시작 스크립트의 VM 매개변수가 해당 파일을 참조하도록 해야 합니다.

통합 마법사를 사용하여 애플리케이션 서버를 프로파일링할 때, 프로파일링을 위한 VM 매개변수가 Java 호출에 삽입되도록 시작 스크립트나 구성 파일이 항상 수정됩니다. 모든 통합 마법사에는 "시작" 단계에서 오프라인 프로파일링을 구성하기 위한 "오프라인 프로파일링" 옵션이 있습니다.

통합 마법사에서 처리되지 않는 시작 스크립트가 있는 경우, 예를 들어 Java 호출에 VM 매개변수를 직접 전달하고 싶을 수 있습니다. 해당 VM 매개변수의 형식은 다음과 같습니다.

-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]

이는 [Generic application] 마법사에서 사용할 수 있습니다.

라이브러리 매개변수로 offline을 전달하면 오프라인 프로파일링이 활성화됩니다. 이 경우, JProfiler GUI와의 연결은 불가능합니다. session 매개변수는 프로파일링 설정에 사용할 구성 파일의 세션을 결정합니다. 세션의 ID는 세션 설정 대화 상자의 애플리케이션 설정 탭의 오른쪽 상단 모서리에서 볼 수 있습니다. 선택적 config 매개변수는 구성 파일을 가리킵니다. 이는 세션→세션 설정 내보내기를 호출하여 내보낼 수 있는 파일입니다. 매개변수를 생략하면 표준 구성 파일이 사용됩니다. 해당 파일은 사용자 홈 디렉토리의 .jprofiler15 디렉토리에 위치합니다.

Gradle 및 Ant를 사용한 오프라인 프로파일링

Gradle 또는 Ant에서 오프라인 프로파일링을 시작할 때, 해당 JProfiler 플러그인을 사용하여 작업을 더 쉽게 할 수 있습니다. 테스트를 프로파일링하기 위한 Gradle 작업의 일반적인 사용 예는 아래와 같습니다:

plugins {
    id 'com.jprofiler' version 'X.Y.Z'
    id 'java'
}

jprofiler {
    installDir = file('/opt/jprofiler')
}

task run(type: com.jprofiler.gradle.TestProfile) {
    offline = true
    configFile = file("path/to/jprofiler_config.xml")
    sessionId = 1234
}

com.jprofiler.gradle.JavaProfile 작업은 표준 JavaExec 작업으로 실행하는 것과 동일한 방식으로 모든 Java 클래스를 프로파일링합니다. JProfiler에서 직접 지원하지 않는 JVM을 시작하는 다른 방법을 사용하는 경우, com.jprofiler.gradle.SetAgentPathProperty 작업을 사용하여 필요한 VM 매개변수를 속성에 기록할 수 있습니다. 이는 JProfiler 플러그인을 적용할 때 기본적으로 추가되므로, 다음과 같이 간단히 작성할 수 있습니다:

setAgentPathProperty {
    propertyName = 'agentPathProperty'
    offline = true
    configFile = file("path/to/jprofiler_config.xml")
    sessionId = 1234
}

그런 다음 작업이 실행된 후 다른 곳에서 agentPathProperty를 프로젝트 속성 참조로 사용할 수 있습니다. 모든 Gradle 작업의 기능과 해당 Ant 작업은 별도의 장에서 자세히 문서화되어 있습니다.

실행 중인 JVM에 대한 오프라인 프로파일링 활성화

명령줄 유틸리티 bin/jpenable를 사용하여 버전 8 이상인 모든 실행 중인 JVM에서 오프라인 프로파일링을 시작할 수 있습니다. VM 매개변수와 마찬가지로, offline 스위치, 세션 ID 및 선택적 구성 파일을 지정해야 합니다:

jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml

이러한 호출을 통해 실행 중인 JVM 목록에서 프로세스를 선택해야 합니다. 추가 인수 --pid=<PID> --noinput를 사용하면 프로세스를 자동화하여 사용자 입력이 전혀 필요하지 않도록 할 수 있습니다.

반면에, 실행 중에 오프라인 프로파일링을 활성화할 때는 수동으로 녹화를 시작하거나 스냅샷을 저장해야 할 수도 있습니다. 이는 bin/jpcontroller 명령줄 도구로 가능합니다.

프로파일링 에이전트가 로드되었지만 프로파일링 설정이 적용되지 않은 경우, 녹화 작업을 켤 수 없으므로 jpcontroller는 연결할 수 없습니다. 이는 jpenable을 사용하여 프로파일링을 활성화했지만 offline 매개변수 없이 활성화한 경우를 포함합니다. 오프라인 모드를 활성화하면 프로파일링 설정이 지정되며 jpcontroller를 사용할 수 있습니다.

jpenablejpcontroller 실행 파일에 대한 자세한 정보는 명령줄 참조에서 확인할 수 있습니다.