Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

[자바 성능 튜닝 이야기] 02. 내가 만든 프로그램의 속도를 알고 싶다 본문

개발 서적/자바 성능 튜닝 이야기

[자바 성능 튜닝 이야기] 02. 내가 만든 프로그램의 속도를 알고 싶다

csct3434 2024. 4. 28. 20:56

APM 툴 VS 프로파일링 툴

프로파일링 툴

  • 소스 레벨의 분석을 위한 툴
  • 애플리케이션의 세부 응답시간까지 분석 가능
  • 메모리 사용량을 객체, 클래스, 소스 라인 단위까지 분석 가능
  • 자바 기반의 클라이언트 프로그램 분석 가능
  • 개발자용 툴
  • 주로 느린 메서드 및 클래스를 찾는 것을 목적으로 사용

APM 툴

  • 애플리케이션의 장애 상황에 대한 모니터링 및 문제점 진단이 주 목적
  • 서버의 사용자 수나 리소스에 대한 모니터링 가능
  • 실시간 모니터링을 위한 툴
  • 자바 기반의 클라이언트 프로그램 분석 불가능
  • 운영 환경용 툴
  • 목적에 따라 용도가 상이 (어떤 APM 툴은 문제점 진단에 강한 반면, 다른 APM 툴은 시스템 모니터링 및 운영에 강함)

프로파일링 툴의 기능

응답 시간 프로파일링 기능

  • 하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정 (툴에 따라 소스 라인 단위로 측정 가능)
  • 보통 CPU 시간과 대기 시간을 제공

메모리 프로파일링

  • GC 대상 혹은 메모리 누수 현상이 발생하는 부분을 찾기 위함
  • 클래스 및 메서드 단위의 메모리 사용량을 분석 (툴에 따라 소스 라인 단위로 측정 가능)

System 클래스

  • System 클래스의 모든 메서드는 static 메서드
  • JVM에서 사용하는 설정 : Property(JVM에 설정된 값), Environment(시스템에 설정된 값)

실행 시간을 측정하는데 사용되는 메서드

  • static long currentTimeMillis()
  • static long nanoTime()
  • 클래스 로딩에 의한 지연, JIT Optimizer에 의한 성능 최적화 등의 이유로 초기의 값은 느리게 나올 수 있음

운영 환경에서 절대로 사용하면 안되는 메서드

  • static void gc() : 명시적으로 GC를 수행하는 메서드
  • static void exit(int status) : JVM을 중지시키는 메서드
  • static void runFinalization() : 참조 해제 작업을 기다리는 모든 객체의 finalize() 메서드를 수동으로 실행

성능 측정 라이브러리

  • JMH, Caliper, JUnitPerf, JUnitBench, ContiPerf 등
  • JUnitPerf, JUnitBench, ContiPerf는 JUnit으로 만든 테스트 코드를 실행하는데 사용됨
  • ContiPerf : 사용하기 매우 간편하고 그래프로 된 결도를 제공하지만, 응답 시간이 나노 단위로 제공되지 않음
  • JMH : OpenJDK에서 만든 성능 측정용 라이브러리, 관련 자료가 매우 적음

(JMH 사용 예시 작성 예정)