Đây là một ví dụ hơi khác, một ví dụ có các trường kiểu tham chiếu cuối cùng thay vì các biến cục bộ kiểu giá trị cuối cùng:
public class MyClass {
public final MyOtherObject obj;
}
Mỗi khi bạn tạo một phiên bản MyClass, bạn sẽ tạo một tham chiếu gửi đi đến một phiên bản MyOtherObject và GC sẽ phải theo liên kết đó để tìm kiếm các đối tượng trực tiếp.
JVM sử dụng thuật toán GC quét đánh dấu, thuật toán này phải kiểm tra tất cả các tham chiếu trực tiếp trong các vị trí "gốc" của GC (giống như tất cả các đối tượng trong ngăn xếp cuộc gọi hiện tại). Mỗi đối tượng sống được "đánh dấu" là còn sống và bất kỳ đối tượng nào được đề cập đến bởi đối tượng sống cũng được đánh dấu là còn sống.
Sau khi hoàn thành giai đoạn đánh dấu, GC quét qua heap, giải phóng bộ nhớ cho tất cả các đối tượng không được đánh dấu (và nén bộ nhớ cho các đối tượng sống còn lại).
Ngoài ra, điều quan trọng là phải nhận ra rằng bộ nhớ heap Java được phân chia thành "thế hệ trẻ" và "thế hệ cũ". Tất cả các đối tượng ban đầu được phân bổ trong thế hệ trẻ (đôi khi được gọi là "vườn ươm"). Vì hầu hết các đối tượng đều tồn tại trong thời gian ngắn, GC tích cực hơn trong việc giải phóng rác thải gần đây khỏi thế hệ trẻ. Nếu một đối tượng tồn tại trong chu kỳ thu thập của thế hệ trẻ, nó sẽ được chuyển sang thế hệ cũ (đôi khi được gọi là "thế hệ có hiệu lực"), được xử lý ít thường xuyên hơn.
Vì vậy, tôi sẽ nói "không, modifer 'cuối cùng' không giúp GC giảm khối lượng công việc của nó".
Theo tôi, chiến lược tốt nhất để tối ưu hóa việc quản lý bộ nhớ của bạn trong Java là loại bỏ các tham chiếu giả càng nhanh càng tốt. Bạn có thể làm điều đó bằng cách gán "null" cho một tham chiếu đối tượng ngay sau khi bạn sử dụng xong.
Hoặc tốt hơn là giảm thiểu kích thước của mỗi phạm vi khai báo. Ví dụ: nếu bạn khai báo một đối tượng ở đầu phương thức 1000 dòng và nếu đối tượng vẫn tồn tại cho đến khi đóng phạm vi của phương thức đó (dấu ngoặc nhọn đóng cuối cùng), thì đối tượng có thể tồn tại lâu hơn nữa. cần thiết.
Nếu bạn sử dụng các phương thức nhỏ, chỉ với một tá dòng mã, thì các đối tượng được khai báo trong phương thức đó sẽ nằm ngoài phạm vi nhanh hơn và GC sẽ có thể thực hiện hầu hết công việc của nó trong phạm vi hiệu quả hơn nhiều thế hệ trẻ. Bạn không muốn các đối tượng được chuyển sang thế hệ cũ trừ khi thực sự cần thiết.