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가 설치된 위치를 알려주어야 합니다.

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

Gradle에서 프로파일링하기

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

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

속성 설명 필수 여부
offline 프로파일링 실행을 오프라인 모드로 할지 여부입니다. 아니오, offlinenowait은 동시에 true일 수 없습니다.
nowait 프로파일링을 즉시 시작할지, 아니면 프로파일된 JVM이 JProfiler GUI의 연결을 기다릴지 여부입니다.
sessionId 프로파일링 설정을 가져올 session ID를 정의합니다. nowaitoffline 중 어느 것도 설정되지 않은 경우에는 효과가 없으며, 그 경우 프로파일링 session은 GUI에서 선택됩니다. 오프라인 프로파일링에서 configFile이 설정된 경우에만
configFile 프로파일링 설정을 읽어올 설정 파일을 정의합니다. 오프라인 프로파일링에서 이 속성을 생략하면 아래 속성들로 공통 session 설정을 직접 구성할 수 있습니다. 이러한 속성이 하나도 설정되지 않으면 기본 오프라인 session 설정이 사용됩니다. 아니오
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의 연결을 기다릴 포트 번호를 정의합니다. 이 값은 remote session 구성에서 설정된 포트와 동일해야 합니다. 설정하지 않거나 0으로 설정하면 기본 포트(8849)가 사용됩니다. offline이 설정된 경우에는 GUI로부터의 연결이 없으므로 효과가 없습니다. 아니오
debugOptions 튜닝 또는 디버깅 목적으로 추가 library 파라미터를 전달하려면 이 속성을 사용할 수 있습니다. 아니오

포함된 프로젝트에서 컴파일된 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'
}

설정 파일 없는 속성으로 처리되지 않는 고급 설정의 경우, 설정 파일을 내보내고 configFilesessionId로 참조하십시오.

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 태스크에는 comparisons 메서드가 있으며, 그 안에서 comparison(name, file[, options])를 중첩 호출하여 수행할 비교를 정의합니다. 사용 가능한 비교 이름 목록은 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 태스크와 같은 obfuscatormappingfile 속성을 가집니다. 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')
}