책과 영화,음악이야기/책

[책] 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기

버리야 2008. 4. 17. 13:42
반응형


이번으로 세번째 Blog2Book 시리즈를 읽었습니다.

이번 책은 자바 초보 프로그래머인 저에게 유용한 정보가 많이 있었습니다. 이 책은 코드 짜긴 짜는데 우선은 급급한 처지에 있는(저같은..) 프로그래머에게 한숨 돌릴 수 있도록(?) 자신의 코드를 점검해 보라는 취지에서 읽기에 좋은 것 같습니다. 엄청!나게 새로운 지식이 있는건 아니지만 아차하고 그냥 넘어갈 수 있을 수 있는 부분이여서 저에겐 ~ +_+

아직은 튜닝보다는 코딩습관을 어떻게 들여야 할까에 대해 더 관심이 있는 저로서는, 튜닝에 대한 툴소개가 많지않을까~ 생각되었는데 의외로 개발하면 서 자세히 모르고 마냥 코딩을 하다보면 얼마나 서버에게 미안한 일(?)이 많아질 지 경고해 주고 있는 부분이 많아서 뜨끔하며 읽게 되었습니다.

앞부분은 코딩 습관에 대해서 뒷 부분은 튜닝, 모니터링등에 관한 글로 이루어져 있습니다.

간단하게 살짝의 Tip과 기억해야할 것을 정리해 둡니다. 자세한 건 책을 역시 보시는게 좋겠죠.

1. toString()과 equlas() override하자


Value Object라고 불리는 객체(흔히 setter/getter를 가지고 데이터 전송을 하기 위한 객체)는 toString()메소드를  구현하지 않으면 VO객체에 toString() 메소드를 수행하면 com.buri.ValueObject@c12345 같이 알 수 없는 값을 리턴하는데 Junit에서 테스트하면서 값 비교를 할 때나 데이터를 확인 할 일이 있을때 쓰면 유용하게 쓸 수 있다.

public class ValueObject {
    private String name;

   public void setName(String name){
       this.name = name;
   }
   
   public String getName(){
       return name;
   }

   
@Override
   public String toString() {
       StringBuilder sb = new StringBuilder();
       sb.append("name = ").append(name);
       return sb.toString();
    }
}

이렇게 직접 구현해도 되고, Jakarta Commons Lang 라이브러리를 이용해서

public String toString() {
        return
ToStringBuilder.reflectionToString(this);
}

equals메소드도  
public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(this, obj);
}
 

2. APM툴과 프로파일링 툴

프로파일링 툴(프로파일러) : 시스템 문제 분석 툴

요즘은 많이 사용하는 JenniferSoft의 Jennifer나 CA Wily의 Introscope, Veritas의 I3, Compuware의 Vantage Analyzer와 같은 APM(Application Performance Monitoring 혹은 Management)툴도 있는데 이 툴은 운영용 서버를 진단 및 모니터링하기 위한 툴이다.

APM툴은 운영 환경용 툴, 프로파일링 툴은 개발자용

자바 기반의 애플리케이션을 분석하는 프로파일링 툴

상용: 컴퓨웨어의 DevPartner for Java와 퀘스트 소프트웨어의 JProbe가 있다.

비상용 : 넷빈즈의 프로파일러, 이클립스의 TPTPEclipse Test & Performance Tools Platform

이클립스의 TPTPEclipse Test & Performance Tools Platform

TPTP 참고

http://www6.software.ibm.com/developerworks/education/os-ecl-tptp/index.html : ibm id 있어야 함
http://www.eclipse.org/tptp/platform/index.php
http://www.ibm.com/developerworks/kr/library/tutorial/os-ecl-tptp/section3.html

eclipse의 TPTP 툴의 범위는 굉장히 넓어서 프로파일링에 대한 내용만 공부하려 해도 방대하다고 한다. 그래도 한번 써보면 좋을 것 같다(우선 있다는걸 알아두고!)


3. 시간 관련 메소드

static native long currentTimeMillis(); 현재의 시간을 ms로 리턴(1/1,000초)
UTC라는 시간 표준 체계를 따르는데 1970년 1월 1일부터 시간을 long타입으로 리턴


