>Java >java지도 시간 >Java 개발의 강력한 참조, 소프트 참조, 약한 참조 및 가상 참조

Java 개발의 강력한 참조, 소프트 참조, 약한 참조 및 가상 참조

无忌哥哥
无忌哥哥원래의
2018-07-23 10:05:431554검색

Java에는 GC 자동 재활용 메커니즘이 있으므로 참조 카운팅 메커니즘이 비교적 완벽합니다. Java는 객체가 보유한 참조를 강력한 참조, 약한 참조, 가상 참조로 나누어 참조를 잘 사용할 수 있도록 합니다. GC는 수명 주기를 초과한 인스턴스를 신속하게 재활용하여 머신의 메모리 사용량이 동적으로 낮은 수준이 되도록 합니다. 부적절한 사용으로 인해 머신의 메모리가 고갈되고 가동 중지 시간이 발생하게 됩니다. 프로그램의 특성은 적어도 현재 제어 가능하다고 간주되는 제어 가능한 상태로 유지되어야 합니다. 먼저 인용 분류를 이해한 다음 사용 시나리오를 살펴보겠습니다.

1. 강력한 참조

우리는 일반적으로 다음과 같은 강력한 참조를 사용합니다.

Map<String, Object> param = new HashMap<String, Object>(16);

위 형식의 참조는 참조가 유효한 수명 주기 내에 있는 한 강력한 참조입니다. 물론 참조 자체는 재활용될 수 없습니다. 강력한 참조의 사용 및 규칙은 자명합니다.

2. 소프트 참조

먼저 소프트 참조가 어떻게 사용되는지 살펴보겠습니다.

Map<String, Object> param = new HashMap<String, Object>(16);
param.put("status", 1);
SoftReference> softRef = new SoftReference>(param);
System.out.println(softRef.get().get("status"));

사용 방법이 한 가지 더 있지만 소프트 참조는 강력한 참조에 이어 두 번째입니다. 참조 강도는 가상에서만 사용됩니다. 머신이 메모리가 충분하지 않다고 판단하면 소프트 참조의 참조가 아직 수명 주기에 있더라도 소프트 참조가 가리키는 힙 공간이 여전히 강제로 회수됩니다. 시간이 지나면 get()을 호출하면 null이 반환되므로 일반적인 상황에서는 소프트 참조의 성능이 강력한 참조의 성능과 다르지 않습니다. 가상 머신이 메모리가 부족하다고 판단하는 경우에만 소프트 참조가 이를 반영합니다. 형질.

3. 약한 참조

약한 참조 사용 방법:

Map<String, Object> param = new HashMap<String, Object>(16);
param.put("status", 1);
WeakReference> weakRef = new WeakReference>(param);
System.out.println(weakRef.get().get("status"));

약한 참조는 소프트 참조와 거의 같은 방식으로 사용됩니다. 약한 참조는 인스턴스에 대한 참조입니다. not be 참조 카운터가 계산에 포함되므로 인스턴스에 강한 참조가 없고 약한 참조만 있는 경우 GC의 재활용 여부에 따라 null이 반환될 수 있습니다. 위의 예에서는 강한 참조와 약한 참조가 모두 있습니다. 약한 참조만 존재합니다:

WeakReference<Map<String, Object>> weakRef = new WeakReference<Map<String, Object>>(new HashMap<String, Object>(16));
System.gc();
System.out.println(weakRef.get());

현재 인쇄된 값은 null입니다. 이는 약한 참조가 GC 참조 기술에 효과적이지 않음을 의미합니다.

4. 가상 참조

가상 참조의 사용법은 위와 약간 다릅니다. GC가 객체 재활용을 준비할 때 여전히 가상 참조가 있는 것으로 확인되면 참조에 가상 참조를 추가합니다. 그것과 관련된 대기열. "Java Virtual Machine의 심층 이해: JVM 고급 기능 및 모범 사례" 제2판의 3.2.3절에 "가상 참조를 고스트 참조 또는 팬텀 참조라고도 합니다."라는 구절이 있습니다. 가장 약한 참조 관계. 객체에 가상 참조가 있는지 여부는 수명에 전혀 영향을 미치지 않으며 객체에 대한 가상 참조 연결을 설정하는 유일한 목적은 수집기가 수신할 수 있도록 하는 것입니다. JDK 1.2 이후에는 가상 참조를 구현하기 위해 PhantomReference 클래스가 제공됩니다. 먼저 가상 참조 유형의 정의를 살펴보겠습니다.

public class PhantomReference<T> extends Reference<T> {

    public T get() {
        return null;
    }

    public PhantomReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }

}

생성자가 하나만 있고 참조 큐를 하나 지정해야 한다는 것을 알 수 있습니다. 데모:

ReferenceQueue<Map<String, Object>> q = new ReferenceQueue<Map<String, Object>>();
PhantomReference<Map<String, Object>> phantomRef = new PhantomReference<Map<String, Object>>(new HashMap<String, Object>(16), q);
System.gc();
Thread.sleep(1000);
System.out.println(phantomRef.get());
System.out.println(q.poll());

인쇄된 결과는 null이고 가상 참조를 통해 객체 인스턴스를 얻을 수 없음을 확인하는 PhantomReference의 인스턴스와 참조가 참조 큐에 추가된다는 사실입니다.

위 내용은 Java 개발의 강력한 참조, 소프트 참조, 약한 참조 및 가상 참조의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.