JProfiler 도움말Download

JVM 프로파일링


JVM을 프로파일링하려면 JProfiler의 프로파일링 에이전트를 JVM에 로드해야 합니다. 이는 두 가지 방법으로 가능합니다: 시작 스크립트에서 -agentpath VM 매개변수를 지정하거나 attach API를 사용하여 이미 실행 중인 JVM에 에이전트를 로드하는 방법입니다.

JProfiler는 두 가지 모드를 모두 지원합니다. VM 매개변수를 추가하는 것이 프로파일링의 선호되는 방법이며, 통합 마법사, IDE 플러그인 및 JProfiler 내에서 JVM을 시작하는 세션 구성에서 사용됩니다. attach는 로컬 및 SSH를 통한 원격에서도 작동합니다.

-agentpath VM 매개변수

프로파일링 에이전트를 로드하는 VM 매개변수가 어떻게 구성되는지 이해하는 것이 유용합니다. -agentpath 는 JVMTI 인터페이스를 사용하는 모든 종류의 네이티브 라이브러리를 로드하기 위해 JVM에서 제공하는 일반적인 VM 매개변수입니다. 프로파일링 인터페이스 JVMTI는 네이티브 인터페이스이기 때문에 프로파일링 에이전트는 네이티브 라이브러리여야 합니다. 이는 명시적으로 지원되는 플랫폼에서만 프로파일링할 수 있음을 의미합니다. 32비트 및 64비트 JVM도 다른 네이티브 라이브러리가 필요합니다. 반면, Java 에이전트는 -javaagent VM 매개변수로 로드되며 제한된 기능 세트에만 액세스할 수 있습니다.

-agentpath: 뒤에는 네이티브 라이브러리의 전체 경로 이름이 추가됩니다. 플랫폼별 라이브러리 이름만 지정하는 -agentlib:라는 동등한 매개변수가 있지만, 이 경우 라이브러리가 라이브러리 경로에 포함되어 있는지 확인해야 합니다. 라이브러리 경로 뒤에는 등호를 추가하고 옵션을 에이전트에 전달할 수 있으며, 쉼표로 구분됩니다. 예를 들어, Linux에서는 전체 매개변수가 다음과 같이 보일 수 있습니다:

-agentpath:/opt/jprofiler15/bin/linux-x64/libjprofilerti.so=port=8849,nowait

첫 번째 등호는 경로 이름과 매개변수를 구분하고, 두 번째 등호는 매개변수 port=8849의 일부입니다. 이 일반적인 매개변수는 프로파일링 에이전트가 JProfiler GUI로부터 연결을 수신하는 포트를 정의합니다. 8849는 실제로 기본 포트이므로 해당 매개변수를 생략할 수도 있습니다. 동일한 머신에서 여러 JVM을 프로파일링하려면 다른 포트를 할당해야 합니다. IDE 플러그인과 로컬로 시작된 세션은 이 포트를 자동으로 할당하며, 통합 마법사에서는 포트를 명시적으로 선택해야 합니다.

두 번째 매개변수 nowait는 프로파일링 에이전트가 시작 시 JVM을 차단하지 않고 JProfiler GUI가 연결되기를 기다리지 않도록 지시합니다. 시작 시 차단은 기본값입니다. 왜냐하면 프로파일링 에이전트는 명령줄 매개변수로 프로파일링 설정을 받지 않고 JProfiler GUI 또는 대안적으로 구성 파일에서 받기 때문입니다. 명령줄 매개변수는 프로파일링 에이전트를 부트스트랩하는 데만 사용되며, 시작 방법과 디버그 플래그를 전달하는 데 사용됩니다.

특정 상황에서는 시작 시 프로파일링 설정을 설정해야 하며, 이를 달성하기 위해 수동 작업이 필요할 수 있습니다.

기본적으로 JProfiler 에이전트는 통신 소켓을 루프백 인터페이스에 바인딩합니다. 특정 인터페이스를 선택하려면 address=[IP 주소] 옵션을 추가하거나 address=0.0.0.0을 사용하여 통신 소켓을 모든 사용 가능한 네트워크 인터페이스에 바인딩할 수 있습니다. 이는 도커 컨테이너에서 프로파일링 포트를 게시하려는 경우 필요할 수 있습니다.

