"안녕하세요!"

"이제 한 가지 더 놀라운 사실에 대해 말씀드리겠습니다. WeakReference 입니다 ."

"SoftReference와 거의 동일하게 보입니다."

// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"약한 참조에는 또 다른 특별한 기능이 있습니다."

"개체에 일반 참조나 소프트 참조가 없고 약한 참조만 있는 경우 개체는 활성 상태이지만 다음 가비지 수집 시 소멸됩니다."

"다시 말씀해 주시겠습니까? 이 참조의 차이점은 무엇입니까?"

" SoftReference 에 의해서만 죽음으로부터 유지되는 개체는 원하는 만큼 많은 가비지 컬렉션에서 살아남을 수 있으며 메모리가 충분하지 않으면 아마도 파괴될 것입니다."

" WeakReference 에 의해서만 죽음에서 유지되는 개체는 다음 가비지 수집에서 살아남지 못합니다. 그러나 그렇게 될 때까지 WeakReference에서 get() 메서드를 호출한 다음 해당 메서드를 호출하거나 다른 작업을 수행하여 개체를 가져올 수 있습니다. ."

"객체가 SoftReference와 WeakReference 모두에서 참조되는 경우 어떻게 됩니까?"

"간단합니다. 하나 이상의 일반 참조가 개체를 가리키면 활성 상태로 간주됩니다. 그런데 이러한 참조를 StrongReference라고 합니다."

"일반적인 참조가 개체를 가리키지 않지만 SoftReference는 개체를 가리키는 경우 부드럽게 연결할 수 있습니다."

"일반 참조나 SoftReference가 개체를 가리키지 않지만 WeakReference는 개체를 가리키는 경우 약하게 도달할 수 있습니다."

"생각해 보세요. SoftReference는 개체가 삭제되지 않도록 보호하고 메모리가 부족한 경우에만 개체가 삭제되도록 합니다. WeakReference는 다음 가비지 수집까지 개체를 보유합니다. SoftReference는 삭제에 대한 더 큰 저항을 제공합니다."

"아. 알 것 같아."

"좋습니다. 그럼 WeakReferences와 관련된 또 다른 흥미로운 사항인 WeakHashMap에 대해 말씀드리겠습니다."

"심각하게 들리네요!"

"그리고 몇 가지! WeakHashMap은 키가 약한 참조(WeakReferences)인 HashMap입니다."

"즉, 그러한 HashMap에 개체를 추가하고 작업합니다. 평소와 같이 비즈니스를 수행합니다."

"WeakHashMap에 저장하는 객체가 일반(강력하거나 부드러운) 참조를 키로 가지고 있는 한 이러한 객체는 살아 있을 것입니다."

"하지만 전체 응용 프로그램에서 이러한 개체에 대한 참조가 더 이상 없다고 가정합니다. 이러한 개체가 죽지 않도록 유지하는 것은 WeakHashMap 내부의 몇 가지 WeakReferences뿐입니다. 다음 가비지 수집 후 이러한 개체는 WeakHashMap에서 사라집니다. 자체적으로. 마치 그들이 거기에 없었어."

"제가 이해했는지 잘 모르겠습니다."

"WeakHashMap에 객체 쌍(키와 값)을 저장합니다. 그러나 WeakHashMap은 키를 직접 참조하지 않고 WeakReferences를 통해 참조합니다. 따라서 키로 사용되는 객체에 약하게 도달할 수 있게 되면 다음에 소멸됩니다. 가비지 수집. 결과적으로 해당 값도 WeakHashMap에서 자동으로 제거됩니다."

"WeakHashMap을 사용하여 특정 개체에 대한 추가 정보를 저장하는 것은 매우 편리합니다."

"우선 개체 자체를 키로 사용하면 정보에 접근하기가 매우 쉽습니다."

"둘째, 개체가 파괴되면 관련된 모든 데이터와 함께 HashMap에서 사라집니다."

"예를 들어:

// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo (…));

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "WeakHashMap 내부에서 키는 WeakReferences로 저장됩니다."
  2. "사용자 개체가 가비지 수집기에 의해 파괴되는 즉시 remove(user) 메서드가 WeakHashMap 내부에서 암시적으로 호출되고 사용자 개체와 관련된 모든 정보가 WeakHashMap에서 자동으로 제거됩니다."

"강력한 도구 같군요. 어디에서 사용할 수 있나요?"

"상황에 따라 다릅니다. 개체로 표시되는 일부 작업의 작업을 추적하고 이에 대한 정보를 로그에 기록하는 스레드가 프로그램에 있다고 가정해 보겠습니다. 이 스레드는 모니터링된 개체를 WeakHashMap에 저장할 수 있습니다. 개체가 필요하지 않으므로 가비지 수집기가 개체를 삭제하고 해당 개체에 대한 참조도 WeakHashMap에서 자동으로 제거됩니다."

"흥미롭게 들리네요. 이렇게 강력한 메커니즘을 활용하는 진지한 Java 프로그램을 아직 작성하지 않은 것 같은 느낌이 듭니다. 하지만 앞으로 노력하겠습니다. Ellie, 이렇게 흥미로운 강의에 감사드립니다."