static native long nanoTime(); 현재의 시간을 ns로 리턴한다.(1/1,000,000,000초) - JDK 5.0부터 추가nanoTime() 메소드를 만든 목적은 수행된 시간 측정이기 때문에 오늘의 날짜를 알아내는 부분에는 사용하면 안된다.

JDK 5.0 이상이라면 시간 측정용으로 만들어진 nanoTime()메소드를 사용하는게 좋을 것 같다.
툴을 사용하지 않을 것이라면, 자신만의 StopWatch 클래스를 만들어 측정하는것도 좋다.


4. String, StringBuffer, StringBuilder

String 클래스는 더할 경우 새로운 객체를 생성한다. JDK 5.0 이상부터는 자동으로 StringBuilder 클래스로 변환해 주긴하지만, 반복 루프를 사용해서 문자열을 더할때에는 객체를 계속 추가한다는 사실에는 변함이 없다.
가급적이면 String클래스를 쓰는 대신, 스레드와 관련이 있으면 StringBuffer를, 스레드 안전 여부와 상관이 없으면 StringBuilder를 쓰는 것이 좋다.


5. static 제대로 한번 써보자

static 초기화 블록은 클래스 어느곳에나 지정할 수 있는데 클래스가 최초 로딩될 때 수행되므로 생성자 실행과 상관없이 수행된다.

static의 특징은 다른 JVM에서는 static이라고 선언해도 다른 주소나 다른 값을 참조하지만, 같은 JVM이나 같은 WAS 인스턴스에서는 같은 주소와 같은 값을 참조.

GC의 대상도 되지 않는다. static을 잘만 사용하면 성능을 뛰어나게 향상시킬 수 있지만, 잘못 사용하면 예기치 못한 결과를 초래하게 된다.

객체를 다시 생성한다고 해도 그 값은 초기화되지 않고 해당 클래스를 사용하는 모든 객체에서 공유하게 된다.

자주 사용하고 절대 변하지 않는 변수는 final static으로 선언하자

설정 파일 정도보 static으로 관리하자.

코드성 데이터는 DB에서 한번만 읽자.


6. 오바해서 reflection 관련 클래스는 쓰지말자.

public String checkClass(Object src){

if(src.getClass().getName().equals("java.math.BigDecimal")){}

}

해당 객체의 클래스 이름을 알아 내기 위해 getClass().getName()을 사용하였지만 이것은


public String checkClass(Object src){

if(src instanceof java.math.BigDecimal){}

}

instanceof를 사용하는 것이 클래스 이름으로 해당 객체의 타입을 비교하는 방법보다 낫다.


클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장된다는 사실을 기억

만약 Class 클래스를 사용하여 엄청나게 많은 클래스를 동적으로 생성하는 일이 벌어지면 Perm 영역이 더 이상 사용할 수 없게 되어 OutOfMemoryError가 발생할 수 있으니 조심해서 사용


7.  동기화를 위해 자바에서 제공하는 것들

스레드 관련한 클래스, 메소드 기법으로 JDK 5.0에서 추가된 java.util.concurrent 패키지의 네가지 주요 개념

  1. Lock : 실행 중인 스레드를 간단한 방법으로 정지시켰다가 실행시키도록한다. 데드락을 피할 수 있다.
  2. Executors : 스레드를 더 효율적으로 관리할 수 있는 클래스들을 제공. 스레드 풀도 제공.
  3. Concurrent 콜렉션
  4. Atomic 변수 : 동기화가 되어 있는 변수를 제공. 이 변수를 사용하면 synchronized 식별자를 메소드에 지정할 필요없이 사용가능

더 자세히 : http://java.sun.com/docs/books/tutorial/essential/concurrency/highlevel.html


8. NIO에서 IO를 위한 새로 도입된 개념

  • 버퍼의 도입
  • 채널의 도입
  • 문자열의 엔코더와 디코더 제공
  • Perl 스타일의 정규 표현식에 기초한 패턴 매칭 방법 제공
  • 파일을 잠그거나 메모리 매핑이 가능한 파일 인터페이스 제공
  • 서버를 위한 복합적인 Non-blocking IO 제공

더 자세히 : http://java.sun.com/developer/technicalArticles/releases/nio/




반응형