로컬로 시작된 세션

IDE의 "실행 구성"처럼, JProfiler에서 로컬로 시작된 세션을 직접 구성할 수 있습니다. 클래스패스, 메인 클래스, 작업 디렉토리, VM 매개변수 및 인수를 지정하면 JProfiler가 세션을 시작합니다. JProfiler와 함께 제공되는 모든 데모 세션은 로컬로 시작된 세션입니다.

특별한 시작 모드는 "Web Start"로, JNLP 파일의 URL을 선택하면 JProfiler가 이를 프로파일링하기 위해 JVM을 시작합니다. 이 기능은 OpenWebStart를 지원하며, Java 9 이전 Oracle JRE의 레거시 WebStart는 지원되지 않습니다.

로컬로 시작된 세션은 변환 마법사를 통해 독립 실행형 세션으로 변환할 수 있으며, 주 메뉴에서 세션→변환 마법사를 호출하여 수행할 수 있습니다. 애플리케이션 세션을 원격으로 변환은 시작 스크립트를 생성하고 -agentpath VM 매개변수를 Java 호출에 삽입합니다. 애플리케이션 세션을 오프라인으로 변환오프라인 프로파일링을 위한 시작 스크립트를 생성하며, 이는 시작 시 구성이 로드되고 JProfiler GUI가 필요하지 않음을 의미합니다. 애플리케이션 세션을 재배포 세션으로 변환은 동일한 작업을 수행하지만, 프로파일링 에이전트와 구성 파일이 포함된 디렉토리 jprofiler_redist를 생성하여 JProfiler가 설치되지 않은 다른 머신으로 전송할 수 있습니다.

프로파일링된 애플리케이션을 직접 개발하는 경우, 시작된 세션 대신 IDE 통합을 사용하는 것을 고려하십시오. 이는 더 편리하고 더 나은 소스 코드 탐색을 제공합니다. 애플리케이션을 직접 개발하지 않지만 시작 스크립트가 이미 있는 경우, 원격 통합 마법사를 사용하는 것을 고려하십시오. 이는 Java 호출에 추가해야 하는 정확한 VM 매개변수를 알려줍니다.

통합 마법사

JProfiler의 통합 마법사는 시작 스크립트나 구성 파일을 프로그래밍적으로 수정하여 추가 VM 매개변수를 포함할 수 있는 잘 알려진 서드파티 컨테이너를 처리합니다. 일부 제품의 경우, VM 매개변수가 인수로 전달되거나 환경 변수로 전달되는 시작 스크립트를 생성할 수 있습니다.

모든 경우에, JProfiler가 수정 작업을 수행할 수 있도록 서드파티 제품의 특정 파일을 찾아야 합니다. 일부 일반 마법사는 프로파일링을 활성화하기 위해 수행해야 할 작업에 대한 지침만 제공합니다.

각 통합 마법사의 첫 번째 단계는 로컬 머신에서 프로파일링할지 원격 머신에서 프로파일링할지를 선택하는 것입니다. 로컬 머신의 경우, JProfiler가 이미 플랫폼, JProfiler가 설치된 위치 및 구성 파일의 위치를 알고 있기 때문에 제공해야 할 정보가 적습니다.

중요한 결정은 위에서 논의된 "시작 모드"입니다. 기본적으로 프로파일링 설정은 시작 시 JProfiler UI에서 전송되지만, JVM이 즉시 시작되도록 프로파일링 에이전트에 지시할 수도 있습니다. 후자의 경우, JProfiler GUI가 연결되면 프로파일링 설정을 적용할 수 있습니다.

그러나 프로파일링 설정이 포함된 구성 파일을 지정할 수도 있으며, 이는 훨씬 더 효율적입니다. 이는 구성 동기화 단계에서 수행됩니다. 이 경우 주요 문제는 로컬에서 프로파일링 설정을 편집할 때마다 구성 파일을 원격 측과 동기화해야 한다는 것입니다. 가장 우아한 방법은 원격 주소 단계에서 SSH를 통해 원격 머신에 연결하는 것이며, 그러면 구성 파일이 SSH를 통해 자동으로 전송될 수 있습니다.

통합 마법사의 끝에서는 프로파일링을 시작하는 세션이 생성되며, 비일반적인 경우에는 애플리케이션 서버와 같은 서드파티 제품도 시작됩니다.

외부 시작 스크립트는 세션 구성 대화 상자의 애플리케이션 설정 탭에서 시작 스크립트 실행중지 스크립트 실행 옵션으로 처리되며, URL은 URL로 브라우저 열기 체크 박스를 선택하여 표시할 수 있습니다. 여기에서 원격 머신의 주소와 구성 동기화 옵션을 변경할 수도 있습니다.

통합 마법사는 모두 프로파일링된 JVM이 원격 머신에서 실행되는 경우를 처리합니다. 그러나 구성 파일이나 시작 스크립트를 수정해야 하는 경우, 로컬 머신으로 복사하여 수정된 버전을 원격 머신으로 다시 전송해야 합니다. 명령줄 도구 jpintegrate를 원격 머신에서 직접 실행하여 수정 작업을 수행하는 것이 더 편리할 수 있습니다. jpintegrate는 JProfiler의 전체 설치가 필요하며 JProfiler GUI와 동일한 JRE 요구 사항을 가지고 있습니다.

원격 프로파일링 세션을 시작할 때 오류가 발생하면, 문제를 해결하기 위해 수행할 수 있는 단계의 체크리스트를 보려면 문제 해결 가이드를 참조하십시오.

IDE 통합

애플리케이션을 프로파일링하는 가장 편리한 방법은 IDE 통합을 통해서입니다. 개발 중에 IDE에서 애플리케이션을 시작하는 경우, IDE는 이미 필요한 모든 정보를 가지고 있으며 JProfiler 플러그인은 프로파일링을 위한 VM 매개변수를 간단히 추가하고, 필요시 JProfiler를 시작하고 프로파일링된 JVM을 JProfiler 메인 창에 연결할 수 있습니다.

모든 IDE 통합은 JProfiler 설치의 integrations 디렉토리에 포함되어 있습니다. 원칙적으로 해당 디렉토리의 아카이브는 해당 IDE의 플러그인 설치 메커니즘을 통해 수동으로 설치할 수 있습니다. 그러나 IDE 통합을 설치하는 선호되는 방법은 주 메뉴에서 세션→IDE 통합을 호출하는 것입니다.

IDE에서 프로파일링 세션은 JProfiler에서 자체 세션 항목을 얻지 못합니다. 이는 그러한 세션이 JProfiler GUI에서 시작될 수 없기 때문입니다. 프로파일링 설정은 프로젝트별 또는 실행 구성별로 설정에 따라 지속됩니다.

IDE에 연결되면 JProfiler는 도구 모음에 창 전환기를 표시하여 IDE의 관련 창으로 쉽게 이동할 수 있습니다. 모든 소스 보기 작업은 이제 JProfiler의 내장 소스 뷰어 대신 IDE에서 직접 소스를 표시합니다.

IDE 통합은 후속 장에서 자세히 논의됩니다.

Attach 모드

