누구도 평범한 사람은 없다

Java Turning 본문

카테고리 없음

Java Turning

Hue Kim 2012. 5. 21. 11:00

[자바 java] 자바 java - 자바 튜닝

 

이번 포트팅은 자바(java) 튜닝에 대해 알아보도록 하겠습니다.

 

★ java - 자바 기반 애플리케이션의 구성 계층에서 튜닝의 한계를 결정짓는 요소

 ☞ 사용자 인터페이스

 사용자 수, 사용시간

 ☞ 자바 애플리케이션

 자바 애플리케이션 호출 빈도, 애플리케이션 리소스 사용범위

 ☞ 자바 가상머신

 자바 가상머신 힘 메모리

 ☞ 애플리케이션 서버

 애플리케이션 서버 리소스, DB소스, 웹 서버 리스스, 등

 ☞ 운영체제

 운영체제 성능 및 리소스

 ☞ 하드웨어 플랫폼

 cpu, 메모리, 디스크, 네트워크, 등

 

★ java - JDK 컴파일러 최적화(기본적으로 적용되는 최적화 방법) ★

* 계산 결과를 삽입하여 컴파일 함으로써 실행중에 계산을 안해도 되도록 리터럴 제거

ex)

 int test = 100*100 // 컴파일 전 소스 코드

 int test = 10000    // 컴파일 후 최적화가 적용된 구문

 

* 스트링과 리터럴의 연산결과를 미리 적용해서 컴파일

ex)

String test = “\”+100000; // 컴파일 전 소스코드

String test = “\100000”;

 

* fonal로 정의된 기초 데이터 타입의 상수 변수가 다른 곳에서도 참조되면 그 상수의 값으로 치환되어 컴파일 되도록 상수 변수를 인라인한다.

 

* 컴파일 시점에서 if문의 결과가 판별이 가능할 경우 해당 조건의 블록은 제거된다.

 

 java - 실행시간 측정 ★

전체 실행시간, 특정 메소드 실행시간, 특정 블록의 실행시간의 측정을 위해 코드의 시작과 끝에 다름의 메소드를 이용

long start = System.currentTimeMillis();

long end = System.currentTimeMillis() – start;

 

★ java - Xrunhprof 옵션 ★

JDK에서 메소그 호출 분석

 java –Xrunhprof:file=출력 결과 파일명, cpu=sample, thread=y<클래스명>

 

★ java - verbosegc 옵션 ★

가비지 컬렉션 측정, 메모리 사용량 측정

객체가 메모리에서 제거된 시간과 그 결과로 생겨난 메모리 크기를 출력

 

★ java - 메모리 사용 분석 ★

* java.lang.Runtime 클래스의 freeMemory() - 할당된 메모리 중 남아있는 메모리양으로 가비지 컬렉션이 일어나거나 추가적인 메모리 할당이 될 경우 증가하고, 객체가 생성되거나 메모리를 반환하면 줄어듬

 

* java.lang.Runtime  클래스의 totalMemory() - 자바 가상머신 프로세서가 프로세서에 할당된 메모리양으로 할당된 메모리가 소진되면 가비지 컬렉션이 일어나고 그래도 부족하면 더 메모리를 요청함

 

★ java - 0 옵션 ★

private, static, final로 선언된 메소드의 인라인에 의한 성능 향상이 일어 

 

★ java - Xml 실행옵션 ★

동적으로 할당되는 오브젝트와 배열에 대해 자바 인터프리터에서 사용할 최대 힘 크기를 지정하는 옵션

 

* static 변수 연산이 instance 변수 연산보다 빠름

* 타입의 크기가 작어서 작음 변수의 처리가 더 빠름

* loop 밖에서 변수를 선언하는 것이 두배 이상 빠름

* 배열의 길이를 매번 체크하지 않고 looping하는 것이 더 빠름

* static 메소드 처리가 instance 메소드 처리보다 더 빠름 

* 동기화된 메소드보다 비동기화된 메소드가 더 빠름

* 동기화된 메소드가 동기화된 블록보다 더 빠름

* Shift 연산이 곱하기 또는 나누기 보다 더 빠름

* += or *=등의 줄여 쓴 연산자 보다 풀어 쓴 연산자가 더 빠름

* 클래스 캐스팅은 일반 연산자보다 느림

* 객체생성은 일반 연산의 10배 이상 시간이 걸림

* 예외 처리에는 매우 많은 시간이 걸림

* 데이터를 입ㆍ출력할 경우 비퍼를 사용해서 많은 양의 데이터를 내부 버퍼에 저장해서 사용하면 더눅 성능을 올릴 수 있음

* 객체 생성시 인스턴스 변수의 중복 초기화를 피함

* 객체 생성시 static 메소드를 사용하여 new를 통한 생성자 호출을 줄여 객체 생성을 줄임

* 객체 생성시 반복문 내부나 자주 호출되는 메소드에서의 임시 객체를 피함

* 객체 생성시 객체를 재사용하면 객체를 매번 초기화 하지 않아도 되므로 성능향상을 기대할 수 있음(Object Pooling을 통해서 효율적인 객체의 재사용)

* 객체 사용시 스트링 연산이 필요한 경우 String 대신 StringBuffer를 사용

* 캐스팅을 하면 컴파일 시간에 그 타입이 결정될 수 없기 때문에 실행 시간을 느리게 만듬. 특히 인터페이스를 케스팅 할 경우 더욱 오랜 실행 시간이 필요함

* 객체를 여러 번 캐스팅 할 필요가 있을 경우 지역 변수에 저장해서 사용하며, 되도록이면 캐스팅을 피해서 빠른 변수 타입을 사용하는 것이 더 좋음

* 빠르게 보이는 것도 튜닝

* loop에서의 인덱스는 로컬 int를 사용하는 것이 좋음

* 캐스팅을 하면 컴파일 시간에 그 타입이 결정될 수 없기 때문에 여러 번 캐스팅을 할 필요가 있는 경우 빠른 변수 타입의 지역 변수에 저장해서 사용하는 것이 좋음

 

Comments