JProfiler로 애플리케이션을 프로파일링하는 방법에는 근본적으로 다른 두 가지 방식이 있습니다. 기본적으로는 JProfiler GUI가 attach된 상태로 프로파일링합니다. JProfiler GUI는 녹화를 시작하고 중지할 수 있는 버튼을 제공하며, 녹화된 모든 프로파일링 데이터를 보여줍니다.
JProfiler GUI 없이 프로파일링하고 나중에 결과를 분석하고 싶은 상황이 있을 수 있습니다. 이러한 시나리오를 위해 JProfiler는 오프라인 프로파일링을 제공합니다. 오프라인 프로파일링을 사용하면 JProfiler GUI에 연결할 필요 없이 프로파일링 에이전트와 함께 프로파일된 애플리케이션을 시작할 수 있습니다.
하지만 오프라인 프로파일링에서도 여전히 몇 가지 작업을 수행해야 합니다. 나중에 분석할 수 있는 프로파일링 데이터를 확보하려면 적어도 하나의 스냅샷을 저장해야 합니다. 또한 CPU 또는 할당 데이터를 보려면 특정 시점에 녹화를 시작해야 합니다. 마찬가지로 저장된 스냅샷에서 힙 워커(heap walker)를 사용하려면 힙 덤프를 트리거해야 합니다.
프로파일링 API
이 문제에 대한 첫 번째 솔루션은 컨트롤러 API입니다. 이 API를 사용하면 코드에서 모든 프로파일링 작업을 프로그래밍 방식으로 호출할 수 있습니다.
api/samples/offline 디렉터리에는 컨트롤러 API의 실제 사용법을 보여주는 실행 가능한 예제가 있습니다. 해당 디렉터리에서
../gradlew를 실행하여 컴파일 및 실행해 보고, Gradle 빌드 파일인 build.gradle을 살펴보며 테스트 프로그램이 어떻게 호출되는지
확인해 보세요.
컨트롤러 API는 런타임에 프로파일링 작업을 관리하기 위한
기본 인터페이스입니다. 이 API는 JProfiler 설치 경로의 bin/agent.jar에 포함되어 있거나 다음과 같은 좌표의 Maven 의존성으로 제공됩니다.
group: com.jprofiler artifact: jprofiler-controller version: <JProfiler version>
(Maven Central 리포지토리)
애플리케이션의 일반적인 실행 중에 프로파일링 API가 사용되면, API 호출은 아무런 동작도 하지 않고 조용히 넘어갑니다.
이 방식의 단점은 개발 중에 JProfiler 에이전트 라이브러리를 애플리케이션의 클래스패스에 추가해야 하고, 소스 코드에 프로파일링 지시문을 추가해야 하며, 프로그래밍 방식의 프로파일링 작업을 변경할 때마다 코드를 다시 컴파일해야 한다는 점입니다.
트리거
트리거를 사용하면 소스 코드를 수정하지 않고도 JProfiler GUI에서 모든 프로파일링 작업을 지정할 수 있습니다. 트리거는 JProfiler 설정 파일에 저장됩니다. 오프라인 프로파일링을 활성화하여 시작할 때 설정 파일과 세션 ID가 명령줄을 통해 프로파일링 에이전트에 전달되므로, 프로파일링 에이전트가 해당 트리거 정의를 읽을 수 있습니다.
소스 코드에 API 호출을 추가해야 하는 프로파일링 API와 달리, 트리거는 JVM에서 특정 이벤트가 발생할 때 활성화됩니다. 예를 들어 메서드의 시작이나 끝에 특정 프로파일링 작업을 위한 API 호출을 추가하는 대신, 메서드 호출 트리거를 사용할 수 있습니다. 또 다른 사용 사례로, 스냅샷을 주기적으로 저장하기 위해 자체 타이머 스레드를 생성하는 대신 타이머 트리거를 사용할 수 있습니다.
각 트리거에는 연관된 이벤트가 발생할 때 수행되는 작업 목록이 있습니다. 이러한 작업 중 일부는 컨트롤러 API의 프로파일링 작업에 해당합니다. 또한 파라미터 및 반환값과 함께 메서드 호출을 출력하는 작업이나 메서드에 대한 인터셉터 스크립트를 호출하는 작업과 같이 컨트롤러 기능을 넘어서는 다른 작업들도 있습니다.
오프라인 프로파일링 설정
JProfiler에서 시작 세션을 구성한 경우, 메인 메뉴에서 Session→Conversion Wizards→Convert Application Session to Offline을 실행하여 오프라인 세션으로 변환할 수 있습니다. 이렇게 하면 적절한 VM 매개변수가 포함된 시작 스크립트가 생성되며, JProfiler UI에서 사용하는 것과 동일한 세션의 프로파일링 설정이 적용됩니다. 호출을 다른 컴퓨터로 옮기려면 Session→Export Session Settings를 사용하여 세션을 설정 파일로 내보내고, 시작 스크립트의 VM 매개변수가 해당 파일을 참조하도록 해야 합니다.
연동 마법사를 사용하여 애플리케이션 서버를 프로파일링할 때는 프로파일링을 위한 VM 매개변수가 Java 호출에 삽입되도록 항상 시작 스크립트나 설정 파일이 수정됩니다. 모든 연동 마법사에는 대화형 프로파일링 대신 오프라인 프로파일링을 위해 애플리케이션 서버를 설정할 수 있도록 "Startup" 단계에 "Profile offline" 옵션이 있습니다.
연동 마법사에서 처리되지 않는 시작 스크립트가 있는 경우와 같이, 사용자가 직접 Java 호출에 VM 매개변수를 전달하고자 할 수 있습니다. 해당 VM 매개변수의 형식은 다음과 같습니다.
-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]
이 매개변수는 [Generic application] 마법사에서 확인할 수 있습니다.
라이브러리 매개변수로 offline을 전달하면 오프라인 프로파일링이 활성화됩니다. 이 경우 JProfiler GUI와의 연결은 불가능합니다.
id 매개변수는 설정 파일에서 어떤 세션을 프로파일링 설정에 사용할지 결정합니다. 세션의 ID는 세션 설정 대화상자의 Application settings
탭 오른쪽 상단에서 확인할 수 있습니다. 선택 사항인 config 매개변수는 설정 파일을 가리킵니다. 이 파일은 Session→Export
Session Settings를 호출하여 내보낼 수 있는 파일입니다. 매개변수를 생략하면 표준 설정 파일이 사용됩니다. 이 파일은 사용자 홈 디렉터리의
.jprofiler16 디렉터리에 있습니다.
일반적인 오프라인 세션의 경우 id 및 config를 생략하고 다음과 같이 -agentpath 매개변수에 세션
설정을 직접 지정할 수 있습니다.
-agentpath:<path to jprofilerti library>=offline,callTreeMode=sampling,profile=com.mycorp.:org.example.
사용할 수 있는 인라인 설정 목록은 시작 시 프로파일링 설정 구성에 관한 도움말 토픽을 참조하세요. 트리거나 프로브 관련 설정과 같은 고급 설정이 필요한 경우에만 내보낸 설정 파일을 사용하세요.
API 호출이나 jpcontroller 없이 스냅샷을 저장하기 위해 자동 녹화 옵션을 추가할 수도 있습니다.
-agentpath:<path to jprofilerti library>=offline,snapshot=/path/to/snapshot.jps,recording=cpu:allocation,duration=10m
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
일반적인 오프라인 세션의 경우 --id 및 --config를 인라인 세션 설정으로 대체할 수 있습니다.
jpenable --offline --call-tree-mode=sampling --profile=com.mycorp.:org.example.
일회성(one-shot) 녹화도 동일한 방식으로 구성할 수 있습니다.
jpenable --offline --snapshot=/path/to/snapshot.jps --recording=cpu:allocation --duration=10m
이와 같이 호출하면 실행 중인 JVM 목록에서 프로세스를 선택해야 합니다. 추가 인수 --pid=<PID> --noinput을 사용하면 사용자 입력이 전혀
필요하지 않도록 프로세스를 자동화할 수 있습니다.
자동 녹화를 구성하지 않은 경우, 수동으로 녹화를 시작하거나 스냅샷을 저장해야 할 수 있습니다. 이는 bin/jpcontroller 명령줄 도구를 통해 수행할
수 있습니다.
프로파일링 에이전트가 로드만 되고 프로파일링 설정이 적용되지 않은 경우, 어떠한 녹화 작업도 켤 수 없으므로 jpcontroller가 연결할 수 없습니다.
여기에는 offline 매개변수 없이 jpenable을 사용하여 프로파일링을 활성화하는 경우가 포함됩니다. 오프라인 모드를
활성화하면 프로파일링 설정이 지정되어 jpcontroller를 사용할 수 있습니다.
jpenable 및 jpcontroller 실행 파일에 대한 자세한 정보는 명령줄 참조에서
확인할 수 있습니다.







