Java의 네 가지 참조 유형 상세 설명

5426 단어 Java네 가지 참조
Java 네 가지 참조 유형
대상의 강, 연약, 약과 허인용
JDK 1.2 이전 버전에서 객체가 변수에 의해 참조되지 않으면 프로그램에서 이 객체를 다시 사용할 수 없습니다.즉, 대상이 닿을 수 있는 (reachable) 상태에 있어야 프로그램이 사용할 수 있다.JDK 1.2 버전부터 객체의 참조를 4가지 레벨로 나누어 프로그램이 객체의 라이프 사이클을 더욱 유연하게 제어할 수 있도록 합니다.이 네 가지 등급은 높음에서 낮음으로 강인용, 연인용, 약인용, 허인용 순으로 나뉜다. 
Υ강참조(StrongReference)
강제 인용은 가장 보편적인 인용을 사용하는 것이다.만약 대상이 강한 인용을 가지고 있다면, 쓰레기 수거기는 절대로 그것을 회수하지 않을 것이다.메모리 공간이 부족하면 자바 가상 컴퓨터는 Out Of Memory Error 오류를 내서 프로그램을 이상하게 종료할지언정 강력한 인용 대상을 임의로 회수해서 메모리 부족 문제를 해결하지 않습니다.ps: 강인용은 사실 우리가 평소에 A a = new A () 라는 뜻이다.
⑵ 소프트 참조(SoftReference)
만약 대상이 소프트 인용만 가지고 있다면 메모리 공간이 충분하고 쓰레기 회수기는 그것을 회수하지 않을 것이다.메모리 공간이 부족하면 이 대상의 메모리를 회수합니다.쓰레기 수거기가 그것을 회수하지 않으면 그 대상은 프로그램에 의해 사용될 수 있다.소프트 참조는 메모리에 민감한 캐시를 실현하는 데 사용할 수 있습니다.
소프트 참조는 참조 대기열(ReferenceQueue)과 함께 사용할 수 있습니다. 소프트 참조가 인용된 대상이 쓰레기 수거기에서 회수되면 Java 가상 머신이 이 소프트 참조를 관련 참조 대기열에 추가합니다.
⑶ 약한 참조(WeakReference)
약한 인용과 부드러운 인용의 차이는 약한 인용만 있는 대상은 더욱 짧은 생명 주기를 가진다는 데 있다.쓰레기 수거기가 관할하는 메모리 구역을 스캔하는 과정에서 약한 인용만 있는 대상을 발견하면 현재 메모리 공간이 충분하든 그렇지 않든 메모리를 회수합니다.그러나 쓰레기 수거기는 우선순위가 낮은 라인이기 때문에 약한 인용만 있는 대상을 빨리 발견할 수 있는 것은 아니다.
약한 인용은 인용 대기열(ReferenceQueue)과 연합하여 사용할 수 있으며, 약한 인용이 인용된 대상이 쓰레기로 회수되면 자바 가상 머신이 이 약한 인용을 관련된 인용 대기열에 추가합니다.
참조(PhantomReference)
'허인용'은 말 그대로 허설과 같아서 다른 몇 가지 인용과 달리 허인용은 대상의 생명 주기를 결정하지 않는다.만약 대상이 허위 인용만 가지고 있다면, 그것은 어떠한 인용도 없는 것과 마찬가지로, 언제든지 쓰레기 수거기에 회수될 수 있다.
허위 인용은 주로 대상이 쓰레기 수거기에 회수되는 활동을 추적하는 데 쓰인다.인용과 소프트 인용, 약한 인용의 차이점은 인용은 인용 대기열(ReferenceQueue)과 함께 사용해야 한다는 것이다.쓰레기 수거기가 대상을 회수하려고 준비할 때, 그 대상에 대한 인용이 있는 것을 발견하면, 대상의 메모리를 회수하기 전에 이 인용을 관련 인용 대기열에 추가합니다.

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue); 
프로그램은 인용 대기열에 허위 인용이 들어갔는지 판단함으로써 인용된 대상이 쓰레기로 회수될지 여부를 알 수 있다.만약 프로그램이 인용 대기열에 허위 인용이 추가된 것을 발견한다면, 인용된 대상의 메모리가 회수되기 전에 필요한 행동을 취할 수 있습니다.
소프트 참조를 사용하여 민감한 데이터의 캐시 구축
1 소프트 참조가 필요한 이유
우선, 우리는 직원 정보 조회 시스템의 실례를 본다.우리는 자바 언어로 이루어진 직원 정보 조회 시스템을 사용하여 디스크 파일이나 데이터베이스에 저장된 직원 인사 파일 정보를 조회할 것이다.사용자로서, 우리는 몇 분, 심지어 몇 초 전에 보았던 직원 파일 정보를 뒤돌아보아야 할 가능성이 충분히 있다. (마찬가지로 우리는 웹 페이지를 조회할 때도'후퇴'단추를 자주 사용한다.)이때 우리는 보통 두 가지 프로그램 실현 방식이 있다. 하나는 과거에 보았던 직원 정보를 메모리에 저장하는 것이다. 모든 직원 파일 정보를 저장한 자바 대상의 생명주기가 전체 응용 프로그램의 시종을 관통한다.다른 하나는 사용자가 다른 직원의 파일 정보를 보기 시작할 때 현재 보고 있는 직원의 파일 정보를 저장한 자바 대상을 인용을 끝내고 쓰레기 수집 라인은 자신이 차지하는 메모리 공간을 회수할 수 있으며 사용자가 다시 직원의 파일 정보를 조회해야 할 때 직원의 정보를 재구성할 수 있다.첫 번째 실현 방법은 대량의 메모리 낭비를 초래할 것이 분명하다. 두 번째 실현의 결함은 쓰레기 수집 라인이 쓰레기 수집을 하지 않아도 직원들의 파일 정보를 포함하는 대상이 메모리에 잘 저장되고 응용 프로그램도 대상을 다시 구축해야 한다는 것이다.디스크 파일 액세스, 네트워크 자원 액세스, 데이터베이스 조회 등 작업은 응용 프로그램의 실행 성능에 영향을 주는 중요한 요소로 회수되지 않은 자바 대상의 인용을 다시 얻을 수 있다면 불필요한 접근을 줄이고 프로그램의 운행 속도를 크게 높일 수 있다는 것을 우리는 알고 있다.
2 소프트 참조를 사용하는 경우
SoftReference의 특징은 자바 대상에 대한 소프트 인용을 실례로 저장하는 것이다. 이 소프트 인용의 존재는 쓰레기 수집 라인이 자바 대상에 대한 회수에 방해가 되지 않는다.즉, SoftReference가 자바 대상에 대한 소프트 참조를 저장한 후, 스팸 라인이 이 자바 대상을 회수하기 전에, SoftReference 클래스가 제공하는 get () 방법은 자바 대상에 대한 강한 참조를 되돌려줍니다.또한 쓰레기 라인이 이 자바 대상을 회수하면 get () 방법은null로 되돌아옵니다.
다음 코드를 참조하십시오.

