- vừa được xem lúc

Reference Data Type and Grabage Collector in Java

0 0 23

Người đăng: Hoàng Tiến

Theo Viblo Asia

Reference Data Type and Grabage Collector

I. Memory Leak:

Memory Leak là một hiện tượng khi bộ nhớ được sử dụng bởi chương trình không giải phóng sau khi không còn được sử dụng nữa.

II. Grabage Collector:

Garbage Collector là một phần của máy ảo Java (JVM) và được sử dụng để thu dọn bộ nhớ tự động

Garbage Collector sẽ kiểm tra và quản lý bộ nhớ được cấp phát động trong chương trình Java, xoá các đối tượng không còn được sử dụng và giải phóng bộ nhớ của chúng.

Hoạt động:

  1. Duyệt bộ nhớ: Garbage Collector sẽ duyệt qua tất cả các đối tượng được cấp phát trong bộ nhớ và xác định xem đối tượng nào không còn được sử dụng.
  2. Xoá các đối tượng không còn được sử dụng: Sau khi xác định các đối tượng đã không còn được sử dụng, Garbage Collector sẽ xoá chúng khỏi bộ nhớ.
  3. Giải phóng bộ nhớ: Sau khi xoá các đối tượng không còn được sử dụng, Garbage Collector sẽ giải phóng bộ nhớ được cấp phát cho các đối tượng đó, và chuyển nó trở lại vào bộ nhớ sẵn sàng cho việc cấp phát các đối tượng mới.

III. Reference Data Type:

  1. Strong Reference (tham chiếu mạnh): Strong reference là một tham chiếu trực tiếp đến một đối tượng, Bất kỳ đối tượng nào đang được giữ Strong Reference thì GC sẽ không thể giải phóng được đối tượng đó. Đối tượng chỉ có thể được giải phóng khi được gán giá trị null
MyClass obj = new MyClass ();

  1. Weak Reference (tham chiếu yếu): Weak reference được sử dụng để theo dõi các đối tượng mà chúng ta không muốn giữ lại trong bộ nhớ khi chúng không được tham chiếu bởi bất kỳ strong reference nào. Weak reference có thể được sử dụng để giúp cho việc tạo ra cache hoặc bộ nhớ đệm với các đối tượng, mà không cần gây ra lỗi out of memory khi số lượng đối tượng tăng quá nhiều.
// Khởi tạo đối tượng và tạo một weak reference.
WeakReference<Person> weakRef = new WeakReference<>(new Person("John")); // Lấy đối tượng từ weak reference.
Person person = weakRef.get(); // Kiểm tra xem đối tượng đã bị loại bỏ hay chưa.
if (person == null) { System.out.println("Person has been Garbage Collected");
}

  1. Soft Reference (tham chiếu mềm): Weak Reference nhưng điểm khác ở chỗ nếu weak reference sẽ được giải phóng bộ nhớ ngay nhưng đối với Soft Reference thì phải đến khi bộ nhớ thấp. Khi JVM văng ra out of memory thì tham chiếu mềm đó mới được giải phóng.
// Khởi tạo đối tượng và tạo một soft reference.
SoftReference<Person> softRef = new SoftReference<>(new Person("John")); // Lấy đối tượng từ soft reference.
Person person = softRef.get(); // Sử dụng đối tượng.
person.doSomething();
  1. Phantom Reference (tạm dịch là tham chiếu ma): Phantom reference cũng được sử dụng để theo dõi các đối tượng nhưng không giữ lại được bất kỳ đối tượng nào. Phantom reference được sử dụng để theo dõi việc thu hồi một đối tượng và thực hiện một số hoạt động ngay trước hoặc sau khi đối tượng đó bị Garbage Collector thu hồi.
// Tạo một đối tượng và một phantom reference.
Person person = new Person("John");
ReferenceQueue<Person> queue = new ReferenceQueue<>();
PhantomReference<Person> phantomRef = new PhantomReference<>(person, queue); // kiểm tra đối tượng đã bị loại bỏ hay chưa.
boolean isRemoved = false;
while (!isRemoved) { System.gc(); Reference<?> ref = queue.poll(); if (ref == phantomRef) { System.out.println("Object has been Garbage Collected"); isRemoved = true; }
}

Tài liệu tham khảo:

https://github.com/hoangtien2k3qx1/Java/tree/main/src/java/DataType

Bình luận

Bài viết tương tự

- vừa được xem lúc

Biến (variable) và tham chiếu (reference) trong php

Chào các bạn, chắc hẳn ai trong chúng ta đã biết về biến và tham chiếu khi học các môn cơ sở lập trình khi mới vào nghề. Thế nhưng khi làm việc với PHP một vài người tưởng như đã quên là nó có tồn tại

0 0 30

- vừa được xem lúc

Tìm hiểu Ownership trong Rust

Stack & Heap. Nhiều ngôn ngữ lập trình không yêu cầu bạn phải hiểu về stack và heap quá rõ rãng.

0 0 30

- vừa được xem lúc

References và Borrowing trong Rust

Trước khi tìm hiểu references và borrowing thì chúng ta cần nắm được khái niệm Ownership là gì ? Nếu các bạn chưa tìm hiểu về ownership thì có thể ghé qua đọc bài viết Tìm hiểu Ownership trong Rust củ

0 0 27

- vừa được xem lúc

Để code ngắn gọn và tinh tế hơn trong Java

Lập trình khai báo (declarative programming) là một kĩ thuật mang lại rất nhiều lợi ích: code ngắn gọn hơn, dễ thay đổi, dễ bảo trì và mở rộng. Trong bài viết này, mình sẽ giới thiệu một số kĩ thuật đ

0 0 36

- vừa được xem lúc

Sử dụng Streams filter trong java 8

Trong bài này tôi sẽ minh họa làm thế nào để sử dụng stream filter(),collect(),findAny() hoặc orElse() trong java 8. Trong java 8 họ đã thêm stream api,nó tương tự như collection.

0 0 40

- vừa được xem lúc

[Java 8] Behavior Parameterization in Java.

Chào các bạn, hôm nay mình sẽ giới thiệu mọi người về Behavior Parameterization là gì và được implement trong java như thế nào thông qua ví dụ vô cùng đơn giản. Để dễ hiểu mình sẽ dùng cú pháp java 8

0 0 31