JVM을 프로파일링하려는 의도를 미리 결정할 필요는 없습니다. JProfiler의 attach 기능을 사용하면 실행 중인 JVM을 선택하고 프로파일링 에이전트를 즉시 로드할 수 있습니다. attach 모드는 편리하지만, 인지해야 할 몇 가지 단점이 있습니다:

  • 프로파일링하려는 JVM을 실행 중인 JVM 목록에서 식별해야 합니다. 동일한 머신에서 많은 JVM이 실행 중인 경우 이는 때때로 까다로울 수 있습니다.
  • 많은 클래스에 계측을 추가하기 위해 잠재적으로 많은 클래스가 재정의되어야 하기 때문에 추가적인 오버헤드가 있습니다.
  • JProfiler의 일부 기능은 attach 모드에서 사용할 수 없습니다. 이는 주로 JVMTI의 일부 기능이 JVM이 초기화될 때만 켜질 수 있으며 JVM의 라이프사이클의 후반 단계에서는 사용할 수 없기 때문입니다.
  • 일부 기능은 모든 클래스의 큰 부분에서 계측이 필요합니다. 클래스가 로드되는 동안 계측을 추가하는 것은 저렴하지만, 클래스가 이미 로드된 후에 계측을 추가하는 것은 그렇지 않습니다. 이러한 기능은 attach 모드를 사용할 때 기본적으로 비활성화됩니다.
  • Attach 기능은 OpenJDK JVM, 버전 6 이상의 Oracle JVM, 최근 OpenJ9 JVM(8u281+, 11.0.11+ 또는 Java 17+) 또는 해당 릴리스를 기반으로 한 IBM JVM에서 지원됩니다. JVM에 대해 -XX:+PerfDisableSharedMem-XX:+DisableAttachMechanism VM 매개변수를 지정해서는 안 됩니다.

JProfiler의 시작 센터에 있는 빠른 Attach 탭은 프로파일링할 수 있는 모든 JVM을 나열합니다. 목록 항목의 배경색은 프로파일링 에이전트가 이미 로드되었는지, JProfiler GUI가 현재 연결되어 있는지 또는 오프라인 프로파일링이 구성되었는지를 나타냅니다.

프로파일링 세션을 시작할 때 세션 설정 대화 상자에서 프로파일링 설정을 구성할 수 있습니다. 동일한 프로세스를 반복적으로 프로파일링할 때 동일한 구성을 반복해서 입력하고 싶지 않으므로, 빠른 attach 기능으로 생성된 세션을 닫을 때 영구 세션을 저장할 수 있습니다. 다음에 이 프로세스를 프로파일링하려면 빠른 Attach 탭 대신 세션 열기 탭에서 저장된 세션을 시작하십시오. 여전히 실행 중인 JVM을 선택해야 하지만, 프로파일링 설정은 이전에 구성한 것과 동일합니다.

로컬 서비스에 attach

JVM의 attach API는 호출 프로세스가 attach하려는 프로세스와 동일한 사용자로 실행되어야 하므로 JProfiler에 표시되는 JVM 목록은 현재 사용자로 제한됩니다. 다른 사용자가 시작한 프로세스는 대부분 서비스입니다. 서비스에 attach하는 방법은 Windows, Linux 및 Unix 기반 플랫폼에서 다릅니다.

Windows에서는 attach 대화 상자에 서비스 표시 버튼이 있어 로컬에서 실행 중인 모든 서비스를 나열합니다. JProfiler는 이러한 프로세스에 attach할 수 있도록 브리지 실행 파일을 시작하여 어떤 사용자로 실행되든 상관없이 attach할 수 있습니다.

Linux에서는 JProfiler가 대부분의 Linux 배포판의 일부인 PolicyKit을 통해 UI에서 직접 사용자를 전환하는 것을 지원합니다. attach 대화 상자에서 사용자 전환을 클릭하면 다른 사용자 이름을 입력하고 시스템 비밀번호 대화 상자로 인증할 수 있습니다.

macOS를 포함한 Unix 기반 플랫폼에서는 su 또는 sudo를 사용하여 다른 사용자로 명령줄 도구 jpenable을 실행할 수 있습니다. 이는 Unix 변형 또는 Linux 배포판에 따라 다릅니다. macOS 및 Ubuntu와 같은 Debian 기반 Linux 배포판에서는 sudo가 사용됩니다.

sudo를 사용하여 호출

sudo -u userName jpenable
su를 사용하면 필요한 명령줄은
su userName -c jpenable

jpenable은 JVM을 선택하고 프로파일링 에이전트가 수신 대기 중인 포트를 알려줍니다. 그 후에는 JProfiler UI의 로컬 세션 또는 jpenable이 제공한 포트에 직접 연결하는 SSH 연결로 연결할 수 있습니다.

원격 머신의 JVM에 attach

프로파일링을 위한 가장 까다로운 설정은 원격 프로파일링입니다 - JProfiler GUI는 로컬 머신에서 실행되고 프로파일링된 JVM은 다른 머신에서 실행됩니다. 프로파일링된 JVM에 -agentpath VM 매개변수를 전달하는 설정의 경우, 원격 머신에 JProfiler를 설치하고 로컬 머신에 원격 세션을 설정해야 합니다. JProfiler의 원격 attach 기능을 사용하면 이러한 수정이 필요하지 않습니다. 원격 머신에 로그인하기 위한 SSH 자격 증명만 필요합니다.

SSH 연결을 통해 JProfiler는 "JProfiler 설치" 도움말 주제에서 논의된 에이전트 패키지를 업로드하고 원격 머신에서 포함된 명령줄 도구를 실행할 수 있습니다. 로컬 머신에 SSH가 설정되어 있을 필요는 없으며, JProfiler는 자체 구현을 제공합니다. 가장 간단한 설정에서는 호스트, 사용자 이름 및 인증을 정의하기만 하면 됩니다.

SSH 연결을 통해 JProfiler는 실행 중인 JVM을 자동으로 검색하거나 프로파일링 에이전트가 이미 수신 대기 중인 특정 포트에 연결할 수 있습니다. 후자의 경우, 위에서 설명한 대로 원격 머신에서 jpenable 또는 jpintegrate를 사용하여 프로파일링을 위한 특수 JVM을 준비할 수 있습니다. 그런 다음, SSH 원격 attach를 구성하여 구성된 프로파일링 포트에 직접 연결할 수 있습니다.

자동 검색은 SSH 로그인 사용자로 시작된 원격 머신의 모든 JVM을 나열합니다. 대부분의 경우, 이는 프로파일링하려는 서비스를 시작한 사용자가 아닐 것입니다. 서비스 시작 사용자는 일반적으로 SSH 연결이 허용되지 않기 때문에, JProfiler는 사용자 전환 하이퍼링크를 추가하여 sudo 또는 su를 사용하여 해당 사용자로 전환할 수 있습니다.

복잡한 네트워크 토폴로지에서는 원격 머신에 직접 연결할 수 없는 경우가 있습니다. 이 경우, JProfiler에 GUI에서 멀티 홉 SSH 터널로 연결하도록 지시할 수 있습니다. SSH 터널의 끝에서 하나의 직접 네트워크 연결을 수행할 수 있으며, 일반적으로 "127.0.0.1"로 연결합니다.

다른 인증 메커니즘의 경우, OpenSSH 터널 모드를 사용할 수 있습니다. OpenSSH 실행 파일을 사용할 때 명령줄에서 입력하는 것처럼 호스트 이름을 입력합니다. 이는 OpenSSH 구성 파일에 구성된 별칭일 수도 있습니다. Windows에서는 Microsoft의 내장 OpenSSH 클라이언트만 지원됩니다.

SSH 옵션 텍스트 필드는 명령줄에서 OpenSSH 실행 파일에 지정할 임의의 추가 인수를 허용합니다. 이는 특히 AWS 세션 관리자를 통해 SSH 연결을 터널링하는 방법에 대한 튜토리얼에서 제공된 지침을 따를 때 유용합니다.

HPROF 스냅샷은 SSH 로그인 사용자로 시작된 JVM에 대해서만 촬영할 수 있습니다. 이는 HPROF 스냅샷이 JVM을 시작한 사용자의 액세스 권한으로 작성된 중간 파일을 필요로 하기 때문입니다. 보안상의 이유로 다운로드를 위해 SSH 로그인 사용자에게 파일 권한을 전송하는 것은 불가능합니다. 전체 프로파일링 세션에는 이러한 제한이 없습니다.

Docker 컨테이너에서 실행 중인 JVM에 attach

Docker 컨테이너에는 일반적으로 SSH 서버가 설치되어 있지 않으며, Docker 컨테이너에서 jpenable을 사용할 수 있지만, Docker 파일에 명시하지 않는 한 프로파일링 포트는 외부에서 액세스할 수 없습니다.

