자바 대상 인용 방식 - 강 인용, 소프트 인용, 약 인용 과 허 인용

5796 단어
자바 에서 메모리 회 수 를 담당 하 는 것 은 JVM 이다.JVM 을 통 해 메모 리 를 회수 합 니 다. 우 리 는 C 음성 개발 처럼 메모리 사용 에 신경 을 쓸 필요 가 없습니다. 그러나 메모리 에 신경 을 쓰 지 않 을 때 메모리 회수 에 있어 유연 하지 못 한 문제 가 발생 할 수 있 습 니 다.메모리 조작 이 원활 하지 않 은 문 제 를 해결 하기 위해 서 우 리 는 자바 의 인용 방식 을 이해 함으로써 이 문 제 를 해결 할 수 있다.
JDK 1.2 이전 버 전에 서 대상 이 변수 에 인용 되 지 않 으 면 프로그램 이 이 대상 을 다시 사용 할 수 없습니다.대상 이 닿 을 수 있 는 상태 에 있어 야만 프로그램 이 사용 할 수 있다 는 것 이다.일상생활 에서 상점 에서 어떤 물건 을 구입 한 후 유용 하 다 면 계속 보관 하고 그렇지 않 으 면 쓰레기통 에 버 리 고 청소부 가 치 우 는 것 과 같다.물건 이 쓰레기통 에 버 려 졌 다 면 다시 주 워 서 사용 하려 면 불가능 하 다.그러나 어떤 때 는 상황 이 이렇게 간단 하지 않다. 어떤 물건 들 은 지금 은 이미 쓸모 가 없다. 그것 을 보류 하면 공간 을 차지 할 수 있 지만 당장 버 리 는 것 도 수지 가 맞지 않 는 다. 왜냐하면 앞으로 도 도움 이 될 수 있 기 때문이다.이런 있 으 나 마 나 한 물품 에 대해 절충 적 인 처리 방법 은 집안 의 공간 이 충분 하 다 면 먼저 그것 을 집에 두 는 것 이다. 만약 에 집안 의 공간 이 부족 하 다 면 집안 의 모든 쓰레기 를 치 워 도 없어 서 는 안 될 생활 용품 을 수용 할 수 없다 면 이런 있 으 나 마 나 한 물품 을 버 리 는 것 이다.
JDK 1.2 버 전부터 대상 의 인용 을 네 가지 단계 로 나 누 어 프로그램 이 대상 의 생명 주 기 를 더욱 유연 하 게 제어 할 수 있 도록 한다.이 네 가지 단 계 는 높 은 것 에서 낮은 것 으로 강 한 인용, 부 드 러 운 인용, 약 한 인용 과 허 인용 이다.메모리 조작 이 원활 하지 않다 는 문 제 를 해결 하기 위해 서, 우 리 는 소프트 인용 을 사용 해 볼 수 있다.
1. 강 인용
우리 가 사용 하 는 대부분의 인용 은 강 한 인용 으로 가장 보편적 인 인용 이다.만약 한 대상 이 강 한 인용 을 가지 고 있다 면, 없어 서 는 안 될 생활 용품 과 유사 하 며, 쓰레기 수 거 기 는 결코 그것 을 회수 하지 않 을 것 이다.메모리 공간 이 부족 할 때 자바 가상 머 신 은 OutOfmory Error 오 류 를 던 져 서 프로그램 을 이상 하 게 종료 시 킬 지 언 정 강 한 인용 대상 을 임의로 회수 하여 메모리 부족 문 제 를 해결 하지 않 습 니 다.
2. 소프트 참조 (소프트 참조)
한 대상 이 부 드 러 운 인용 만 있다 면, 가 질 수 있 는 생활 용품 과 유사 하 다.메모리 공간 이 충분 하면 쓰레기 수 거 기 는 회수 하지 않 고 메모리 공간 이 부족 하면 대상 의 메모 리 를 회수 합 니 다.쓰레기 수 거 기 를 회수 하지 않 으 면 이 대상 은 프로그램 에서 사용 할 수 있다.소프트 인용 은 메모리 의 민감 한 캐 시 를 실현 하 는 데 사용 할 수 있다.소프트 인용 은 인용 대기 열 (Reference Queue) 과 공동으로 사용 할 수 있 으 며, 소프트 인용 대상 이 쓰레기 로 회수 되면 JAVA 가상 기 는 이 소프트 인용 을 관련 인용 대기 열 에 추가 합 니 다.
3. 약 인용 (Weak Reference) 한 대상 이 약 한 인용 만 가지 고 있다 면 가 물 적 인 생활 용품 과 유사 하 다.약 한 인용 과 부 드 러 운 인용 의 차 이 는 약 한 인용 대상 만 더 짧 은 생명 주 기 를 가 진 다 는 것 이다.쓰레기 회수 기 스 레 드 가 관할 하 는 메모리 영역 을 스 캔 하 는 과정 에서 약 한 인용 대상 만 발견 되면 현재 메모리 공간 이 충분 하 든 그렇지 않 든 메모 리 를 회수 합 니 다.그러나 쓰레기 수 거 기 는 우선 순위 가 낮은 스 레 드 이기 때문에 약 한 인용 만 있 는 대상 을 빨리 발견 할 수 있 는 것 은 아니다. 약 한 인용 은 인용 대기 열 (Reference Queue) 과 공동으로 사용 할 수 있 습 니 다. 약 한 인용 대상 이 쓰레기 로 회수 되면 자바 가상 기 는 이 약 한 인용 을 관련 인용 대기 열 에 추가 합 니 다.
4. 허 인용 (Phantom Reference) '허 인용' 은 말 그대로 허구 이 고 다른 몇 가지 인용 과 다 르 기 때문에 허 인용 은 대상 의 생명 주 기 를 결정 하지 않 는 다.만약 한 대상 이 허위 인용 만 가지 고 있다 면, 그것 은 아무런 인용 도 없 는 것 과 마찬가지 로 언제든지 쓰레기 로 회 수 될 수 있다.가상 인용 은 주로 대상 이 쓰레기 로 회수 되 는 활동 을 추적 하 는 데 쓰 인 다.가상 인용 과 소프트 인용 과 약 한 인용 의 차이 점 은 가상 인용 은 반드시 인용 대기 열 (Reference Queue) 과 공동으로 사용 해 야 한 다 는 것 이다.쓰레기 회수 기 가 대상 을 회수 하려 고 할 때, 만약 그것 이 아직 인용 되 어 있 는 것 을 발견 하면, 회수 대상 의 메모리 앞에서 이 인용 을 관련 인용 대기 열 에 추가 합 니 다.프로그램 은 인용 대기 열 에 가상 인용 이 추가 되 었 는 지 판단 함으로써 인 용 된 대상 이 쓰레기 로 회수 되 는 지 여 부 를 알 수 있다.프로그램 이 인용 대기 열 에 가상 인용 이 추 가 된 것 을 발견 하면 인용 대상 의 메모리 가 회수 되 기 전에 필요 한 행동 을 취 할 수 있 습 니 다.
특히 프로그램 설계 에 서 는 약 한 인용 과 허위 인용 을 거의 사용 하지 않 고 소프트 인용 을 사용 하 는 경우 가 많 습 니 다. 이 는 소프트 인용 이 JVM 의 스 팸 메모리 회수 속 도 를 가속 화하 고 시스템 운행 안전 을 유지 하 며 메모리 넘 침 (OutOf Memory) 등 문제 가 발생 하지 않도록 하기 때 문 입 니 다.
다음은 소프트 참조 코드 입 니 다.
import java.lang.ref.SoftReference;  
public class Test {  
      
