JavaRush /Java Blog /Random-KO /Java의 약한 참조, 소프트 참조, 팬텀 참조 및 일반 참조의 차이점
theGrass
레벨 24
Саратов

Java의 약한 참조, 소프트 참조, 팬텀 참조 및 일반 참조의 차이점

Random-KO 그룹에 게시되었습니다
"약한" 참조와 "소프트" 참조(WeakReference, SoftReference) 는 오래 전에 Java API 에 추가되었지만 모든 프로그래머가 이에 익숙하지는 않습니다. 이는 이를 사용하는 위치와 방법에 대한 이해의 격차를 나타냅니다. 참조 클래스는 가비지 수집의 맥락에서 특히 중요합니다 . 우리 모두 알고 있듯이 가비지 수집기 자체는 개체가 차지하는 메모리를 해제하지만 개체에 사용 가능한 참조 유형에 따라 메모리 해제 결정을 내린다는 사실을 모든 프로그래머가 아는 것은 아닙니다. SoftReferenceWeakReferenceJava의 약한 링크, 소프트 링크, 팬텀 링크 및 일반 링크의 차이점 - 1 의 주요 차이점은 수집기가 이를 사용하는 방식입니다. 약한 링크만 가리키는 경우 언제든지 객체를 삭제할 수 있지만, 소프트 링크가 있는 객체는 JVM에 실제로 메모리가 필요한 경우에만 수집됩니다. 참조 클래스의 이러한 기능으로 인해 각각 고유한 용도가 있습니다. SoftReference는 캐시를 구현하는 데 사용될 수 있으며 JVM에 메모리가 필요할 때 해당 객체를 삭제하여 메모리를 해제합니다. 그리고 WeakReferences는 ClassLoader에 대한 링크 저장과 같은 메타데이터 저장에 적합합니다. 로드할 클래스가 없으면 ClassLoader 에 대한 참조를 저장할 필요가 없습니다 . 약한 참조를 사용하면 Strong 참조 대신 ClassLoader를 할당하자마자 제거할 수 있습니다. 이 기사에서는 Strong referencePhantom reference를 포함한 링크 유형 간의 차이점을 살펴보겠습니다 .

Java의 WeakReference와 SoftReference

모르시는 분들을 위해 4가지 유형의 링크가 있습니다.
  1. 강력한 참조
  2. 약한 참조
  3. 소프트 참조
  4. 팬텀 레퍼런스
강력한 링크는 가장 간단합니다. 예를 들어 String s = "abc" 와 같은 코드에서는 변수 s가 강력한 링크이기 때문에 매일 프로그래밍에 사용하기 때문입니다. 강력한 참조가 있는 개체는 가비지 수집기에 의해 제거되는 것이 금지됩니다. 물론 이들은 Java 프로그램에 필요한 객체입니다. 약한 참조는 java.lang.ref.WeakReference 클래스 로 표시되며 다음과 같이 약한 참조를 정의할 수 있습니다.
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
이제 강력한 참조 카운터를 null(counter = null)로 설정하면 첫 번째 줄에서 생성된 개체에 더 이상 강력한 참조가 없으므로 가비지 수집에 사용할 수 있게 됩니다. Weak에 의해 생성된 WeakCounter 참조는 수집기가 Counter 개체를 삭제하는 것을 막을 수 없습니다. 반면에 소프트 참조인 경우 JVM에 특히 높은 메모리 요구 사항이 있을 때까지 Counter 객체는 삭제되지 않습니다. Java 의 소프트 참조는 java.lang.ref.SoftReference 클래스 로 표시됩니다 . Java 에서 SoftReference 생성 예
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
강한 참조(세 번째 줄)를 지운 후에는 Counter 개체에 대해 1개의 소프트 참조만 남게 되며, 이는 가비지 수집기가 이 개체를 삭제하는 것을 막을 수는 없지만 약한 참조와는 달리 연기할 수 있습니다. 메모리가 급격히 부족해질 때까지 이 과정을 수행합니다. 소프트 링크와 약한 링크 사이의 이러한 차이를 고려할 때 첫 번째 링크는 캐시에 더 적합하고 메타데이터에는 약합니다. 좋은 예는 HashMap 또는 TreeMap 클래스 와 같은 Map 인터페이스의 자손이지만 한 가지 독특한 기능을 가진 WeakHashMap 클래스입니다. WeakHashMap은 키를 약한 참조로 래핑합니다. 즉, 개체에 대한 강력한 참조가 없으면 WeakHashMap 내부에 있는 약한 참조가 가비지 수집기에서 사용자를 보호하지 않는다는 의미입니다. 팬텀 링크는 java.lang.ref 패키지에서 사용할 수 있는 세 번째 유형의 링크입니다. 팬텀 참조는 java.lang.ref.PhantomReference 클래스 로 표시됩니다 . 가상 링크로만 가리키는 개체는 언제든지 수집기에 의해 삭제될 수 있습니다. 팬텀 링크는 약한 링크나 소프트 링크와 같은 방식으로 생성됩니다.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
DigitalCounter 개체에 대한 강력한 참조를 지우면 이제 가상 참조만 해당 개체를 가리키므로 가비지 수집기가 언제든지 해당 개체를 삭제합니다. WeakReference, SoftReference, PhantomReference, WeakHashMap 클래스 외에도 ReferenceQueue 클래스에 대해 알아두면 유용합니다 . WeakReference, SoftReference 또는 PhantomReference 객체를 생성할 때 이 클래스를 사용할 수 있습니다.
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
객체 참조는 ReferenceQueue 에 추가되며 ReferenceQueue를 폴링하여 참조 상태를 모니터링할 수 있습니다. Object의 라이프 사이클은 이 다이어그램에 잘 표현되어 있습니다. 이것이 JavaJava의 약한 참조, 소프트 참조, 팬텀 참조 및 일반 참조의 차이점 - 2 의 약한 참조와 소프트 참조 간의 모든 차이점입니다 . 우리는 또한 팬텀 링크, WeakHashMap 클래스 및 ReferenceQueue 에 대해서도 알게 되었습니다 . 참조를 적절하게 사용하면 가비지 수집에 도움이 되며 Java 에서 메모리 관리가 더욱 유연해집니다 . 원본 기사
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION