자바 프로 그래 밍 효율 향상 주의사항

최근 의 기계 메모리 가 또 꽉 찼 습 니 다.새로 추 가 된 기계 메모리 외 에 도 우리 의 코드 를 잘 검토 해 야 합 니 다.많은 코드 들 이 너무 임의로 작 성 했 습 니 다.이런 나 쁜 습관 이나 프로그램 언어 에 대한 모 르 는 것 은 잘 눌 러 야 합 니 다.
다음은 네트워크 자원 을 참고 하고 자바 프로 그래 밍 에서 가능 한 한 해 낸 부분 을 정리 합 니 다.
1.가능 한 한 적당 한 장소 에서 단 례 를 사용한다
단일 사례 를 사용 하면 로드 의 부담 을 줄 이 고 로드 의 시간 을 단축 시 키 며 로드 의 효율 을 높 일 수 있 지만 모든 곳 이 단일 사례 에 적용 되 는 것 은 아니다.쉽게 말 하면 단일 사례 는 다음 과 같은 세 가지 측면 에 적용 된다.
첫째,자원 의 사용 을 제어 하고 스 레 드 동기 화 를 통 해 자원 의 동시 방문 을 제어 한다.
둘째,사례 의 발생 을 통제 하여 자원 을 절약 하 는 목적 을 달성 하도록 한다.
셋째,데이터 공 유 를 제어 하고 직접적인 관련 이 없 는 조건 에서 여러 개의 관련 이 없 는 프로 세 스 나 스 레 드 간 에 통신 을 실현 하도록 한다.
2.정적 변 수 를 임의로 사용 하지 않도록 한다.
대상 이 stataic 변수 로 정의 되면 gc 는 이 대상 이 차지 하 는 메모 리 를 회수 하지 않 는 다 는 것 을 알 아야 합 니 다.예 를 들 어
 
public class A



{



