Programing

약한 참조에 대한 실용적인 사용이 있습니까?

crosscheck 2020. 8. 29. 09:18
반응형

약한 참조에 대한 실용적인 사용이 있습니까? [복제]


중복 가능성 :
약한 참조-얼마나 유용합니까?

약한 참조는 가비지 수집기에서 언제든지 주장 할 수 있기 때문에이를 사용하는 실질적인 이유가 있습니까?


리스너와 같은 다른 곳에서 사용되는 한 무언가에 대한 참조를 유지하려면 약한 참조를 사용할 수 있습니다.

WeakHashMap은 파생 데이터에 대한 키의 단기 캐시로 사용할 수 있습니다. 또한 다른 곳에 사용 된 객체에 대한 정보를 보관하는 데 사용할 수 있으며 해당 객체가 언제 폐기되는지 알 수 없습니다.

BTW 소프트 참조는 약한 참조와 비슷하지만 항상 즉시 정리되지는 않습니다. GC는 가능한 경우 항상 약한 참조를 버리고 가능한 경우 소프트 참조를 유지합니다.

팬텀 참조라는 또 다른 종류의 참조가 있습니다. 이것은 GC 정리 프로세스에서 사용되며 정리 중이기 때문에 "일반"코드에 액세스 할 수없는 개체를 나타냅니다.


약한 참조는 가비지 수집기에서 언제든지 주장 할 수 있기 때문에이를 사용하는 실질적인 이유가 있습니까?

물론 그것을 사용하는 실용적인 이유가 있습니다. 프레임 워크 디자이너가 비실용적약한 참조 시스템을 구축하는 데 막대한 비용을들이는 것은 몹시 이상 할 것입니다. 그렇지 않습니까?

나는 당신이 묻고 자하는 질문이 다음과 같다고 생각합니다.

사람들이 약한 참조를 사용하는 현실적인 상황은 무엇입니까?

많이있다. 일반적인 것은 성능 목표를 달성하는 것입니다. 응용 프로그램의 성능을 조정할 때 종종 더 많은 메모리 사용과 더 많은 시간 사용간에 균형을 유지해야합니다. 예를 들어 여러 번 수행해야하는 복잡한 계산이 있지만 계산이 "순수"라고 가정합니다. 대답은 외부 상태가 아니라 인수에만 의존합니다. 인수에서 결과로의 맵인 캐시를 작성할 수 있지만 그런 다음 메모리를 사용합니다. 다시는 질문을하지 않을 수도 있고 그 기억은 낭비 될 것입니다.

약한 참조는이 문제를 해결할 수 있습니다. 캐시가 상당히 커질 수 있으므로 동일한 질문을 여러 번하면 시간이 절약됩니다. 그러나 캐시가 가비지 수집기가 공간을 회수해야 할만큼 충분히 커지면 안전하게 수행 할 수 있습니다.

단점은 물론 가비지 수집기의 정리 정책이 특정 캐시 문제가 아닌 전체 시스템의 목표를 충족하도록 조정된다는 것입니다. GC 정책과 원하는 캐시 정책이 충분히 정렬되면 약한 참조가이 문제에 대한 매우 실용적인 솔루션입니다.


경우 WeakReference를이 는 IS 에만 객체를 참조하고 개체가 놀아하려면, 당신은 아마 사용해야 하는 SoftReference를 대신.

WeakReferences는 객체에 대한 다른 참조가있을 때 가장 잘 사용되지만 다른 참조가 더 이상 사용되지 않을 때 감지 할 수 없거나 감지 할 필요가 없습니다. 그런 다음 다른 참조는 객체가 가비지 수집되는 것을 방지하고 WeakReference는 동일한 객체에 도달하는 또 다른 방법입니다.

