Technical Note/JAVA

목적 : 우리는 특정 서비스의 성능을 측정할 때 JVM의 상태를 체크 해야 한다. JVM을 모니터링 하는 방법으로 여러가지 Tool을 이용하는 방법이 있다.
하지만, 이러한 Tool에서 제공하지 않는 좀더 복잡한 JVM의 상태를 모니터링 해야 하는 필요성이 있다.
이때, 우리는 쉽게 모니터링 할 수있는 방법이 없으며, JVM을 직접 접근하여 내부를 분석해야 한다.
이를 위한 기술을 정리할 것이다.

대상자 : JVM을 모니터링 및 Troubleshooting을 하는 사람 대상, 설명의 깊이는 가이딩을 할수있는 단계까지
    

발표 순서
JVM에 대해서 --> JVM에 접근하는 방법 중 우리가 쉽게 접근해 왔던 방법들 --> 이 들이 사용하는 기술들 나열 --> 이들이 제공하지 못하는 기능들 --> 이를 위해서 직접

JVMTI에 접근해야 하는 Needs --> JVMTI에 대한 자세한 설명 --> JVMTI를 가지고 JVM 모니터링 하는 방법 예제를 통해 설명 -->


우리가 이러한 리서치를 하는 이유
- 많은 소프트웨어는 Memory Leak이 발생하는 문제점을 가지고 있다
- 어떻게 메모리 Leak이 발생하고 있는지를 찾아야 하는데...
- 효과적으로 진단하는 방법에 대해서 일단 알아야 하겠지??

Table Of Contents
1. JVM의 Monitoring의 필요성
   목적 : Needs 정리

2. JVM 내부 구조
   목적 : 무엇을 모니터링 해야 하는가?

3. JVM Monitoring 방법 및 한계점
   목적 : 쉽게 접근하기 쉬운 방법들을 정리함으로써   

  3.1 여러가지 공개 Tools
     Jstack, Jconsole, Yourkit Java Profiler 등등
     목적: 공개 Tool 들이 가지는 장점 및 기능을 소개함으로써 상황에 따라 적합한 Tool을 사용할 수 있도록 하기 위해
  3.2 JMX : 모니터링 및 관리 API
     목적: JVM을 모니터링하는 방법을 소개함으로써, JMX를 기반으로 확장 가능하도록 기반 기술 익히기 위해 
  3.3 한계점
     목적 : 공개 Tool 또는 JMX의 한계점을 알고 있으면, JVMTI를 통해 직접 성능 분석 도구를 만들어야 할 상황을 쉽게 인지할 수 있음 

4. JVMTI란
  목적 : 어떤 경우에 JVMTI 기술을 사용하는가?
  4.1 아키텍쳐
  4.2 사용 방법








java 5 이상에서 제공
-javaagent:[=]
load Java programming language agent, see java.lang.instrument
: JVMTI가 자바로 구현된 agent를 활성화 한다는 의미
: JavaAgent는 BCI 기술


JavaAgent와 JVMTI가 모두 java 5 에서 지원됨
JavaAgent와 JVMTI는 몇가지 특징을 공유

Sun이 Java 5에서 JVMTI와 JavaAgent를 제공하면서 의도한 것은 이 두가지 방법을 상호 보완적으로 사용하라는 것이다.
즉, JVM 자체를 프로파일링하는 것은 여전히 JVMTI와 같은 C 언어 레벨의 API를 사용하되,
BCI를 통해 특정 클래스의 액션을 프로파일링하는 것은 JavaAgent와 같은 Java 언어 레벨의 API를 사용하기를 권고한다/
여기서 JMX의 Platform MBean 기능까지 추가되디었으니, 이제 Java는 성능 관리에 있어 그 어느때보다 폭 넓은 기능을 제공하는 셈

- JMX의 Platform mxBean은 성능 문제를 분석하는 또 다른 표준으로 제공
- Platform MXBean을 이용하면 JVMPI/JVMTI등의 C Interface를 통해서만 얻을 수 있었던 유용한 정보들을 매우 쉽게 얻을 수 있다.
- 하지만 성능 문제를 본격적으로 분석하기에는 부족한 면이 많으며, 앞으로 API 개선을 통해 실질적인 성능 정보를 제공해 줄 것을 기대한다.
- JMX API를 이용하여 자신만의 성능 분석 Tool을 만들어 낼 수 있다.

JVMTI = JVMDI(JVM Debugging Interface) + JVMPI(JVM Profiling Interface)

memory tracking of the JVMTI

- Eclipse TPTP(Test and Performance Tools Project) JVMTI(JVM Tool Interface) 프로파일링 에이전트 기능에 대한 관련 배경지식 제공

- JVMTI 인터페이스
   실행 분석 agent :  각 메소드에 소요된 시간, 메소드 호출 수 및 전체 호출 그래프와 같은 실행 통계를 수집하는데 사용된다
   힙 분석 agent : 메모리 사용량 통계를 생성하는데 사용된다. 메모리 활성 크기 및 활성 인스턴스와 같은 오브젝트 할당 세부 사항을 수집한다
   스레드 분석 agent : java 애플리케이션에 의해 파싱된 스레드에 대한 세부 사항을 얻는데 사용된다.