  static B b = new B();



}


  
이 때 정적 변수 b 의 수명 주 기 는 A 류 와 동기 화 되 며,A 류 가 마 운 트 해제 되 지 않 으 면 b 대상 은 프로그램 이 종 료 될 때 까지 메모리 에 상주 합 니 다.
3.자바 대상 을 너무 많이 만 들 지 않도록 합 니 다.
자주 호출 되 는 방법,순환 중 new 대상 을 피 합 니 다.시스템 은 대상 을 만 드 는 데 시간 이 걸 릴 뿐만 아니 라 이 대상 들 에 대해 쓰레기 회수 와 처 리 를 하 는 데 도 시간 이 걸 리 기 때 문 입 니 다.우리 가 통제 할 수 있 는 범위 내 에서 가장...
대상 을 최대한 재 활용 하고 기본 적 인 데이터 형식 이나 배열 로 대체 하 는 것 이 좋다.
4.final 장식 부적 사용
final 수정자 가 있 는 종 류 는 파생 할 수 없다.자바 핵심 API 에는 자바.lang.string 과 같은 final 을 사용 하 는 예 가 많 습 니 다.String 클래스 에 final 을 지정 하여 사용자 가 length()를 덮어 쓰 는 것 을 방지 합 니 다.또 하나의 클래스 가 final 이 라면 모든 방법 이 final 이다.자바 컴 파일 러 는 인 라인(inline)의 모든 final 방법 을 찾 을 수 있 습 니 다.이 는 성능 을 평균 50%높 일 수 있다.
5.부분 변 수 를 최대한 사용
호출 방법 을 사용 할 때 전달 하 는 매개 변수 와 호출 에서 만 든 임시 변 수 는 스 택(Stack)에 저장 되 어 속도 가 빠 릅 니 다.정적 변수,인 스 턴 스 변수 등 다른 변 수 는 모두 더미(Heap)에서 만 들 고 속도 가 느 립 니 다.
6.포장 유형 과 기본 유형 두 가지 사용 장 소 를 최대한 잘 처리한다.     
포장 유형 과 기본 유형 은 사용 과정 에서 서로 전환 할 수 있 지만 이들 이 발생 하 는 메모리 구역 은 완전히 다 릅 니 다.기본 유형의 데이터 생 성과 처 리 는 모두 스 택 에서 처리 되 고 포장 유형 은 대상 이 며 더미 에서 인 스 턴 스 를 생 성 합 니 다.
집합 류 대상 에 있어 대상 에 게 필요 한 처 리 는 포장 유형 에 적용 되 고 다른 처 리 는 기본 유형 을 사용 하 는 것 을 제창한다.
7.synchronized 를 사용 하여 synchronize 를 최대한 줄 이 는 방법
동기 화 를 실현 하 는 데 는 많은 시스템 비용 을 대가 로 하고 심지어 잠 금 을 초래 할 수 있 기 때문에 불필요 한 동기 화 통 제 를 최대한 피해 야 한 다 는 것 을 잘 알 고 있다.synchronize 방법 이 호출 될 때 현재 대상 을 잠 그 고 방법 이 실행 되 기 전에 다른 스 레 드 는 현재 대상 의 다른 방법 을 호출 할 수 없습니다.따라서 synchronize 의 방법 은 가능 한 한 적 고 코드 블록 대신 동기 화 하 는 방법 을 사용 해 야 합 니 다.
8.StringBuilder 와 StringBuffer 를 사용 하여 문자열 연결
이것 은 더 이상 말 하지 않 겠 습 니 다.문자열 버퍼,반드시 파악 해 야 합 니 다.
9.finalize 방법 을 사용 하지 않 는 것 이 좋다.
실제로 자원 청 소 를 finalize 방법 에 넣 어 완성 하 는 것 은 매우 좋 지 않 은 선택 이다.GC 의 작업량 이 많 기 때문에 특히 Young 세대 메모 리 를 회수 할 때 응용 프로그램 이 중단 되 기 때문에 finalize 방법 으로 자원 청 소 를 하 는 것 을 선택 하면 GC 의 부담 이 더욱 크 고 프로그램 운행 효율 이 더욱 떨어진다.
10.대상 대신 기본 데이터 형식 사용
String str = "hello";
위의 방식 은'hello'문자열 을 만 들 고 JVM 의 문자 캐 시 풀 은 이 문자열 을 캐 시 합 니 다.
String str = new String("hello");
이 때 프로그램 은 문자열 을 만 드 는 것 외 에 str 가 인용 한 String 대상 의 밑 에 char[]배열 도 포함 되 어 있 습 니 다.이 char[]배열 은 h,e,l,l,o 를 순서대로 저장 합 니 다.
11.단일 스 레 드 는 가능 한 한 HashMap,ArrayList 를 사용 해 야 한다.
HashTable,Vector 등 은 동기 화 메커니즘 을 사용 해 성능 을 떨 어 뜨 렸 다.
12.가능 한 한 합 리 적 으로 HashMap 만 들 기
비교적 큰 hashMap 을 만 들 려 면 다른 구조 함 수 를 충분히 이용 하 십시오.
public HashMap(int initialCapacity, float loadFactor)
HashMap 에서 여러 번 hash 재 구성 을 하지 않도록 합 니 다.용량 을 늘 리 는 것 은 성능 을 소모 하 는 일 입 니 다.기본 적 으로 initial Capacity 는 16 에 불과 합 니 다.loadFactor 는 0.75 입 니 다.얼마나 큰 용량 이 필요 한 지 정확하게 평가 하 는 것 이 좋 습 니 다.똑 같은 Hashtable,Vectors 도 마찬가지 입 니 다.
13.변수 에 대한 중복 계산 을 최소 화        
...와 같다
for(int i=0;i마 땅 히
for(int i=0,len=list.size();i또한 순환 에서 복잡 한 표현 식 을 사용 하 는 것 을 피해 야 합 니 다.순환 에서 순환 조건 은 반복 적 으로 계 산 됩 니 다.복잡 한 표현 식 을 사용 하지 않 고 순환 조건 값 을 변 하지 않 으 면 프로그램 이 더 빨리 실 행 됩 니 다.
14.불필요 한 생 성 을 피한다.
...와 같다
A a = new A();
if(i==1){list.add(a);}
마 땅 히
if(i==1){
A a = new A();
list.add(a);}
15.finally 블록 에서 자원 방출
프로그램 에서 사용 되 는 자원 은 자원 유출 을 피하 기 위해 방출 되 어야 한다.이것 은 finally 블록 에서 하 는 것 이 가장 좋다.프로그램 이 실 행 된 결과 가 어떻든 간 에 finally 블록 은 자원 의 정확 한 폐쇄 를 확보 하기 위해 실 행 될 것 입 니 다.
16.'a/b'대신 자 리 를 옮 기 는 것 을 사용 합 니 다.
"/"는 대가 가 매우 높 은 조작 으로 자 리 를 옮 기 는 조작 을 사용 하면 더욱 빠 르 고 효과 적 입 니 다.
...와 같다
int num = a / 4;
int num = a / 8;
마 땅 히
int num = a >> 2;
int num = a >> 3;
그러나 주의해 야 할 것 은 위치 이동 을 사용 할 때 주석 을 추가 해 야 한 다 는 것 이다.위치 이동 작업 이 직관 적 이지 않 고 이해 하기 어렵 기 때문이다.          
17.'a*b'대신 자 리 를 옮 기 는 동작 을 사용 합 니 다.
마찬가지 로'*'작업 에 있어 서 자 리 를 옮 기 는 작업 을 사용 하면 더욱 빠 르 고 효과 적 입 니 다.
...와 같다
int num = a * 4;
int num = a * 8;
마 땅 히
int num = a << 2;
int num = a << 3;
18.StringBuffer 의 용 기 를 최대한 확인한다.
StringBuffer 의 구조 기 는 기본 크기(보통 16)의 문자 배열 을 만 듭 니 다.사용 중 이 크기 를 초과 하면 메모 리 를 다시 할당 하고 더 큰 배열 을 만 들 고 원래 의 배열 을 복사 한 다음 오래된 배열 을 버 립 니 다.대부분의 경우 StringBuffer 를 만 들 때 크기 를 지정 하면 용량 이 부족 할 때 자동 으로 증가 하지 않 고 성능 을 향상 시 킬 수 있 습 니 다.
예:StringBuffer buffer=new StringBuffer(1000); 
19.쓸모없는 대상 의 인용 을 되도록 빨리 방출 한다.
대부분의 경우 방법 부분 인용 변수 가 인용 하 는 대상 은 방법 이 끝나 면 쓰레기 가 되 기 때문에 대부분의 경우 프로그램 은 부분 적,인용 변 수 를 null 로 설정 하지 않 아 도 됩 니 다.
예 를 들 면:
Public void test(){
Object obj = new Object();
……
//실행 시간 소모,메모리 소모 작업;시간 소모,메모리 소모 방법
}
위의 이것 은 필요 없습니다.방법 test()의 실행 이 완료 되면 서 프로그램 에서 obj 참조 변수의 역할 영역 이 끝 납 니 다.하지만 다음 으로 바 뀌 었 다 면:
Public void test(){
Object obj = new Object();
……
Obj=null;
……
}
이 럴 때 는 obj 대 가 를 null 로 할당 할 필요 가 있 으 며,Object 대상 에 대한 인용 을 가능 한 한 빨리 풀 수 있 습 니 다.
20.2 차원 배열 을 사용 하 는 것 을 피한다.
2 차원 데이터 가 차지 하 는 메모리 공간 은 1 차원 배열 보다 10 배 이상 많다.
21.split 사용 을 최대한 피한다.
필요 하지 않 으 면 split 를 피해 야 합 니 다.split 는 정규 표현 식 을 지원 하기 때문에 효율 이 낮 습 니 다.잦 은 수 십,수백 만 의 호출 은 많은 자원 을 소모 합 니 다.split 를 자주 호출 해 야 한다 면 apache 의 StringUtils.split(string,char)를 사용 하여 잦 은 split 의 캐 시 결 과 를 고려 할 수 있 습 니 다.
22.ArrayList & LinkedList
하 나 는 선형 표 이 고 하 나 는 링크 입 니 다.한 마디 로 무 작위 조 회 는 Array List 를 사용 합 니 다.Array List 는 LinkedList 보다 좋 고 LinkedList 는 지침 을 이동 해 야 합 니 다.삭 제 된 조작 LinkedList 는 Array List 보다 좋 으 며 Array List 는 데 이 터 를 이동 해 야 합 니 다.그러나 이것 은 이론 적 분석 입 니 다.사실은 그렇지 않 습 니 다.중요 한 것 은 2 자의 데이터 구 조 를 잘 이해 하고 증상 에 따라 약 을 쓰 는 것 입 니 다.
23.배열 을 반복 해서 복사 하 는 대신 System.arraycopy()를 사용 하 십시오.
System.array copy()는 순환 을 통 해 배열 을 복사 하 는 것 보다 훨씬 빠르다.
24.자주 사용 하 는 대상 캐 시
가능 한 한 자주 사용 하 는 대상 을 캐 시 할 수 있 습 니 다.배열 이나 HashMap 용 기 를 사용 하여 캐 시 를 할 수 있 습 니 다.그러나 이런 방식 으로 시스템 이 너무 많은 캐 시 를 차지 하고 성능 이 떨 어 질 수 있 습 니 다.EhCache,Oscache 등 제3자 의 오픈 소스 도 구 를 사용 하 는 것 을 추천 합 니 다.그들 은 기본적으로 FIFO/FLU 등 캐 시 알고리즘 을 실 현 했 습 니 다.
25.매우 큰 메모리 분 배 를 피한다.
때때로 문 제 는 당시 의 퇴적 상태 가 아니 라 분배 실패 로 인 한 것 이다.분 배 된 메모리 블록 은 모두 연속 적 이 어야 하 는데,쌓 이면 서 비교적 큰 연속 블록 을 찾 는 것 이 점점 어려워 진다.
26.이상 사용 조심
이상 을 만 들 때 스 택 추적(stack track)을 수집 해 야 합 니 다.이 스 택 추적 은 이상 이 어디서 만 들 어 졌 는 지 설명 하 는 데 사 용 됩 니 다.이 스 택 추적 을 구축 할 때 스 택 을 실행 하기 위해 스냅 샷 을 만들어 야 합 니 다.바로 이 부분 이 비용 이 많이 듭 니 다.Exception 을 만 들 필요 가 있 을 때 JVM 은 움 직 이지 마 세 요.현재 모습 에 스냅 샷 을 저장 하고 싶 어서 스 택 에 들 어가 거나 스 택 에서 나 오 는 작업 을 잠시 중단 합 니 다.스 택 추적 은 실행 중인 스 택 의 한두 가지 요소 만 포함 하 는 것 이 아니 라 이 스 택 의 모든 요 소 를 포함 합 니 다.
Exception 을 만 들 려 면 대 가 를 치 러 야 합 니 다.다행히 캡 처 비용 이 많 지 않 기 때문에 try-catch 를 사용 하여 핵심 내용 을 포장 할 수 있 습 니 다.기술적 으로 당신 은 큰 대 가 를 치 르 지 않 고 마음대로 이상 을 던 질 수도 있 습 니 다.성능 손실 을 초래 하 는 것 은 throw 작업 이 아 닙 니 다.미리 이상 을 만 들 지 않 았 음 에 도 불구 하고 이상 을 던 지 는 것 은 예 사 롭 지 않 습 니 다.정말 대 가 를 치 러 야 할 것 은 이상 을 만 드 는 것 이다.다행히 좋 은 프로 그래 밍 습관 은 우리 에 게 무작정 이상 을 던 져 서 는 안 된다 는 것 을 가르쳐 주 었 다.이상 은 이상 한 상황 을 위해 설 계 된 것 이 므 로 사용 할 때 도 이 원칙 을 명심 해 야 한다.

좋은 웹페이지 즐겨찾기