자바 코드 최적화 - 만 료 된 대상 참조 제거

2917 단어
많은 사람들 이 이런 문 제 를 생각 하고 있 을 것 이다. 자바 에 쓰레기 회수 체제 가 있 는데 아직도 메모리 유출 이 있 습 니까?정 답 은 긍정 적 이다. 쓰레기 수 거 GC 는 메모리 수 거 를 자동 으로 관리 하고 프로그래머 가 매번 수 동 으로 메모 리 를 풀 필요 가 없다. 그러나 대량의 임시 대상 이 사용 하지 않 아 도 인용 을 취소 하지 않 으 면 대량의 메모 리 를 삼 켜 메모리 가 넘 칠 것 이다.
자바 의 쓰레기 회수 메커니즘
자바 의 대상 은 더미 에서 분 배 됩 니 다. 대상 의 생 성 은 2 가지 방식 이 있 습 니 다: new 또는 반사.대상 의 수 거 는 쓰레기 수집 기 를 통 해 JVM 의 쓰레기 수집 기 는 프로그래머 의 작업 을 간소화 하 였 으 나 JVM 의 작업 을 가중 시 켰 다. 이것 은 자바 프로그램의 운행 이 약간 느 린 원인 중 하나 이다. 왜냐하면 GC 는 대상 을 정확하게 방출 하기 위해 모든 대상 의 운행 상 태 를 감시 해 야 하기 때문이다. 대상 의 신청, 인용, 인용, 할당 등 을 포함 하여 GC 는 모두 감 시 를 해 야 하기 때문이다.감시 대상 의 상 태 는 대상 을 더욱 정확 하고 신속하게 석방 하기 위 한 것 이 고 대상 을 석방 하 는 근본 적 인 원칙 은 이 대상 이 더 이상 인용 되 지 않 는 다 는 것 이다.
3. 자바 의 메모리 유출
메모리 유출 대상 은 다음 과 같은 두 가지 특징 이 있 습 니 다.
① 이런 대상 은 도달 할 수 있다. 즉, 그림 에 통로 가 존재 하면 연결 할 수 있다.② 이 대상 들 은 쓸모 가 없다. 즉, 프로그램 이 다 시 는 이 대상 을 사용 하지 않 는 다 는 것 이다.
public class Stack {  
    private final static int MAX_ATTRIBUTE = 10;  
    private Object[] arr;  
    private int index = 0; 
    public void push(Object obj) {  
        if (index > 9)  
            throw new IllegalArgumentException();  
        arr[index] = obj;  
        index++;  
    }  
    public Stack() {  
        arr = new Object[MAX_ATTRIBUTE];  
    }  
    public Object pop() {  
        if (index < 0)  
            throw new IllegalArgumentException();  
        return arr[--index];  
    }  
}  

이 프로그램 에서 메모리 유출 이 발생 했 습 니까?스 택 이 먼저 늘 어 나 고 줄 어 들 면 스 택 에서 튀 어 나 온 대상 은 쓰레기 로 회수 되 지 않 습 니 다. 스 택 을 사용 하 는 프로그램 이 이 대상 을 더 이상 인용 하지 않 더 라 도 회수 되 지 않 습 니 다. 스 택 내부 에서 이 대상 에 대한 만 료 참조 가 유지 되 기 때 문 입 니 다.
public Object pop() {    
    if (size == 0)    
        throw new EmptyStackException();    
    Object result = elements[--size];    
    elements[size] = null; //Eliminate obsolete reference       
    return result;    
}    

해결 방법: 하나의 요소 가 스 택 에서 꺼 지면 인용 을 비 워 두 면 GC 는 회수 합 니 다.즉, 배열 요소 가 비 활동 적 인 부분의 일부분 이 되면 이 배열 요 소 를 손 으로 비 우 는 것 이다.
유사 한 문제 에 시 달리 지 마라
프로그래머 가 이런 문제 에 처음 시 달 렸 을 때 그들 은 지나치게 조심 하 는 경우 가 많다.모든 대상 의 인용 에 대해 서 는 더 이상 사용 하지 않 으 면 비 워 두 는 것 은 불필요 하 다. 그러면 오히려 코드 를 혼 란 스 럽 게 할 수 있다.삭제 대상 의 인용 은 규범 적 인 행위 가 아니 라 예외 여야 한다.만 료 된 인용 을 없 애 는 가장 좋 은 방법 은 이 인용 을 포함 하 는 변 수 를 수명 주 기 를 끝 내 는 것 이다.가장 치밀 한 역할 영역 범위 내 에서 모든 변 수 를 정의 한다 면 이런 상황 은 자 연 스 럽 게 발생 할 것 이다.일반적으로 클래스 가 스스로 메모 리 를 관리 하 는 것 이 라면 메모리 누 출 문 제 를 경계해 야 한다.요소 가 풀 리 면 이 요소 에 포 함 된 모든 대상 참조 가 비 워 져 야 합 니 다.
4. 흔히 볼 수 있 는 메모리 유출
① 캐 시.대상 을 캐 시 에 인용 하면 잊 혀 지기 쉬 워 서 더 이상 사용 하지 않 고 오 랜 시간 동안 캐 시 에 남아 있 습 니 다.② 자바 프로그램 에서 우 리 는 모니터 와 자주 접촉 해 야 한다. 보통 addXXXListener () 와 같은 방법 으로 모니터 를 추가 하지만 이 모니터 를 삭제 하 는 것 을 잊 어 버 려 메모리 누 출 기 회 를 증가 시킨다.③ 연결 풀 을 사용 할 때 연결 을 명시 적 으로 닫 는 것 외 에 Resultset 과 Statement 대상 을 명시 적 으로 닫 아야 합 니 다.그렇지 않 으 면 대량의 대상 이 방출 되 지 못 해 메모리 유출 을 일 으 킬 수 있다.④ 정적 변 수 를 최대한 적 게 사용 합 니 다. 정적 변 수 는 영구적 인 세대 에 저장 되 기 때문에 영구적 으로 쓰레기 회수 에 참여 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기