MyObject aRef = new
MyObject();

SoftReference aSoftRef=new SoftReference(aRef); 
이때 이 My Object 대상에 대해 두 개의 인용 경로가 있는데 하나는 Soft Reference 대상에서 나온 소프트 인용이고 하나는 변수 aReference에서 나온 강한 인용이기 때문에 이 My Object 대상은 강력한 대상이다.
즉, 우리는 이 MyObject 실례에 대한 aReference의 강력한 인용을 끝낼 수 있다.

aRef = null;
이후 이 My Object 객체는 소프트 객체가 됩니다.만약 쓰레기 수집 라인이 메모리 쓰레기 수집을 진행한다면, Soft Reference가 이 대상에 대한 인용이 있기 때문에 이 대상을 시종 보존하지 않습니다.자바 가상 기기의 쓰레기 수집 라인은 소프트 및 대상과 다른 일반 자바 대상을 구별했다. 소프트 및 대상의 정리는 쓰레기 수집 라인이 특정한 알고리즘에 따라 메모리 수요에 따라 결정된다.즉, 쓰레기 수집 라인은 가상 컴퓨터가 Out Of Memory Error를 던지기 전에 소프트 메모리와 대상을 회수하고 가상 기회는 가능한 한 오랫동안 방치되어 있지 않은 소프트 메모리와 대상을 우선적으로 회수하며 방금 구축되었거나 방금 사용된'새'소프트 리셋 대상은 가상 컴퓨터에 가능한 한 보존된다.이러한 객체를 회수하기 전에 다음을 수행할 수 있습니다.

MyObject anotherRef=(MyObject)aSoftRef.get(); 
이 실례에 대한 강한 인용을 다시 얻다.회수한 후에 get () 방법을 사용하면 null만 얻을 수 있습니다.
3 ReferenceQueue를 사용하여 소프트 참조 객체를 잃은 SoftReference 지우기
Java 객체로서 SoftReference 객체는 소프트 참조를 저장하는 특수성 외에도 Java 객체의 일반성을 가집니다.따라서 소프트웨어와 대상이 회수된 후에 이 Soft Reference 대상의 get () 방법은null로 되돌아오지만 이 Soft Reference 대상은 더 이상 존재할 가치가 없기 때문에 대량의 Soft Reference 대상이 가져오는 메모리 유출을 피하기 위해 적당한 제거 메커니즘이 필요하다.자바에 있어요.lang.ref 패키지에는 ReferenceQueue도 제공됩니다.SoftReference 객체를 작성할 때 다음과 같이 ReferenceQueue 객체를 매개변수로 SoftReference에 제공하는 구성 방법을 사용합니다.

ReferenceQueue queue = new
ReferenceQueue();

SoftReference
ref=new
SoftReference(aMyObject, queue); 

그러면 이 Soft Reference가 부드럽게 인용한 aMy Ohject가 쓰레기 수집기에 회수되는 동시에 ref가 강제로 인용한 Soft Reference 대상은 Reference Queue에 포함됩니다.즉, ReferenceQueue에 저장된 객체는 Reference 객체이며 소프트 참조된 객체를 잃은 Reference 객체입니다.또한 ReferenceQueue라는 이름에서도 알 수 있듯이 이것은 하나의 대기열입니다. 폴() 방법을 호출할 때, 이 대기열에 빈 대기열이 아니라면, 대기열 앞에 있는 Reference 대상을 되돌려줍니다.
언제든지 ReferenceQueue의 poll () 방법을 호출하여 관심 있는 비강제적이고 대상이 회수되었는지 확인할 수 있습니다.대기열이 비어 있으면 null을 되돌려줍니다. 그렇지 않으면 대기열의 앞에 있는 Reference 대상을 되돌려줍니다.이 방법을 이용하면 어떤 Soft Reference가 부드럽게 인용한 대상이 회수되었는지 확인할 수 있습니다.따라서 소프트 참조된 객체를 잃은 Soft Reference 객체를 지울 수 있습니다.일반적인 방식은 다음과 같습니다.

SoftReference ref = null;

 
while ((ref = (EmployeeRef) q.poll()) != null) {

 

//  ref

 
}

읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기