JProfiler 도움말

Gradle 태스크

JProfiler는 Gradle에서 프로파일링을 지원하기 위해 특별한 태스크를 제공합니다. 또한, JProfiler는 스냅샷 작업을 위한 커맨드 라인 실행 파일 들을 여러 개 제공하며, 이와 대응되는 Gradle 태스크도 존재합니다.

Gradle 태스크 사용하기

JProfiler Gradle 태스크를 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 타입의 태스크를 사용하세요.

추가 설정 없이 두 태스크 모두 프로파일링 에이전트가 JProfiler GUI로부터의 연결을 기다리는 대화형 프로파일링 세션을 기본 포트 8849에서 시작합니다. 오프라인 프로파일링을 하려면 아래 표에 나와 있는 몇 가지 속성을 추가해야 합니다.

속성 설명 필수 여부
offline 프로파일링 실행을 오프라인 모드로 할지 여부입니다. 아니오, offlinenowait은 동시에 true가 될 수 없습니다.
nowait 프로파일링을 즉시 시작할지, 아니면 프로파일된 JVM이 JProfiler GUI로부터의 연결을 기다릴지 여부입니다.
sessionId 어떤 세션 ID에서 프로파일링 설정을 가져올지 정의합니다. nowait 또는 offline이 설정되지 않은 경우에는 GUI에서 프로파일링 세션을 선택하므로 효과가 없습니다. 다음의 경우 필수
  • offline이 설정된 경우
  • 1.5 JVM에서 nowait이 설정된 경우
configFile 프로파일링 설정을 읽어올 config 파일을 정의합니다. 아니오
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 
    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 
    sessionId = 80 
    configFile = file('path/to/jprofiler_config.xml') 
} 

프로젝트에 추가하고, setAgentPathProperty에 다른 태스크의 의존성을 추가하세요. 그러면 해당 태스크의 실행 단계에서 profilingVmParameter 프로젝트 프로퍼티를 사용할 수 있습니다. 다른 태스크 프로퍼티에 이 값을 할당할 때는 doFirst {...} 코드 블록으로 감싸서 Gradle 실행 단계에서 사용되고, 설정 단계가 아님을 보장하세요.

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

com.jprofiler.gradle.Export 태스크는 저장된 스냅샷에서 뷰를 내보내는 데 사용할 수 있으며, bin/jpexport 커맨드 라인 도구의 인자와 동일하게 동작합니다. 다음 속성들을 지원합니다:

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

export 태스크에서는 views 메서드를 호출하고, 그 안에 클로저를 전달하여 view(name, file[, options])을 한 번 또는 여러 번 호출합니다. view를 호출할 때마다 하나의 출력 파일이 생성됩니다. name 인자는 뷰 이름입니다. 사용 가능한 뷰 이름 목록은 jpexport 커맨드 라인 실행 파일의 도움말 페이지를 참고하세요. file 인자는 출력 파일로, 절대 경로나 프로젝트 기준 상대 경로 모두 가능합니다. 마지막으로, 선택적인 options 인자는 선택한 뷰의 내보내기 옵션을 담은 맵입니다.

export 태스크 사용 예시는 다음과 같습니다:

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 객체를 전달할 수 있습니다.

각 스냅샷 파일에 개별적인 디옵스케이션 설정이 있다면, 파일 이름을 <파일명>:<obfuscator>:<매핑 파일> 형식으로 지정할 수 있습니다. 여기서 <obfuscator>와 <매핑 파일>은 아래의 전역 옵션에 해당합니다.

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

Export 태스크에서 뷰를 정의하는 것과 마찬가지로, Compare 태스크에는 comparisons 메서드가 있으며, 그 안에서 comparison(name, file[, options])를 중첩 호출하여 수행할 비교를 정의합니다. 사용 가능한 비교 이름 목록은 jpcompare 커맨드 라인 실행 파일의 도움말 페이지에서 확인할 수 있습니다.

compare 태스크 사용 예시는 다음과 같습니다:

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 속성과, 디옵스케이션을 위한 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') 
}