kok202
자바 성능 튜닝 이야기 - 01

2020. 4. 22. 02:16[공부] 독서/자바 성능 튜닝 이야기

안드로이드의 DalvikVM

안드로이드는 오라클, IBM 이 개발한 JVM 을 사용하지 않고 Dalvik VM 을 사용한다.

즉 가상 머신이 다르기 때문에 Dalvik VM 의 특징을 이해해야한다.

물리적인 RAM 이 부족할 경우 디스크를 메모리 처럼 사용할 수 있는 SWAP 을 제공하지 않는다.

 

 

 

구글에서 말하는 안드로이드의 성능 개선

  • 필요없는 객체 생성을 피하라
  • 인스턴스 변수를 접근할 일이 없으면 Static 메소드를 사용하라.
  • 인스턴스 변수를 접근할 일이 생기면 getter/setter 를 사용하여 접근하지마라
  • 상수는 static final 로 지정하면 접근 속도가 빨라진다.
  • For-each 문을 써라. 단 ArrayList 는 전통적인 for 문이 더 빠르다.
  • Private inner 클래스의 private 접근은 피하라.
  • 소수점 연산을 피하라.
  • API 에서 제공하는 클래스와 메서드가 더 빠를 수도 있다.
  • NDK 사용을 조심하라. NDK 는 JIT 의 컴파일 최적화를 거치지 못하고 아키텍처에 따라 컴파일을 별도로 진행해야할 수도 있다.

 

 

 

JMX 의 레벨

  • 인스트루먼트 레벨 : Means 에서 필요한 리소스들의 정보를 취합하여 에이전트로 전달한다.
  • 에이전트 레벨 : 리소스를 관리하는 역할. 모니터링이 되는 서버와 같은 장비에 위치한다.
  • 분산 서비스 레벨 : 에이전트에서 정보를 관리할 수 있는 화면을 담당한다.
  • 추가 가능한 관리용 프로토콜 API 레벨

 

 

 

JMX 의 MBeans

MBean : Management Bean, 플랫폼 혹은 사용자가 만들 수 있는 모니터링용 객체.

MBean 은 에이전트 서비스를 통해 MBean 서버에 데이터를 전달한다.

MBean 서버를 통해서 서버를 모니터링 할 수 있다.

  • 표준 MBean : 변경이 많지 않은 시스템을 관리하기 위한 MBean
  • 동적 MBean : 어플리케이션이 자주 변경되는 시스템을 관리하기 위한 MBean
  • 모델 MBean : 동적으로 설치 가능한 MBean 이 필요한 경우 사용하는 MBean
  • 오픈 MBean : 실행중 발견되는 객체 정보를 확인하기 위한 MBean

 

 

 

VisualVM

JMX 모니터링을 위해 기본적으로 자바는 JConsole, VisualVM 을 제공한다.

JConsole 은 옛날 툴, VisualVM 은 최근 툴이라고 보면 된다.

 

 

 

로그 포맷

LogFormat "%h %l %u %t \"%r\" %>s %b" common

실제 로그 샘플

127.0.0.1 - - [22/Oct/20XX:14:04:43 +0900] “GET /a.gif HTTP/1.1” 200 2326

 

위와 같은 설정의 포맷은 표준 포맷으로 어떤 웹서버를 사용하더라도 동일하다.

단 위와 같은 표준 포맷은 성능 데이터 정보가 없다. 성능 데이터를 추가 하고 싶다면 %D, %T 옵션을 넣을 수 있다.

  • %h : 클라이언트 IP
  • %l : 사용자 인식 데몬이 클라이언트에서 동작하고 있을 경우 출력
  • %u : HTTP 인증을 통해 확인된 문서를 요청한 사용자 ID 표시, 암호화 되지 않은 페이지는 보통  - 으로 표시된다.
  • %t : 서버의 요청을 마친 시간.
  • \”%r\” :Request 정보
  • %>s : Response 상태 코드
  • %b : Response 데이터 크기
  • %D : 요청 처리 시간 (마이크로초 단위)
  • %T : 요청 처리 시간 (초 단위)

 

 

 

성능을 위한 고려 대상

  • 하드웨어 장비 : CPU, 네트워크, 디스크, 메모리
  • 서버 OS : OS 커널, OS 설정, 실행중인 프로세스
  • 자바 App : 스레드풀 설정, Connection 풀 설정, 캐시 설정, GC 설정, Heap 크기 설정
  • 웹서버 : 프로세스 개수 설정, Connector 설정, 개발 모듈의 버그
  • 네트워크 : 네트워크 종류 , 사용자의 위치, L4, Switch 장비, 방화벽 등…
  • 클라이언트 : 클라이언트의 장비, 클라이언트의 OS, 클라이언트에서 실행중인 프로세스들

 

 

 

기타 성능을 위해 개발자가 알아야할 사항

  • 조회를 주로하는 어플리케이션에서는 자동 커밋 모드를 사용하라.
  • ResultSet.last()를 사용하느니 차라리 쿼리를 두번 호출하라.
  • 64 비트 기반의 시스템을 사용하는데 JVM 옵션으로 -d64 옵션을 주지 않는다면 32비트로 시스템이 운영된다.
  • JSP Precompile 옵션을 지정하여 응답속도를 높여라
  • 스레드풀은 DB 커넥션 풀 보다 반드시 많이 할당되어야 한다.
  • 세션 타임 아웃 시간을 할당하라.
  • 웹로그는 반드시 남겨라
  • GC 를 튜닝하여 어떤 형태로 발생하는지 확인하려면 verbosegc 옵션을 사용하여 로그를 남겨라

 

 

 

스레드 코어 덤프가 발생하는 경우

한꺼번에 너무 많은 양의 데이터를 처리하는 경우 (ex. 10,000건 이상의 조회)

메모리 릭이 있을 수도 있다. 이 경우 힙 덤프를 받아 메모리 사용량 추이를 확인하라.

 

 

 

책의 내용을 참고하여 자세히 정리중

JIT 컴파일러 : https://kok202.tistory.com/314

JVM 의 구동원리 : 

Garbage collection :