JProfiler 도움말

Gradle 태스크

JProfiler는 전용 태스크를 통해 Gradle에서의 프로파일링을 지원합니다. 또한 JProfiler는 이에 대응하는 Gradle 태스크를 갖춘 여러 스냅샷 작업용 명령줄 실행 파일을 제공합니다.

Gradle 태스크 사용하기

Gradle 빌드 파일에서 JProfiler Gradle 태스크를 사용할 수 있도록 하려면 plugins 블록을 사용할 수 있습니다.

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

이러한 목적으로 Gradle 플러그인 리포지토리를 사용하지 않으려는 경우, Gradle 플러그인은 bin/gradle.jar 파일로 배포됩니다.

기본적으로 플러그인은 플러그인과 동일한 버전의 JProfiler 배포판을 자동으로 프로비저닝하여 <Gradle 사용자 홈>/jprofiler/dist에 저장합니다. 캐시 디렉터리를 재정의하려면 jprofiler 블록에서 autoProvisioningCacheDir 프로퍼티를 설정하십시오.

대신 로컬 JProfiler 설치본을 사용하려면 JProfiler Gradle 플러그인에 JProfiler가 설치된 위치를 지정하십시오. macOS에서 설치 디렉터리는 애플리케이션 번들의 경로(예: /Applications/JProfiler.app)입니다.

jprofiler {
    installDir = file('/path/to/jprofiler/home')
}

Gradle에서 프로파일링하기

com.jprofiler.gradle.JavaProfile 유형의 태스크를 사용하면 모든 Java 프로세스를 프로파일링할 수 있습니다. 이 클래스는 Gradle의 기본 제공 JavaExec를 확장하므로 프로세스 구성에 동일한 인수를 사용할 수 있습니다. 테스트를 프로파일링하려면 Gradle Test 태스크를 확장하는 com.jprofiler.gradle.TestProfile 유형의 태스크를 사용하십시오.

추가 구성 없이 두 태스크 모두 프로파일링 에이전트가 기본 포트 8849에서 JProfiler GUI의 연결을 대기하는 대화형 프로파일링 세션을 시작합니다. 오프라인 프로파일링의 경우 내보낸 구성 파일을 참조하거나 아래 표에 표시된 속성을 사용하여 공통 세션 설정 및 자동 녹화를 직접 구성할 수 있습니다.

속성 설명 필수 여부
offline 프로파일링 실행을 오프라인 모드로 수행할지 여부입니다. 아니요, offline과 nowait는 둘 다 true일 수 없습니다.
nowait 프로파일링을 즉시 시작할지, 아니면 프로파일된 JVM이 JProfiler GUI의 연결을 대기할지 여부입니다.
sessionId 프로파일링 설정을 가져올 세션 ID를 정의합니다. nowait와 offline이 모두 설정되지 않은 경우 GUI에서 프로파일링 세션이 선택되므로 아무 영향도 미치지 않습니다. 오프라인 프로파일링을 위해 configFile이 설정된 경우에만 필수
configFile 프로파일링 설정을 읽어올 구성 파일을 정의합니다. 오프라인 프로파일링 시 이 속성을 생략하면 아래 속성을 통해 공통 세션 설정을 직접 구성할 수 있습니다. 이러한 속성이 하나도 설정되지 않으면 기본 오프라인 세션 설정이 사용됩니다. 아니요
callTreeMode 구성 파일 없는 오프라인 프로파일링을 위한 호출 트리 수집 모드를 선택합니다. Gradle에서는 com.jprofiler.buildtools.CallTreeMode의 값을 사용할 수 있습니다. 문자열 값은 sampling, instrumentation, instr, async입니다. 아니요
profile, compact, ignore 구성 파일 없는 오프라인 프로파일링을 위한 패키지 또는 클래스 필터입니다. 값은 :로 구분된 항목이 포함된 문자열이거나 문자열 목록일 수 있습니다. 아니요
lineNumbers 호출 트리에 줄 번호를 기록할지 여부입니다. 아니요
snapshotFile 자동 오프라인 녹화를 위한 스냅샷 파일입니다. recording 없이 이 항목만 설정되면 CPU 데이터가 기록됩니다. 스레드와 텔레메트리는 항상 기록됩니다. 아니요
recording 자동 오프라인 녹화를 위한 데이터 유형입니다. 값은 :로 구분된 항목이 포함된 문자열이거나 문자열 목록일 수 있습니다. 일반적인 값은 cpu, allocation, jdbc, jpa, mongo_db, http_server, http_client입니다. 지원되는 녹화 값의 전체 목록은 해당하는 -agentpath 옵션에 문서화되어 있습니다. 프로브 녹화를 선택하면 CPU 데이터도 함께 기록됩니다. 아니요, 단 설정 시 snapshotFile 필요
duration 자동 오프라인 녹화의 지속 시간입니다(예: 30s, 10m 또는 1h). 이 속성이 없으면 JVM이 종료될 때까지 녹화가 계속되며 스냅샷은 그 시점에 저장됩니다. 아니요, 단 설정 시 snapshotFile 필요
delay 자동 오프라인 녹화가 시작되기 전 지연 시간입니다(예: 10s 또는 1m). 아니요, 단 설정 시 snapshotFile 필요
port 프로파일링 에이전트가 JProfiler GUI의 연결을 수신 대기할 포트 번호를 정의합니다. 이는 원격 세션 구성에 구성된 포트와 동일해야 합니다. 설정하지 않거나 0인 경우 기본 포트(8849)가 사용됩니다. offline이 설정된 경우 GUI로부터의 연결이 없으므로 아무 영향도 미치지 않습니다. 아니요
debugOptions 튜닝이나 디버깅 목적으로 추가 라이브러리 매개변수를 전달하려는 경우 이 속성을 사용하여 지정할 수 있습니다. 아니요

