일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 머신런닝
- 다이어트
- 문자열반대로
- startup
- 자바
- 서스펜스
- 문자열반전
- MariaDB
- MacOS
- 페이징 모듈
- co-founder
- 문자열붙이기
- API Server
- 제이쿼리 페이징
- paging
- 제이쿼리
- 자바입문서
- 습관의재발견
- 지앤선
- sizzle
- workbench
- 스타트업
- 기초자바
- 트레이닝
- jquery
- DB Tool
- 헬스
- Toad
- selector
- 스크럼
- Today
- Total
누구도 평범한 사람은 없다
Java Turning 본문
[자바 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를 사용하는 것이 좋음
* 캐스팅을 하면 컴파일 시간에 그 타입이 결정될 수 없기 때문에 여러 번 캐스팅을 할 필요가 있는 경우 빠른 변수 타입의 지역 변수에 저장해서 사용하는 것이 좋음