source

근거가 약한 레퍼런스에 대한 실용적인 용도가 있습니까?

goodcode 2022. 11. 25. 21:39
반응형

근거가 약한 레퍼런스에 대한 실용적인 용도가 있습니까?

중복 가능성:
취약한 레퍼런스 - 얼마나 유용한가?

가비지 콜렉터는 언제든지 취약한 레퍼런스를 청구할 수 있기 때문에, 그것을 사용하는 실용적인 이유가 있습니까?

Listener와 같은 다른 곳에서 사용되는 한 참조를 유지하려면 약한 참조를 사용할 수 있습니다.

WeakHashMap은 파생 데이터에 대한 키의 짧은 수명 캐시로 사용할 수 있습니다.또한 사용되는 객체에 대한 정보를 어디에 보관하고 해당 객체가 언제 폐기되는지 모르는 경우에도 사용할 수 있습니다.

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

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

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

물론 그것을 사용하는 데는 현실적인 이유가 있다.틀 설계자들이 비현실적인 약한 참조 시스템을 구축하는 데 막대한 비용을 들인다면 매우 이상하지 않을까요?

제 생각엔 당신이 질문하고자 했던 것은 다음과 같습니다.

사람들이 약한 레퍼런스를 사용하는 현실적인 상황은 무엇입니까?

많이 있어요.공통적으로 퍼포먼스 목표를 달성하는 것입니다.애플리케이션의 퍼포먼스를 조정할 때는, 메모리 사용량의 증가와 시간 사용량의 양립을 도모할 필요가 있는 경우가 많습니다.예를 들어 여러 번 수행해야 하는 복잡한 계산이 있지만 계산은 "순수"라고 가정합니다. 답은 외생적인 상태가 아니라 인수에만 의존합니다.캐시(인수에서 결과까지의 맵)를 구축할 수 있지만, 그 후 메모리를 사용합니다.두 번 다시 질문을 하지 않을 수도 있고, 그러면 그 기억은 낭비될 것입니다.

참조가 약하면 이 문제가 해결될 수 있습니다.캐시가 매우 커질 수 있기 때문에 같은 질문을 여러 번 하면 시간이 절약됩니다.그러나 캐시가 충분히 커져서 가비지 컬렉터가 공간을 회수해야 하는 경우에는 안전하게 재확보할 수 있습니다.

단점은 가비지 컬렉터의 청소 정책이 특정 캐시 문제가 아니라 시스템 전체의 목표를 충족하도록 조정된다는 것입니다.GC 정책과 원하는 캐시 정책이 충분히 일치할 경우 취약한 참조가 이 문제에 대한 매우 실용적인 해결책이 됩니다.

WeakReference가 오브젝트에 대한 유일한 참조이며 오브젝트를 어슬렁거리려면 SoftReference를 사용해야 합니다.

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

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

  1. 직접 수정할 수 없고 라이프 사이클이 거의 제어되지 않는 특정 개체에 대한 추가 정보(대부분 비용이 많이 계산되지만 재현 가능)를 보유합니다.WeakHashMap은 이러한 참조를 유지하는 완벽한 방법입니다.WeakHashMap의 키는 약하게 유지되기 때문에 키가 가비지 수집되면 맵에서도 값이 삭제되어 가비지 수집이 됩니다.
  2. 이벤트나 알림 시스템을 구현하기 위해서입니다.이 시스템은, 「청취자」가 코디네이터에 등록되기 때문에, 어떠한 일이 발생했을 때에 통지를 받을 수 있습니다.다만, 이러한 청취자가 수명이 다했을 때에 쓰레기 수집이 되지 않게 하고 싶은 장소입니다.WeakReference는 활성 상태에서는 개체를 가리키지만 원래 개체가 가비지 수집되면 "null"을 가리킵니다.

이러한 이유로 사용하고 있습니다.이 예에서는 서비스에 등록해야 하는 청취자가 다양합니다.서비스는 리스너에 대한 약한 참조를 유지하고 인스턴스화된 클래스는 강한 참조를 유지합니다.클래스가 언제든지 GCed가 되면 청취자의 남은 것은 약한 참조뿐이며, 이 경우에도 GC가 됩니다.그것은 중급반을 훨씬 쉽게 추적할 수 있게 해준다.

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

일반(하드) 값 참조를 사용하면 맵의 값이 더 이상 다른 위치에 참조되지 않으면 검색이 더 이상 필요하지 않은 경우가 많습니다.맵 값이 약하게 참조되면 다른 참조가 없으면 오브젝트는 가비지 수집 후보가 됩니다.

맵 자체에 개체에 대한 참조가(유일한) 있다고 해도 참조가 취약한 참조이기 때문에 가비지 수집이 중지되지는 않습니다.

메모리 누수를 방지하려면 , 이 문서를 참조해 주세요.

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

  • 약한 참조에 의해서만 참조되는 오브젝트는 도달 불능(또는 "약한 도달 가능")으로 간주되므로 언제든지 수집될 수 있습니다.
  • 약한 참조는 불필요한 객체가 참조하는 메모리를 유지하는 것을 방지하기 위해 사용됩니다.Java, C#, Python, Perl, PHP 또는 Lisp와 같은 일부 가비지 수집 언어들은 다양한 수준의 취약한 참조를 특징으로 하거나 지원합니다.
  • 가비지 컬렉션은 메모리 누수 및 데이터 손상 가능성을 줄이기 위해 사용됩니다.가비지 수집에는 트레이스와 참조 카운트라는 두 가지 주요 유형이 있습니다.참조 카운트 방식은 지정된 객체에 대한 참조 수를 기록하고 참조 카운트가 0이 되면 객체를 수집합니다.참조 카운트는 한 번에 하나의 개체만 수집할 수 있으므로 순환(또는 순환) 참조를 수집할 수 없습니다.따라서 다른 오브젝트에 의해 직접 참조되지 않고 도달할 수 없는 상호 참조 오브젝트 그룹은 영속적으로 상주할 수 있습니다.어플리케이션이 이러한 도달 불가능한 오브젝트 그룹을 지속적으로 생성하면 메모리 누수의 영향을 받습니다.그룹 내 일부 참조에 대해 약한 참조를 사용하여 참조 사이클을 회피할 경우 순환 참조 문제를 해결하기 위해 약한 참조를 사용할 수 있다.
  • 또한 약한 참조는 프로그램이 중요하지 않은 개체를 약한 참조만 함으로써 메모리 내의 불필요한 개체 수를 최소화하기 위해 사용됩니다.

보통 어떤 종류의 캐시에 사용합니다.최근에 액세스한 항목은 즉시 사용할 수 있으며 캐시 누락 시 항목을 다시 로드합니다(DB, FS 등).

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

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

반응형