포함된 프로젝트에 의해 컴파일되는 main 메서드가 있는 Java 클래스를 프로파일링하는 예시는 아래와 같습니다:

task run(type: com.jprofiler.gradle.JavaProfile) {
    mainClass = 'com.mycorp.MyMainClass'
    classpath sourceSets.main.runtimeClasspath
    offline = true
    callTreeMode = 'sampling'
    profile = ['com.mycorp.', 'org.example.']
    snapshotFile = file('build/snapshots/run.jps')
    recording = ['cpu', 'allocation', 'jdbc']
    duration = '10m'
}

구성 파일 없는 속성으로 다루지 않는 고급 설정의 경우 구성 파일을 내보낸 후 configFile 및 sessionId로 참조하십시오.

task run(type: com.jprofiler.gradle.JavaProfile) {
    mainClass = 'com.mycorp.MyMainClass'
    classpath sourceSets.main.runtimeClasspath
    offline = true
    sessionId = 80
    configFile = file('path/to/jprofiler_config.xml')
}

이 태스크의 실행 가능한 예제는 api/samples/offline 샘플 프로젝트에서 확인할 수 있습니다. 표준 JavaExec 태스크와 달리, JavaProfile 태스크는 createProcess()를 호출하여 백그라운드에서 시작할 수도 있습니다. 이 기능에 대한 데모는 api/samples/mbean 샘플 프로젝트를 참조하십시오.

프로파일링에 필요한 VM 매개변수가 필요한 경우, com.jprofiler.gradle.SetAgentpathProperty 태스크는 이를 propertyName 속성으로 구성된 이름의 프로퍼티에 할당합니다. JProfiler 플러그인을 적용하면 프로젝트에 이 유형의 setAgentPathProperty라는 태스크가 자동으로 추가됩니다. 이전 예제에서 사용될 VM 매개변수를 가져오려면 프로젝트에 다음을 추가하고

setAgentPathProperty {
    propertyName = 'profilingVmParameter'
    offline = true
    callTreeMode = 'sampling'
    profile = ['com.mycorp.', 'org.example.']
}

다른 태스크에 setAgentPathProperty에 대한 의존성을 추가하면 됩니다. 그런 다음 해당 태스크의 실행 단계에서 프로젝트 프로퍼티 profilingVmParameter를 사용할 수 있습니다. 해당 프로퍼티를 다른 태스크 프로퍼티에 할당할 때는 Gradle 구성 단계가 아닌 실행 단계에 있도록 doFirst {...} 코드 블록으로 사용 부분을 감싸십시오.

스냅샷에서 데이터 내보내기

com.jprofiler.gradle.Export 태스크는 저장된 스냅샷에서 뷰를 내보내는 데 사용할 수 있으며, bin/jpexport 명령줄 도구의 인수를 복제합니다. 이 태스크는 다음 속성을 지원합니다:

속성 설명 필수 여부
snapshotFile 스냅샷 파일의 경로입니다. 확장자가 .jps인 파일이어야 합니다. 예
ignoreErrors 뷰의 옵션을 설정할 수 없을 때 발생하는 오류를 무시하고 다음 뷰를 계속 진행합니다. 기본값은 false이며, 첫 번째 오류가 발생할 때 내보내기가 종료됨을 의미합니다. 아니요
csvSeparator CSV 내보내기용 필드 구분자 문자입니다. 기본값은 ","입니다. 아니요
obfuscator 선택한 난독화 도구에 대해 클래스 및 메서드 이름을 난독화 해제합니다. 기본값은 "none"이며, 다른 값의 경우 mappingFile 옵션을 지정해야 합니다. none, proguard, yguard 중 하나입니다. 아니요
mappingFile 선택한 난독화 도구의 매핑 파일입니다. obfuscator 속성이 지정된 경우에만 설정할 수 있습니다. obfuscator가 지정된 경우에만 필수