JProfiler에서는 Windows 또는 macOS의 로컬 Docker Desktop 설치에서 실행 중인 JVM에 attach할 수 있으며, 빠른 attach 대화 상자에서 Docker 컨테이너를 선택하여 수행할 수 있습니다. 기본적으로 JProfiler는 docker 실행 파일의 경로를 자동으로 감지합니다. 또는 일반 설정 대화 상자의 "외부 도구" 탭에서 이를 구성할 수 있습니다.

컨테이너를 선택한 후에는 Docker 컨테이너 내에서 실행 중인 모든 JVM이 표시됩니다. JVM을 선택하면 JProfiler는 Docker 명령을 사용하여 선택한 컨테이너에 프로파일링 에이전트를 자동으로 설치하고, JVM을 프로파일링할 준비를 하고, 프로파일링 프로토콜을 외부로 터널링합니다.

원격 Docker 설치의 경우, SSH 원격 attach 기능을 사용한 다음 원격 머신에서 Docker 컨테이너를 선택할 수 있습니다. 로그인 사용자가 docker 그룹에 속하지 않은 경우, 위에서 설명한 대로 먼저 사용자를 전환할 수 있습니다.

원격 attach 대화 상자의 컨테이너 선택 하이퍼링크를 사용하여 실행 중인 Docker 컨테이너를 선택하고 그 안에서 실행 중인 모든 JVM을 표시할 수 있습니다.

Kubernetes 클러스터에서 실행 중인 JVM에 attach

Kubernetes 클러스터에서 실행 중인 JVM을 프로파일링하기 위해 JProfiler는 kubectl 명령줄 도구를 사용하여 포드 및 컨테이너를 검색하고, 컨테이너에 연결하여 JVM을 나열하고, 선택한 JVM에 연결합니다.

kubectl 명령줄 도구는 로컬 컴퓨터에 있거나 SSH 액세스 권한이 있는 원격 머신에 있을 수 있습니다. JProfiler는 두 시나리오를 직접 지원합니다. 로컬 설치의 경우, JProfiler는 kubectl의 경로를 자동으로 감지하려고 하지만, 일반 설정 대화 상자의 "외부 도구" 탭에서 명시적인 경로를 구성할 수 있습니다.

JProfiler는 세 레벨의 트리로 감지된 모든 컨테이너를 나열합니다. 최상위에는 네임스페이스 노드가 있으며, 감지된 포드를 포함하는 자식 노드가 있습니다. 리프 노드는 컨테이너 자체이며, 실행 중인 JVM을 선택하려면 이 중 하나를 선택해야 합니다.

kubectl은 Kubernetes 클러스터에 연결할 수 있도록 인증을 위한 추가 명령줄 옵션이 필요할 수 있습니다. 이러한 옵션은 컨테이너 선택 대화 상자의 상단에 입력할 수 있습니다. 이러한 옵션은 민감한 정보일 수 있으므로, 재시작 시 이를 기억하도록 선택한 경우에만 디스크에 저장됩니다. 이 체크박스를 선택 해제하면 이전에 저장된 정보가 즉시 지워집니다.

실행 중인 JVM의 표시 이름 설정

JVM 선택 테이블에서 표시되는 프로세스 이름은 프로파일링된 JVM의 메인 클래스와 해당 인수입니다. exe4j 또는 install4j에 의해 생성된 런처의 경우 실행 파일 이름이 표시됩니다.

예를 들어 동일한 메인 클래스를 가진 여러 프로세스가 있어 구분할 수 없는 경우, 표시 이름을 직접 설정하려면 -Djprofiler.displayName=[name] VM 매개변수를 설정할 수 있습니다. 이름에 공백이 포함된 경우, 단일 인용부호를 사용하십시오: -Djprofiler.displayName='My name with spaces' 및 필요한 경우 전체 VM 매개변수를 큰따옴표로 묶으십시오. -Djprofiler.displayName 외에도 JProfiler는 -Dvisualvm.display.name을 인식합니다.