    public static void main(String[] args){  
        System.out.println("  ");           
        A a = new A();            
        SoftReferencesr = new SoftReference(a);  
a = null;  
if(sr!=null){  
a = sr.get();  
}  
else{  
a = new A();  
sr = new SoftReference(a);  
}          
System. out. println ("끝");
}        
}  
class A{  
int[] a ;  
public A(){  
a = new int[100000000];  
}  
}

 
Tips: 저 는 현재 Android 분야 의 업무 에 종사 하고 있 기 때문에 Android 연구 개발 에서 약 한 인용 이나 부 드 러 운 인용 을 사용 할 수 있 는 부분 을 정리 하 겠 습 니 다.
1. Handler 로 인 한 메모리 유출 해결 - 약 한 인용 사용
내부 클래스 (익명 클래스 포함) 를 사용 하여 Handler 를 만 들 때 Handler 대상 은 외부 클래스 (보통 Activity) 의 인용 을 암시 적 으로 가지 고 있 습 니 다. 그렇지 않 으 면 어떻게 Handler 를 통 해 Activity 의 View 를 조작 할 수 있 습 니까?한편, Handler 는 보통 시간 이 걸 리 는 배경 스 레 드 (예 를 들 어 네트워크 에서 그림 을 끌 어 올 리 는 것) 와 함께 나타 납 니 다. 이 배경 스 레 드 는 작업 수행 이 끝 난 후에 메시지 체 제 를 통 해 Handler 에 게 알 린 다음 에 Handler 는 그림 을 인터페이스 로 업데이트 합 니 다.
그러나 사용자 가 네트워크 요청 과정 에서 Activity 를 닫 았 다 면 정상 적 인 상황 에서 Activity 가 더 이상 사용 되 지 않 으 면 GC 검사 때 수 거 될 수 있 습 니 다. 그러나 이때 스 레 드 가 완료 되 지 않 았 기 때문에 이 스 레 드 는 Handler 의 인용 을 가지 고 있 습 니 다 (그렇지 않 으 면 Handler 에 어떻게 메 시 지 를 보 냅 니까?). 이 Handler 는 Activity 의 인용 을 가지 고 있어 서 이 Activity 를 회수 할 수 없습니다.(즉 메모리 유출) 네트워크 요청 이 끝 날 때 까지 (예 를 들 어 사진 다운로드 완료).
2. 그림 불 러 올 때 발생 할 수 있 는 메모리 부족 문 제 를 해결 합 니 다. 소프트 참조 사용
소프트 인용 을 사용 하여 상대 적 으로 강 한 인용 을 사용 하면 이미지 로 딩 에 있어 성능 을 뚜렷하게 향상 시 키 고 붕괴 확률 을 줄 일 수 있 습 니 다. Lru 알고리즘 이 지정 한 LruCache 와 더욱 잘 관리 할 수 있 습 니 다. 이미지 사용 빈도 에 따라 메모 리 를 관리 하 는 알고리즘 이 증가 하여 더욱 합 리 적 이 고 인성 화 됩 니 다.
 
자바 쓰레기 수 거 메커니즘:
자바 의 쓰레기 수 거 기 는 3 가지 작업 을 수행 해 야 합 니 다. 메모 리 를 할당 하고 인 용 된 대상 의 메모리 가 잘못 회수 되 지 않도록 하 며 더 이상 인용 되 지 않 은 대상 의 메모리 공간 을 회수 해 야 합 니 다. 쓰레기 수 거 는 복잡 하고 시간 이 걸 리 는 작업 입 니 다. JVM 이 쓰레기 수 거 에 너무 많은 시간 을 투자 하면 응용 프로그램의 실행 성능 에 영향 을 줄 수 있 습 니 다.재 활용 작업 을 할 때 전체 애플 리 케 이 션 의 실행 이 일시 적 으로 중단 되 었 습 니 다 (stop - the - world)예. 사용자 와 상호작용 하 는 응용 프로그램 에 있어 서 쓰레기 회수 에 따 른 응용 정지 시간 간격 이 작 을 수록 좋 을 수 있 습 니 다. 이러한 경우 JVM 에 서 는 다양한 쓰레기 회수 방법 과 대응 하 는 성능 변조 파 라미 터 를 제공 하여 필요 에 따라 맞 춤 형 제작 을 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기