내보내기 태스크에서는 views 메서드를 호출하고 view(name, file[, options])를 한 번 또는 여러 번 호출하는 클로저를 전달합니다. view를 호출할 때마다 하나의 출력 파일이 생성됩니다. name 인수는 뷰 이름입니다. 사용 가능한 뷰 이름 목록은 jpexport 명령줄 실행 파일의 도움말 페이지를 참조하십시오. file 인수는 출력 파일로, 절대 경로 파일이거나 프로젝트 기준 상대 경로 파일입니다. 마지막으로 선택적 options 인수는 선택한 뷰의 내보내기 옵션이 포함된 맵입니다.

내보내기 태스크를 사용하는 예시는 다음과 같습니다:

task export(type: com.jprofiler.gradle.Export) {
    snapshotFile = file('snapshot.jps')
    views {
        view('CallTree', 'callTree.html')
        view('HotSpots', 'hotSpots.html',
            [threadStatus: 'all', expandBacktraces: 'true'])
    }
}

스냅샷 비교하기

bin/jpcompare 명령줄 도구와 마찬가지로, com.jprofiler.gradle.Compare 태스크는 둘 이상의 스냅샷을 비교할 수 있습니다. 해당 속성은 다음과 같습니다:

속성 설명 필수 여부
snapshotFiles 비교할 스냅샷 파일입니다. Gradle이 파일 컬렉션으로 확인하는 객체가 포함된 모든 Iterable을 전달할 수 있습니다.

스냅샷 파일에 개별적인 난독화 해제 설정이 있는 경우, 파일 이름은 <file name>:<obfuscator>:<mapping file> 형식일 수 있으며, 여기서 <obfuscator>와 <mapping file>은 아래의 전역 옵션에 해당합니다.

예
obfuscator 선택한 난독화 도구에 대해 클래스 및 메서드 이름을 난독화 해제합니다. 기본값은 "none"이며, 다른 값의 경우 mappingFile 옵션을 지정해야 합니다. none, proguard, yguard 중 하나입니다. 아니요
mappingFile 선택한 난독화 도구의 매핑 파일입니다. obfuscator 속성이 지정된 경우에만 설정할 수 있습니다. obfuscator가 지정된 경우에만 필수
sortByTime true로 설정하면 제공된 모든 스냅샷 파일이 파일 수정 시간순으로 정렬되며, 그렇지 않으면 snapshotFiles 속성에 지정된 순서대로 비교됩니다. 아니요
ignoreErrors 비교 옵션을 설정할 수 없을 때 발생하는 오류를 무시하고 다음 비교를 계속 진행합니다. 기본값은 false이며, 첫 번째 오류가 발생할 때 비교가 종료됨을 의미합니다. 아니요

Export 태스크에 내보낼 뷰가 정의되는 것과 마찬가지로, Compare 태스크에는 comparison(name, file[, options])에 대한 중첩 호출을 통해 수행할 비교를 정의하는 comparisons 메서드가 있습니다. 사용 가능한 비교 이름 목록은 jpcompare 명령줄 실행 파일의 도움말 페이지에서 확인할 수 있습니다.

비교 태스크를 사용하는 예시는 다음과 같습니다:

task compare(type: com.jprofiler.gradle.Compare) {
    snapshotFiles = files('snapshot1.jps', 'snapshot2.jps')
    comparisons {
        comparison('CallTree', 'callTree.html')
        comparison('HotSpots', 'hotSpots.csv',
            [valueSummation: 'total', format: 'csv'])
    }
}

또는 여러 스냅샷에 대한 텔레메트리 비교를 생성하려는 경우:

task compare(type: com.jprofiler.gradle.Compare) {
    snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps')
    sortByTime = true
    comparisons {
        comparison('TelemetryHeap', 'heap.html', [valueType: 'maximum'])
        comparison('ProbeTelemetry', 'jdbc.html', [probeId: 'JdbcProbe'])
    }
}

힙 스냅샷 분석하기

Gradle 태스크 com.jprofiler.gradle.Analyze는 bin/jpanalyze 명령줄 도구와 동일한 기능을 제공합니다.

이 태스크에는 처리할 스냅샷을 지정하기 위한 Compare 태스크와 같은 snapshotFiles 속성이 있으며, 난독화 해제를 위한 Export 태스크와 같은 obfuscator 및 mappingFile 속성이 있습니다. removeUnreferenced, retainSoft, retainWeak, retainPhantom, retainFinalizer, retained 속성은 명령줄 도구의 인수에 해당합니다.

Analyze 태스크를 사용하는 예시는 아래와 같습니다:

task analyze(type: com.jprofiler.gradle.Analyze) {
    snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps')
    retainWeak = true
    obfuscator = 'proguard'
    mappingFile = file('obfuscation.txt')
}