2009-03-10 30 views
5

Tôi quen thuộc với WeakReference, nhưng tôi đang tìm loại tham chiếu bị xóa chỉ khi bộ nhớ yếu, không đơn giản mỗi lần khi gc chạy (giống như Java SoftReference). Tôi đang tìm một cách để thực hiện bộ nhớ cache nhạy cảm với bộ nhớ.Tương đương với SoftReference trong .net?

Trả lời

0

Không có giá trị nào tương đương. Có lý do cụ thể nào không vì sao WeakReference sẽ không thực hiện công việc?

Đây là một câu hỏi tương tự như của bạn:

Why doesn't .NET have a SoftReference as well as a WeakReference, like Java?

+3

-1 Tony cho biết anh muốn triển khai bộ nhớ cache nhạy cảm với bộ nhớ. Tuy nhiên, MSDN nói về WeakReferences: "Tránh sử dụng các tham chiếu yếu như một giải pháp tự động cho các vấn đề quản lý bộ nhớ. Thay vào đó, hãy phát triển một chính sách lưu bộ nhớ đệm hiệu quả để xử lý các đối tượng của ứng dụng của bạn." –

2

Các ASP.NET Cache mang đến cho bạn những hành vi bộ nhớ nhạy cảm mà bạn muốn, với nhược điểm mà tất cả mọi thứ cần có một khóa duy nhất. Tuy nhiên, bạn sẽ có thể giữ một WeakReference cho một đối tượng mà bạn đã đặt trong bộ nhớ cache ASP.NET. Tham chiếu mạnh mẽ của bộ nhớ cache sẽ giữ nguyên GC cho đến khi bộ nhớ cache quyết định rằng nó cần phải được nhặt rác vào bộ nhớ trống. WeakReference cho phép bạn truy cập vào đối tượng mà không cần tra cứu bằng khóa bộ nhớ cache.

Foo cachedData = new Foo(); 
WeakReference weakRef = new WeakReference(cachedData); 
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData; 

... 

if (weakRef.IsAlive) 
{ 
    Foo strongRef = weakRef.Target as Foo; 
} 

Bạn có thể tạo ra một lớp SoftReference bằng cách mở rộng WeakReference dọc theo dòng của

class SoftReference : WeakReference 
{ 
    public SoftReference(object target) : base(target) 
    { 
     HttpRuntime.Cache[Guid.NewGuid().ToString()] = target; 
    } 
} 

Bạn cũng sẽ cần phải ghi đè lên các setter trên Target để đảm bảo rằng bất kỳ mục tiêu mới đi vào bộ nhớ cache.

1

Mặc dù SoftReference có vẻ giống như một cách thuận tiện để thực hiện bộ nhớ đệm, nó yêu cầu thời gian chạy Java để thực hiện một quyết định tùy ý về việc lợi ích giữ một đối tượng có vượt quá chi phí lưu trữ nó hay không. Thật không may, thời gian chạy có thông tin giới hạn về chi phí thực của việc giữ một đối tượng xung quanh (nhớ rằng chi phí thực có thể bao gồm tác động của việc sử dụng bộ nhớ của ứng dụng trên các ứng dụng khác), và thực tế không có thông tin về lợi ích để giữ đối tượng xung quanh .

Nếu sẽ đáng giá để giữ một đối tượng xung quanh ngay cả khi không có tham chiếu mạnh mẽ bên ngoài nó tồn tại, bộ nhớ cache nên giữ một tham chiếu mạnh mẽ đến nó (ít nhất là nó có vẻ đáng giá). Nếu lợi ích của việc giữ đối tượng trong bộ nhớ cache sẽ chỉ kéo dài khi tham chiếu bên ngoài tồn tại (ví dụ như vì các cá thể sản xuất là rẻ, nhưng có hai thực thể logic giữ dữ liệu giống nhau sử dụng cùng một cá thể để giữ chúng sẽ tạo điều kiện so sánh giữa các thực thể đó), bạn nên sử dụng WeakReference.

Ngẫu nhiên, nếu tôi có người chia tay của tôi,.net sẽ hỗ trợ một loại tài liệu tham khảo khác mà tôi không thấy trong bất kỳ nền tảng nào: tham chiếu "quan tâm đến người khác", tham chiếu này sẽ được sử dụng cùng với loại WeakReference. Tham chiếu "quan tâm đến người khác" có thể được sử dụng như một tham chiếu mạnh mẽ, nhưng một cấu hình phù hợp WeakReference sẽ bị vô hiệu nếu các tham chiếu mạnh mẽ chỉ đến mục tiêu của nó là "quan tâm đến người khác". Một khái niệm như vậy có thể cải thiện hiệu quả khi sử dụng một GC đồng thời, trong trường hợp xử lý sự kiện yếu sẽ liên tục tạo ra một tham chiếu mạnh mẽ đến mục tiêu của nó. Nếu không ai thực sự quan tâm đến những gì mà trình xử lý sự kiện đang làm với mục tiêu của nó, nó sẽ là điều mong muốn nếu người xử lý có thể bị hủy đăng ký.

Các vấn đề liên quan