본문 바로가기

[자바성능튜닝이야기] 02, 03

02, 03

02. 내가 만든 프로그램의 속도를 알고 싶다.

시스템의 성능이 느릴 때 가장 먼저 해야 하는 작업은 병목 지점을 파악하는 것.

애플리케이션의 속도에 문제가 있을 때 분석하기 위한 툴로는 프로파일링 툴이나 APM 툴이 있다.

구분특징
프로파일링 툴 (개발자용 툴)* 소스 레벨의 분석을 위한 툴.
* 애플리케이션의 세부 응답 시간까지 분석할 수 있다.
* 메모리 사용량을 객체나 클래스, 소스의 라인 단위까지 분석할 수 있다.
* 가격이 APM 툴에 비해 저렴하다.
* 보통 사용자수 기반으로 가격이 정해진다.
* 자바 기반의 클라이언트 프로그램 분석을 할 수 있다.
APM (운영 환경용 툴)* 애플리케이션의 장애 상황에 대한 모니터링 및 문제점 진단이 주 목적.
* 서버의 사용자 수나 리소스에 대한 모니터링을 할 수 있다.
* 실시간 모니터링을 위한 툴이다.
* 가격이 프로파일링 툴에 비하여 비싸다.
* 보통 CPU 수를 기반으로 가격이 정해진다.
* 자바 기반의 클라이언트 프로그램 분석이 불가능하다.

프로파일링 툴

  • 응답 시간 프로파일링 기능 : 하나의 클래스 내에서 사용되는 메서드 단위의 응답 시간을 측정한다.
  • 메모리 프로파일링 기능 : 잠깐 사용하고 GC의 대상이 되는 부분을 찾거나, 메모리 부족 현상이 발생되는 부분을 찾기 위함.

System 클래스

자바의 JVM 에서 사용할 수 있는 설정은 크게 두 가지로 나뉜다.

  • 속성(Property) : JVM에서 지정된 값들
  • 환경(Environment) :장비(서버)에 지정되어 있는 값들

시간 관련 메서드들

  • currentTimeMillis() : 현재 시간을 ms로 리턴한다.
  • nanoTime() : 현재 시간을 ns로 리턴한다. (1/1,000,000,000초)

03 왜 자꾸 String을 쓰지 말라는거야

StringBuffer

  • 스레드에 안전하게(ThreadSafe) 설계되어 있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않음.

StrinbBuilder

  • StringBuilder는 단일 스레드에서의 안정성만을 보장함.

String aValue = "abcde";
String a = new String();
StringBuffer b = new StringBuffer();
StringBuilder c = new StringBuilder();
for (int loop = 0; loop < 10000; loop++) {
  a += aValue;
  b += aValue;
  c += aValue;
}

a += aValue -> 새로운 String 클래스의 객체가 만들어지고, 이전에 있던 a 객체는 필요 없는 쓰레기 값이 되어 GC의 대상이 된다.

이런 작업이 반복되면, 메모리를 많이 사용하게 되고, 응답속도에도 많은 영향을 미치게 된다.

b.append(aValue);

c.append(aValue); -> 새로운 객체를 생성하지 않고, 기존에 있는 객체의 크기를 증가시키면서 값을 더한다.

  • String : 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer : 스레드에 안전한 프로그램이 필요할 때나 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다. 만약 클래스에 static으로 선언한 문자열을 변경하거나, singleton으로 선언된 클래스(JVM에 객체가 하나만 생성되는 클래스)에 선언된 문자열일 경우에는 이 클래스를 사용해야 한다.
  • StringBuilder : 스레드에 안전한지의 여부와는 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다. 만약 메서드 내에 변수를 선언했다면, 해당 변수는 그 메서드 내에서만 살아있으므로, StringBuilder를 사용하면 된다.