1. Java Instrumentation API 소개
- Java Instrumentation API는 JVM에서 실행 중인 Java 코드를 감시하고 조작할 수 있는 메커니즘을 제공합니다.
- JDK 1.5에서 처음 도입되었으며, 이후 버전에서 지속적으로 개선되었습니다.
- 이 API의 핵심 가치는 원본 소스 코드를 수정하지 않고도 프로그램의 동작을 관찰, 수정, 확장할 수 있다는 점입니다.
- 애플리케이션 성능 모니터링(APM), 프로파일링, 커버리지 분석, 보안 검사 등 다양한 툴이 이 API를 기반으로 구축됩니다.
1.1 Instrumentation의 원리
- Instrumentation은 바이트코드 수준에서 작동하며, 클래스가 로드될 때 또는 이미 로드된 클래스를 재정의하여 동작을 변경합니다.
- 일반적으로 특정 메서드의 시작과 끝에 추가 코드를 삽입하여 실행 시간, 메모리 사용량, 예외 발생 등을 측정합니다.
- 이 과정은 애플리케이션의 실행 코드 흐름에 영향을 주지만, 원본 소스 코드는 변경되지 않습니다.
- 런타임에 이루어지는 이러한 "코드 주입" 방식이 "코드 침투 없는 계측"을 가능하게 합니다.
2. Java Agent의 개념과 유형
- Java Agent는 Instrumentation API를 사용하여 클래스를 변환하는 특수한 Java 프로그램입니다.
- Java Agent는 애플리케이션의 메인 메서드가 실행되기 전(premain) 또는 실행 중(agentmain)에 로드될 수 있습니다.
- JAR 파일 형태로 패키징되며, 특수한 매니페스트 속성을 포함합니다.
2.1 정적 에이전트(Static Agent)