자바 의 네 가지 인용 유형 을 약술 하 다.
JDK 1.2 버 전부터 대상 의 인용 을 네 가지 단계 로 나 누 어 프로그램 이 대상 의 생명 주 기 를 더욱 유연 하 게 제어 할 수 있 도록 한다.이 네 가지 단 계 는 높 은 것 에서 낮은 것 으로 나 뉜 다.강 한 인용,부 드 러 운 인용,약 한 인용 과 허 인용 이다.다음은 이 네 가지 인용 을 소개 한다.
억지로 인용 하 다
강 한 인용 은 가장 자주 사용 되 는 인용 형식 입 니 다.다음 과 같이 new Object()는 Object 대상 을 만 들 고 더미 에 저장 합 니 다.변수 object 는 이 대상 에 대한 강 한 인용 을 저장 합 니 다.
Object object = new Object();
강 한 인용 은 쓰레기 로 회수 되 지 않 기 때문에 이 대상 을 회수 하려 면 이 대상 을 가리 키 는 변 수 를 null 로 표시 해 야 합 니 다.그러면 이 대상 은 강 한 인용 에서 무 인용 으로 바 뀌 어야 합 니 다.예시:
public class ReferenceDemo {
public static void main(String[] args) throws IOException {
//
ReferenceDemo referenceDemo = new ReferenceDemo();
// ,
referenceDemo = null;
//
System.gc();
// ,
System.in.read();
}
//
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("-----finalize-----");
}
}
소프트 인용소프트 인용 은 SoftReference 를 사용 하여 만 든 것 으로 메모리 공간 이 충분 한 경우 소프트 인용 은 회수 되 지 않 으 며,메모리 공간 이 부족 한 가상 컴퓨터 가 OutOfmory Error 를 던 지기 전에 소프트 인용 은 회수 된다.
예시:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
// ReferenceDemo
SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());
//
System.gc();
// ,
Thread.sleep(5000);
//softReference.get() , , null
System.out.println(softReference.get());
// 25M
byte[] bytes = new byte[1024 * 1024 * 25];
// , ,
Thread.sleep(5000);
//
System.out.println(softReference.get());
}
}
/*
* :
* com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
* null
*/
메모:예제 가 실행 되 기 전에 메모리 크기 를 30m(-Xmx30m-Xms30m)로 설정 해 야 합 니 다.용도:소프트 인용 은 메모리 공간 에 민감 한 캐 시 에 사용 할 수 있 습 니 다.캐 시 대상 은 메모리 공간 이 부족 해서 회수 할 때 까지 계속 저장 합 니 다.
약 인용
약 한 인용 은 Weak Reference 를 사용 하여 만 든 것 으로 쓰레기 회수 스 레 드 실행 과정 에서 약 한 인용 을 찾 으 면 메모리 공간 이 충분 하 든 약 한 인용 대상 은 회수 된다.쓰레기 회수 스 레 드 는 우선 순위 가 낮은 스 레 드 이기 때문에 약 한 인용 만 있 는 대상 을 빨리 발견 할 수 있 는 것 은 아니다.
예시:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
// ReferenceDemo
WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());
//weakReference.get() , , null
System.out.println(weakReference.get());
//
System.gc();
// ,
Thread.sleep(3000);
//
System.out.println(weakReference.get());
}
}
/*
* :
* com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
* null
*/
용도:약 한 인용 도 캐 시 에 사용 할 수 있 으 며,Weak HashMap 류 를 참고 할 수 있 습 니 다.거짓 인용
가상 인용 은 Phantom Reference 를 사용 하여 만 든 것 이기 때문에 인용 유형 중 가장 약 합 니 다.가상 인용 대상 은 인용 되 지 않 은 대상 과 같 으 며,언제든지 쓰레기 로 회수 할 수 있 으 며,가상 인용 은 인용 대기 열 과 함께 사용 해 야 합 니 다.
쓰레기 수 거 스 레 드 가 가상 인용 대상 을 회수 할 때 쓰레기 수 거 후 이 대상 을 없 애고 Phantom Reference 를 인용 대기 열 에 추가 합 니 다.
예시:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
//
ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
// ReferenceDemo
PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);
//phantomReference.get() null
System.out.println("phantomReference.get():" + phantomReference.get());
// , Reference , , null
System.out.println("referenceQueue.poll():" + referenceQueue.poll());
//
System.gc();
// ,
Thread.sleep(3000);
System.out.println("------ ------");
System.out.println("phantomReference.get():" + phantomReference.get());
System.out.println("referenceQueue.poll():" + referenceQueue.poll());
}
}
/*
* :
* phantomReference.get():null
* referenceQueue.poll():null
* ------ ------
* phantomReference.get():null
* referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
*/
용도:가상 인용 은 대상 이 메모리 에서 언제 삭제 되 는 지 정확하게 검사 하 는 데 사용 할 수 있 으 며,인용 대기 열 을 검사 하여 대상 이 회수 되 었 는 지 여 부 를 판단 할 수 있 습 니 다.이상 은 자바 의 네 가지 인용 유형 에 대한 상세 한 내용 을 요약 하 는 것 입 니 다.자바 인용 유형 에 관 한 자 료 는 다른 관련 글 에 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.