두 가지 일반적인 사용 사례는 다음과 같습니다.

  1. 직접 수정할 수없고 수명주기를 거의 제어 할 수없는 특정 개체에 대한 추가 (종종 비용이 많이 들지만 재현 가능) 정보를 보관합니다. WeakHashMap 은 이러한 참조를 보관하는 완벽한 방법입니다. WeakHashMap의 키는 약하게 보관되므로 키가 가비지 수집 될 때 값도 Map에서 제거되어 가비지 수집 될 수 있습니다.
  2. 어떤 종류의 이벤트 또는 알림 시스템을 구현하기 위해, "리스너"가 일종의 코디네이터에 등록되어 어떤 일이 발생할 때 알림을받을 수 있지만 이러한 리스너가 올 때 가비지 수집되는 것을 방지하고 싶지 않은 경우 그들의 삶의 끝. WeakReference는 살아있는 동안 객체를 가리 키지 만 원래 객체가 가비지 수집되면 "null"을 가리 킵니다.

우리는 그 이유 때문에 그것을 사용합니다. 우리의 예에서는 서비스에 등록해야하는 다양한 리스너가 있습니다. 서비스는 리스너에 대한 약한 참조를 유지하고 인스턴스화 된 클래스는 강한 참조를 유지합니다. 클래스가 언제든지 GC를 받으면 약한 참조는 리스너에게 남아있는 모든 것이므로 GC도됩니다. 중개 클래스를 훨씬 쉽게 추적 할 수 있습니다.


약한 참조의 가장 일반적인 용도는 "조회"맵의 값입니다.

일반 (하드) 값 참조를 사용하면 맵의 값에 더 이상 다른 곳에서 참조가 없으면 더 이상 조회가 필요하지 않습니다. 약하게 참조 된 맵 값을 사용하면 다른 참조가 없으면 객체가 가비지 수집 대상이됩니다.

맵 자체에 객체에 대한 (유일한) 참조가 있다는 사실은 참조가 약한 참조 이기 때문에 가비지 수집을 중단하지 않습니다.


메모리 누수를 방지하려면이 문서 를 참조하십시오.


약한 참조는 가비지 수집기에 의한 수집으로부터 참조 개체를 보호하지 않는 참조입니다.

  • 약한 참조에 의해서만 참조되는 객체는 도달 불가능 (또는 "약하게 도달 할 수있는")으로 간주되므로 언제든지 수집 할 수 있습니다.
  • 약한 참조는 불필요한 개체가 참조하는 메모리를 유지하는 것을 방지하는 데 사용됩니다. 일부 가비지 수집 언어는 Java, C #, Python, Perl 또는 Lisp와 같은 다양한 수준의 약한 참조를 제공하거나 지원합니다.
  • 가비지 수집은 메모리 누수 및 데이터 손상 가능성을 줄이는 데 사용됩니다. 가비지 콜렉션에는 추적 및 참조 계수라는 두 가지 주요 유형이 있습니다. 참조 계수 체계는 주어진 개체에 대한 참조 수를 기록하고 참조 수가 0이되면 개체를 수집합니다. 참조 계수는 한 번에 하나의 개체 만 수집 할 수 있으므로 순환 (또는 순환) 참조를 수집 할 수 없습니다. 따라서 다른 개체에 의해 직접 참조되지 않고 연결할 수없는 상호 참조 개체 그룹은 영구적으로 상주 할 수 있습니다. 응용 프로그램이 계속해서 연결할 수없는 개체 그룹을 생성하면 메모리 누수의 영향을받습니다.그룹 내의 일부 참조에 대해 약한 참조를 사용하여 참조주기를 피할 경우 약한 참조를 사용하여 순환 참조 문제를 해결할 수 있습니다.
  • 약한 참조는 또한 프로그램이 약하게 참조하여 중요하지 않은 개체를 표시 할 수 있도록하여 메모리에서 불필요한 개체의 수를 최소화하는 데 사용됩니다.

일반적으로 일부 유형의 캐시에 사용합니다. 최근에 액세스 한 항목은 즉시 사용할 수 있으며 캐시가 누락 된 경우 항목 (DB, FS 등)을 다시로드합니다.


WeakSet링크를 그래프로 인코딩하는 데 사용 합니다. 노드가 삭제되면 링크가 자동으로 사라집니다.

참고 URL : https://stackoverflow.com/questions/8790511/is-there-a-practical-use-for-weak-references

반응형