2008-11-22 31 views
72

Ai đó có thể giải thích các lợi ích chính của các loại tài liệu tham khảo khác nhau trong C#?Các lợi ích tham chiếu yếu

  • tài liệu tham khảo Yếu
  • tài liệu tham khảo mềm
  • tài liệu tham khảo Phantom
  • tài liệu tham khảo mạnh mẽ.

Chúng tôi có một ứng dụng tiêu thụ rất nhiều bộ nhớ và chúng tôi đang cố gắng xác định xem đây có phải là khu vực cần tập trung hay không.

+0

Ứng dụng của bạn có sử dụng lớp System.WeakReference không? – MusiGenesis

Trả lời

61

Tham chiếu mềm và ảo đến từ Java, tôi tin. Một tham chiếu dài yếu (chuyển true cho hàm tạo WeakReference của C#) có thể được coi là tương tự như PhantomReference của Java. Nếu có một tương tự với SoftReference trong C#, tôi không biết nó là gì.

Tham chiếu yếu không kéo dài tuổi thọ của một đối tượng, do đó cho phép nó được thu thập rác khi tất cả các tham chiếu mạnh đã đi ra khỏi phạm vi. Chúng có thể hữu ích cho việc giữ các đối tượng lớn tốn kém để khởi tạo, nhưng nên có sẵn để thu gom rác nếu chúng không chủ động sử dụng.

Việc điều này có hữu ích trong việc giảm mức tiêu thụ bộ nhớ của ứng dụng của bạn hay không sẽ phụ thuộc hoàn toàn vào các chi tiết cụ thể của ứng dụng. Ví dụ: nếu bạn có một số lượng vừa phải các đối tượng được lưu trong bộ nhớ cache treo xung quanh có thể hoặc không được sử dụng lại trong tương lai, các tham chiếu yếu có thể giúp cải thiện mức tiêu thụ bộ nhớ của bộ đệm. Tuy nhiên, nếu ứng dụng đang làm việc với một số lượng lớn các đối tượng nhỏ, tham chiếu yếu sẽ làm cho vấn đề tồi tệ hơn vì các đối tượng tham chiếu sẽ chiếm nhiều hoặc nhiều bộ nhớ.

+3

Xem thêm: [Tham chiếu yếu (MSDN)] (http://msdn.microsoft.com/en-us/library/ms404247.aspx) –

35

MSDN có giải thích tốt về weak references. Các trích dẫn quan trọng là ở phía dưới nơi nó nói:

Tránh sử dụng tài liệu tham khảo yếu như một giải pháp tự động vào bộ nhớ vấn đề quản lý. Thay vào đó, hãy phát triển chính sách lưu bộ nhớ cache hiệu quả để xử lý các đối tượng của ứng dụng của bạn.

Mỗi khi tôi nhìn thấy một WeakReference trong tự nhiên, nó được sử dụng như một giải pháp tự động cho các vấn đề quản lý bộ nhớ. Có khả năng là giải pháp tốt hơn cho các vấn đề của ứng dụng của bạn.

+2

Tôi thấy rằng trích dẫn khó hiểu, vì dường như mọi việc sử dụng các tham chiếu yếu có thể được ứng dụng xử lý. Trong ví dụ tài liệu sử dụng, của một TreeView, ứng dụng có thể theo dõi xem người dùng đã sử dụng TreeView trong một khoảng thời gian chưa, và nếu không, hãy đặt TreeView thành null, cho phép bộ thu gom rác có ở đó. Điều đó sẽ hoàn thành nhiệm vụ tương tự, nhưng từ ứng dụng. –

+2

@DGGenuine: cá nhân, tôi không thấy sử dụng chút nào cho các tài liệu tham khảo yếu. Tôi đã gặp họ vài lần trong các dự án mà tôi đã kế thừa từ các nhà phát triển khác, và trong mỗi trường hợp tôi phải loại bỏ chúng hoàn toàn, vì các nhà phát triển ban đầu không hiểu chúng là gì và chúng có ý nghĩa gì. – MusiGenesis

+9

@MusiGenesis: 'Tôi không thấy sử dụng chút nào cho các tham chiếu yếu': Cho đến khi bạn bị rò rỉ bộ nhớ trong thời gian chạy được kích hoạt GC bởi vì một nơi nào đó trong mã có tham chiếu đến nút Cây giữ tất cả các cây được tham chiếu, và do đó , ** không ** rác thu thập được mặc dù thực tế nó không được sử dụng nữa. Các WeakReference được sử dụng như là một tham chiếu yếu (pun intented): "* Nếu đối tượng vẫn còn sử dụng, sau đó tôi muốn để có thể làm điều gì đó với nó, nhưng nếu nó không được nữa, sau đó không có nghĩa là tôi muốn được để giữ nó sống. * "Đó là mã vệ sinh, xác định quyền sở hữu hoặc không sở hữu một đối tượng. – paercebal

4

Ví dụ thực sự tuyệt vời với WeakReference được giải thích trong Android development tutorial.

Có hình ảnh (Bitmap) và vùng chứa hình ảnh trên chế độ xem (ImageView). Nếu hình ảnh sẽ được tải không phải từ bộ nhớ (nhưng ví dụ: từ đĩa, mạng) thì nó có thể khóa chuỗi giao diện người dùng và màn hình. Để tránh nó, một tác vụ không đồng bộ có thể được sử dụng.

Sự cố phát sinh khi tác vụ không đồng bộ kết thúc. Thùng chứa hình ảnh có thể không hữu ích chút nào vào thời điểm đó (màn hình được thay đổi hoặc Android bỏ phần xem vô hình sau khi cuộn). WeakReference có thể giúp đỡ ở đây và ImageView sẽ được thu gom rác.

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public BitmapWorkerTask(ImageView imageView) { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 
    // Method for getting bitmap is removed for code clearness 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

P.S. ví dụ là trong Java, nhưng có thể được hiểu bởi các nhà phát triển C#.
Nguồn: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

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