8.1 Java의 약한 참조
Java에는 여러 종류의 참조가 있습니다.
StrongReference 가 있습니다 . 이것은 우리가 매일 만드는 가장 일반적인 링크입니다.
Object object = new Object();//created an object
object = null;//can now be garbage collected
그리고 SoftReference, WeakReference, PhantomReference의 세 가지 "특수" 유형의 링크가 있습니다. 실제로 모든 유형의 링크 간에는 링크가 참조하는 개체에 대한 GC의 동작이라는 한 가지 차이점만 있습니다. 나중에 각 링크 유형의 세부 사항에 대해 자세히 설명하겠지만 지금은 다음 지식으로 충분합니다.
- SoftReference 는 소프트 참조입니다. GC가 객체가 소프트 참조 체인을 통해서만 액세스할 수 있다고 판단하면 메모리에서 객체를 제거합니다. 아마도.
- WeakReference - 약한 참조. GC에서 약한 참조 체인을 통해서만 개체에 액세스할 수 있다고 판단되면 메모리에서 해당 개체를 제거합니다.
- PhantomReference 는 팬텀 참조입니다. GC에서 객체가 팬텀 참조 체인을 통해서만 사용 가능하다고 판단되면 메모리에서 해당 객체를 제거합니다. GC를 여러 번 실행한 후.
또한 링크 유형에는 어느 정도의 부드러움이 있다고 말할 수 있습니다.
- 일반 하드 링크는 참조 유형의 변수입니다. 사용하지 않게 되기 전에 가비지 수집기에 의해 정리되지 않습니다.
- 소프트레퍼런스 . 객체로 인해 모든 메모리가 소모되는 것은 아닙니다. OutOfMemoryError가 발생하기 전에 삭제되는 것이 보장됩니다. 가비지 수집기의 구현에 따라 더 빠를 수도 있습니다.
- 약한 참조 . 약한 부드러움. 개체가 삭제되는 것을 막지 않으며 가비지 수집기는 이러한 참조를 무시합니다.
- 팬텀 참조 . 개체의 "죽음" 처리에 사용됩니다. 개체는 종료 후 가비지 수집될 때까지 사용할 수 있습니다.
차이점이 무엇인지 아직 명확하지 않은 경우 걱정하지 마십시오. 곧 모든 것이 제자리에 놓일 것입니다. 세부 사항은 세부 사항에 있으며 세부 사항은 계속됩니다.
8.2 Java의 WeakReference 및 SoftReference
먼저 Java에서 WeakReference 와 SoftReference 의 차이점을 살펴보겠습니다 .
즉, 가비지 수집기는 약한 참조만 가리키는 개체의 메모리를 해제합니다. 개체가 SoftReferences에서 가리키는 경우 JVM에 메모리가 절실히 필요할 때 메모리가 할당 해제됩니다.
이것은 특정 경우에 Strong 참조보다 SoftReference 에 확실한 이점을 제공합니다 . 예를 들어 SoftReference는 애플리케이션 캐시를 구현하는 데 사용되므로 JVM이 가장 먼저 수행하는 작업은 SoftReferences만 가리키는 개체를 삭제하는 것입니다.
WeakReference는 ClassLoader에 대한 참조를 저장하는 것과 같은 메타데이터를 저장하는 데 적합합니다. 클래스가 로드되지 않은 경우 ClassLoader를 참조하면 안 됩니다. 이것이 WeakReference가 가비지 수집기가 ClassLoader에 대한 마지막 강력한 참조가 제거되자마자 ClassLoader에서 작업을 수행할 수 있도록 하는 이유입니다.
Java의 WeakReference 예제:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
Java의 SoftReference 예제:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 자바의 PhantomReference
PhantomReference 인스턴스는 WeakReference 및 SoftReference 예제와 동일한 방식으로 생성되지만 거의 사용되지 않습니다.
개체에 강한(Strong), 약한(WeakReference) 또는 부드러운(SoftReference) 참조가 없는 경우 PhantomReference는 가비지 수집될 수 있습니다.
다음과 같이 Phantom Reference 개체를 만들 수 있습니다.
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference는 finalize()가 의미가 없는 상황에서 사용할 수 있습니다. 이 참조 유형은 개체에 액세스하도록 설계되지 않았기 때문에 다른 유형과 다릅니다. 개체가 이미 종료되었고 가비지 수집기가 메모리를 회수할 준비가 되었다는 신호입니다.
이를 위해 가비지 수집기는 추가 처리를 위해 이를 특수 ReferenceQueue 에 배치합니다 . ReferenceQueue는 개체 참조가 메모리를 해제하기 위해 배치되는 곳입니다.
팬텀 참조는 개체가 메모리에서 제거되었음을 알 수 있는 안전한 방법입니다. 예를 들어 큰 이미지를 처리하는 애플리케이션을 생각해 보십시오. 이미 메모리에 있고 가비지 수집 준비가 된 이미지를 메모리에 로드하려고 한다고 가정해 보겠습니다. 이 경우 새 이미지를 메모리에 로드하기 전에 가비지 수집기가 이전 이미지를 죽일 때까지 기다려야 합니다.
여기서 PhantomReference는 유연하고 안전한 선택입니다. 이전 이미지 개체가 소멸된 후 이전 이미지에 대한 참조가 ReferenceQueue로 전달됩니다. 이 링크가 있으면 새 이미지를 메모리에 로드할 수 있습니다.