나는 WeakReference
에 익숙하지만 메모리가 부족할 때마다 (단지 Java의 SoftReference
처럼) gc가 실행될 때마다가 아니라 만 만 메모리가 부족한 참조 유형을 찾고 있습니다. 나는 메모리에 민감한 캐시를 구현할 방법을 찾고있다..net의 SoftReference와 동일합니까?
답변
해당 사항이 없습니다. WeakReference
이 작업을 수행하지 않는 특별한 이유가 있습니까?
Why doesn't .NET have a SoftReference as well as a WeakReference, like Java?
아마 ASP.NET 캐시 클래스 (System.Web.Caching.Cache) 당신이 원하는 것을 달성하는 데 도움이 될 수 있습니다 여기에
는 당신과 비슷한 질문입니까? 메모리가 부족한 얻는 경우에 자동으로 개체를 제거 : 윈도우의 캐시 클래스를 사용하는 방법을 보여줍니다Here's an article 응용 프로그램을 형성한다.
ASP.NET 캐시 외에도 Microsoft 패턴 및 관행 그룹의 캐싱 응용 프로그램 블록이 있습니다.
는 ASP.NET 캐시는 모든 고유 키를 필요로하는 단점과 함께, 당신이 원하는 메모리에 맞는 동작을 제공합니다. 그러나 ASP.NET 캐시에 배치 한 개체에 대해 WeakReference를 보유 할 수 있어야합니다. 캐시의 강력한 참조는 캐시가 메모리를 확보하기 위해 청소해야한다고 결정할 때까지 GC를 보류 상태로 유지합니다. WeakReference는 캐시 키를 사용하여 조회하지 않고 객체에 대한 액세스를 제공합니다.
Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference(cachedData);
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;
...
if (weakRef.IsAlive)
{
Foo strongRef = weakRef.Target as Foo;
}
당신은 또한 새로운 대상이 캐시로 전환되었는지 확인 대상에 세터를 재정의해야 것
class SoftReference : WeakReference
{
public SoftReference(object target) : base(target)
{
HttpRuntime.Cache[Guid.NewGuid().ToString()] = target;
}
}
의 라인을 따라 WeakReference를 확장하여하는 SoftReference 클래스를 만들 수 있습니다.
SoftReference
은 메모리 캐싱을 구현하는 편리한 방법처럼 보일 수 있지만 Java 런타임은 객체를 유지하는 이점이 객체를 저장하는 이점을 저장할지 여부를 다소 임의적으로 결정해야합니다. 불행히도 런타임에는 객체를 유지하는 실제 비용에 대한 정보가 제한되어 있습니다 (실제 비용에는 응용 프로그램의 메모리 사용이 다른 응용 프로그램에 미치는 영향이 포함될 수 있음). 객체를 유지하는 이점에 대한 정보는 거의 없습니다. .
강력한 외부 참조가없는 경우에도 객체를 유지하는 것이 가치가 있다면 캐시는 (적어도 가치있는 것으로 보이는 한) 객체에 대한 강력한 참조를 유지해야합니다. 객체를 캐시에 보관함으로써 얻을 수있는 이점이 외부 참조가 존재하는 한 연장됩니다 (예 : 인스턴스 생성이 저렴하기 때문에 동일한 데이터를 보유하는 두 개의 논리적 엔터티를 사용하면 인스턴스를 보유하여 이들 인스턴스를 비교할 수 있습니다)), 하나는 WeakReference
을 사용해야합니다.
덧붙여 말하면, 내 druthers가 있다면,.net은 어느 플랫폼에서도 보지 못했던 또 다른 종류의 참조를 지원할 것입니다. "다른 사람에게 관심이있는"참조는 WeakReference
유형과 함께 사용됩니다. "다른 사람에게 관심있는"참조는 강력한 참조로 사용될 수 있지만 적절히 구성된 WeakReference
은 해당 대상에 대한 강력한 참조가 "다른 사람에게 관심이있는"경우 무효화됩니다. 이러한 개념은 약한 이벤트 핸들러가 반복적으로 타겟에 대한 강력한 참조를 생성하는 경우 동시 GC를 사용할 때 효율성을 향상시킬 수 있습니다. 아무도 이벤트 처리기가 대상을 가지고 무엇을하는지에 관심이 없다면 처리기가 구독 취소 될 수있는 것이 바람직합니다.
-1 Tony는 메모리에 민감한 캐시를 구현하고자했습니다. 그러나 MSDN은 WeakReferences에 대해 다음과 같이 말합니다. "메모리 관리 문제에 대한 자동 해결책으로 약한 참조를 사용하지 말고 응용 프로그램의 객체를 처리하기위한 효과적인 캐싱 정책을 개발하십시오." –