JavaRush /Blog Java /Random-VI /Sự khác biệt giữa các tham chiếu yếu, mềm, ảo và thông th...
theGrass
Mức độ
Саратов

Sự khác biệt giữa các tham chiếu yếu, mềm, ảo và thông thường trong Java

Xuất bản trong nhóm
Các tham chiếu “yếu” và các tham chiếu “mềm” (WeakReference, SoftReference) đã được thêm vào Java API từ lâu nhưng không phải lập trình viên nào cũng quen thuộc với chúng. Điều này cho thấy một lỗ hổng trong việc hiểu vị trí và cách sử dụng chúng. Các lớp tham khảo đặc biệt quan trọng trong bối cảnh thu gom rác . Như chúng ta đã biết, trình thu gom rác tự giải phóng bộ nhớ bị chiếm giữ bởi các đối tượng, nhưng không phải lập trình viên nào cũng biết rằng nó đưa ra quyết định giải phóng bộ nhớ dựa trên loại tham chiếu có sẵn cho đối tượng. Sự khác biệt giữa link yếu, link mềm, link ảo và link thông thường trong Java - 1Sự khác biệt chính giữa SoftReferenceWeakReference là cách bộ sưu tập sẽ làm việc với chúng. Nó có thể xóa một đối tượng bất cứ lúc nào nếu chỉ các liên kết yếu trỏ đến nó, mặt khác, các đối tượng có liên kết mềm sẽ chỉ được thu thập khi JVM thực sự cần bộ nhớ. Do những đặc điểm này của các lớp tham chiếu, mỗi lớp đều có cách sử dụng riêng. SoftReference có thể được sử dụng để triển khai bộ đệm và khi JVM cần bộ nhớ, nó sẽ giải phóng bộ nhớ bằng cách xóa các đối tượng đó. Và WeakReferences rất tốt để lưu trữ siêu dữ liệu, chẳng hạn như lưu trữ liên kết đến ClassLoader. Nếu không có lớp nào để tải thì việc lưu trữ tham chiếu đến ClassLoader sẽ chẳng ích gì , tham chiếu yếu sẽ khiến ClassLoader có sẵn để xóa ngay khi chúng ta gán nó thay vì tham chiếu Strong. Trong bài viết này chúng ta sẽ xem xét sự khác biệt giữa các loại liên kết, bao gồm Tham chiếu mạnhTham chiếu Phantom .

WeakReference so với SoftReference trong Java

Dành cho bạn nào chưa biết thì có 4 loại link:
  1. Tham khảo mạnh mẽ
  2. Tham chiếu yếu
  3. Tài liệu tham khảo mềm
  4. Tham khảo ảo
Liên kết mạnh là đơn giản nhất, vì chúng ta sử dụng nó trong lập trình hàng ngày, ví dụ như trong mã như String s = “abc” biến s là liên kết mạnh. Bất kỳ đối tượng nào có tham chiếu mạnh đều bị cấm bởi trình thu gom rác. Tất nhiên, đây là những đối tượng mà chương trình Java cần. Các tham chiếu yếu được biểu diễn bằng lớp java.lang.ref.WeakReference , bạn có thể định nghĩa một tham chiếu yếu như thế này:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Bây giờ, khi bạn đặt bộ đếm tham chiếu mạnh thành null (bộ đếm = null), đối tượng được tạo ở dòng đầu tiên sẽ có sẵn để thu thập rác vì nó không còn tham chiếu mạnh nữa. Tham chiếu weakCounter được tạo bởi Weak không thể ngăn bộ sưu tập xóa đối tượng Counter. Mặt khác, nếu đó là một tham chiếu Soft, đối tượng Counter sẽ không bị xóa cho đến khi JVM có nhu cầu bộ nhớ đặc biệt cao. Các tham chiếu mềm trong Java được biểu diễn bằng lớp java.lang.ref.SoftReference . Ví dụ về tạo SoftReference trong Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
Sau khi xóa tham chiếu mạnh (ở dòng thứ 3), sẽ chỉ còn lại 1 tham chiếu mềm trên đối tượng Counter, điều này sẽ không thể ngăn trình thu gom rác xóa đối tượng này, nhưng không giống như tham chiếu yếu, nó sẽ có thể trì hoãn quá trình này cho đến khi thiếu hụt trầm trọng bộ nhớ. Do sự khác biệt giữa liên kết mềm và liên kết yếu, liên kết đầu tiên phù hợp hơn với bộ nhớ đệm và liên kết yếu phù hợp hơn với siêu dữ liệu. Một ví dụ điển hình là lớp WeakHashMap, là hậu duệ của giao diện Map giống như các lớp HashMap hoặc TreeMap , nhưng có một tính năng đặc biệt. WeakHashMap bao bọc các khóa dưới dạng tham chiếu yếu, điều đó có nghĩa là ngay khi không có tham chiếu mạnh đến một đối tượng, các tham chiếu yếu nằm bên trong WeakHashMap sẽ không cứu bạn khỏi trình thu gom rác. Liên kết ảo là loại liên kết thứ ba có sẵn trong gói java.lang.ref. Các tham chiếu Phantom được biểu diễn bằng lớp java.lang.ref.PhantomReference . Một đối tượng chỉ được trỏ đến bởi các liên kết ảo có thể bị người thu thập xóa bất cứ lúc nào. Liên kết Phantom được tạo theo cách tương tự như liên kết yếu hoặc mềm.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Sau khi bạn xóa các tham chiếu mạnh đến đối tượng DigitalCounter, trình thu gom rác sẽ xóa nó bất kỳ lúc nào, vì hiện tại chỉ có các tham chiếu ảo trỏ đến nó. Ngoài các lớp WeakReference, SoftReference, PhantomReference, WeakHashMap, việc biết về lớp ReferenceQueue cũng rất hữu ích . Bạn có thể sử dụng lớp này khi tạo đối tượng WeakReference, SoftReference hoặc PhantomReference:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Tham chiếu đối tượng sẽ được thêm vào ReferenceQueue và bạn có thể theo dõi trạng thái của tham chiếu bằng cách thăm dò ReferenceQueue. Vòng đời của Object được thể hiện rõ ràng trong sơ đồ này: Sự khác biệt giữa tham chiếu yếu, mềm, ảo và thông thường trong Java - 2Đó là tất cả sự khác biệt giữa các tham chiếu yếu và mềm trong Java . Chúng ta cũng đã làm quen với các liên kết ảo, lớp WeakHashMapReferenceQueue . Việc sử dụng đúng các tham chiếu sẽ giúp thu thập rác và sẽ giúp quản lý bộ nhớ linh hoạt hơn trong Java . Bài báo gốc
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION