JavaRush /Blog Java /Random-VI /Tìm hiểu thêm về trình thu gom rác trong Java

Tìm hiểu thêm về trình thu gom rác trong Java

Xuất bản trong nhóm
Xin chào! Trong bài giảng trước, chúng ta lần đầu tiên làm quen với cơ chế có sẵn của ngôn ngữ Java - trình thu gom rác. Nó hoạt động ở chế độ nền trong khi chương trình của bạn đang chạy, thu thập các đối tượng không cần thiết, sau này sẽ bị xóa. Bằng cách này, nó giải phóng bộ nhớ để tạo các đối tượng mới trong tương lai. Trong bài giảng này chúng ta sẽ xem xét kỹ hơn về nguyên lý hoạt động của nó. Ví dụ, làm thế nào và tại thời điểm nào một đối tượng trở nên không cần thiết? Và làm sao người thu gom rác biết được điều này? Chúng tôi sẽ trả lời những câu hỏi này :) Bài giảng của chúng tôi mang tính tổng quan hơn: tài liệu này không cần phải ghi nhớ. Nó nhằm mục đích mở rộng tầm nhìn của bạn về công việc của trí nhớ và người thu gom rác, vì vậy chỉ cần đọc nó và học được điều gì đó mới cho bản thân :) Đi thôi! Điều đầu tiên bạn cần nhớ là trình thu gom rác chạy song song với chương trình của bạn . Nó không phải là một phần của nó và hoạt động riêng biệt: để mô tả điều này, trong bài giảng trước, chúng tôi đã đưa ra một ví dụ tương tự với robot hút bụi. Trên thực tế, điều này không phải lúc nào cũng đúng. Trước đây, trình thu gom rác được thiết kế theo cách nó hoạt động theo cùng một luồng với chương trình của bạn. Và theo một lịch trình nào đó, cứ sau vài phút, nó lại bắt đầu kiểm tra sự hiện diện của các đối tượng không cần thiết trong chương trình. Vấn đề là trong quá trình kiểm tra và thu gom rác này, chương trình bị treo và không thực thi. Hãy tưởng tượng bạn đang ngồi trong văn phòng làm việc. Nhưng sau đó một người phụ nữ dọn dẹp đến và cần lau sàn trong phòng. Cô ấy đuổi bạn ra khỏi phía sau máy tính trong 5 phút và bạn đợi cho đến khi cô ấy dọn dẹp xong. Trong thời gian này bạn không thể làm việc. Đây đại khái là cách hoạt động của trình thu gom rác :) Sau đó, cơ chế này đã được thay đổi và bây giờ trình thu gom rác hoạt động ở chế độ nền mà không làm chậm hoạt động của chính chương trình. Bạn đã biết rằng một đối tượng sẽ chết khi không còn tham chiếu nào đến nó. Nhưng trình thu gom rác không thực sự tính các tham chiếu đến . Thứ nhất, nó có thể khá dài. Thứ hai, nó không hiệu quả lắm. Rốt cuộc, các đối tượng có thể tham khảo lẫn nhau! Tìm hiểu thêm về máy thu gom rác - 2Hình minh họa một ví dụ trong đó 3 đối tượng tham chiếu lẫn nhau nhưng không có đối tượng nào khác tham chiếu đến chúng. Nghĩa là, chúng không cần thiết để phần còn lại của chương trình hoạt động. Nếu trình thu gom rác chỉ đơn giản là đếm các tham chiếu, thì cả 3 đối tượng này sẽ vẫn còn và không giải phóng bộ nhớ: có các tham chiếu đến chúng! Nó có thể được so sánh với một con tàu vũ trụ. Trong chuyến bay, các phi hành gia quyết định kiểm tra danh sách các phụ tùng thay thế để sửa chữa và tìm thấy trong số đó một chiếc vô lăng và bàn đạp của một chiếc ô tô bình thường. Rõ ràng là chúng không cần thiết ở đây và chiếm thêm không gian. Mặc dù các bộ phận này được kết nối với nhau và có một số chức năng, nhưng trong khuôn khổ hoạt động của tàu vũ trụ, chúng là rác không cần thiết, tốt hơn hết bạn nên loại bỏ. Do đó, Java quyết định làm cơ sở cho việc thu gom rác không tính các tham chiếu mà chia các đối tượng thành hai loại - có thể truy cậpkhông thể truy cập được. Làm cách nào để xác định xem một đối tượng có thể truy cập được không? Mọi thứ khéo léo đều đơn giản. Một đối tượng có thể truy cập được nếu nó được tham chiếu bởi một đối tượng khác có thể truy cập được. Điều này dẫn đến một “chuỗi khả năng tiếp cận”. Nó bắt đầu khi chương trình bắt đầu và tiếp tục trong suốt thời gian hoạt động của nó. Nó trông giống như thế này: Tìm hiểu thêm về máy thu gom rác - 4Mũi tên trong hình biểu thị mã thực thi chương trình của chúng tôi. Trong mã, ví dụ như trong phương thức main(), các tham chiếu đến các đối tượng được tạo. Những đối tượng này có thể tham chiếu đến các đối tượng mới, những đối tượng đó có thể tham chiếu đến một số đối tượng khác, v.v. Một chuỗi liên kết đối tượng được hình thành . Nếu một đối tượng có thể được truy cập thông qua chuỗi liên kết này đến một “liên kết gốc”, tức là một đối tượng được tạo trực tiếp trong mã thực thi, thì nó được coi là có thể truy cập được. Trong hình ảnh của chúng tôi, chúng được biểu thị bằng màu xanh lam. Nhưng nếu một đối tượng rơi ra khỏi chuỗi này, nghĩa là không có biến nào trong mã hiện đang được thực thi chứa tham chiếu đến nó và cũng không thể tiếp cận nó thông qua “chuỗi liên kết” - nó được coi là không thể truy cập được. Trong chương trình của chúng tôi, hai đối tượng như vậy được biểu thị bằng màu đỏ. Xin lưu ý: các đối tượng “màu đỏ” này có liên kết với nhau. Tuy nhiên, như chúng tôi đã nói trước đó, trình thu gom rác hiện đại trong Java không thực hiện việc đếm tham chiếu. Nó xác định liệu một đối tượng có thể truy cập được hay không thể truy cập được . Vì vậy, hai vật thể màu đỏ trong hình sẽ trở thành con mồi của hắn. Bây giờ chúng ta hãy xem toàn bộ quá trình từ đầu đến cuối, đồng thời xem bộ nhớ hoạt động như thế nào trong Java :) Tất cả các đối tượng trong Java được lưu trữ trong một vùng bộ nhớ đặc biệt gọi là heap . Trong ngôn ngữ thông thường, “đống” là một núi đồ vật trong đó mọi thứ nằm xung quanh một cách lộn xộn. Nhưng heap trong Java lại không như vậy. Nó có cấu trúc rất logic và hợp lý. Một ngày đẹp trời, các lập trình viên Java phát hiện ra rằng tất cả các đối tượng trong chương trình của họ có thể được chia thành hai loại - nói một cách tương đối, các đối tượng đơn giảncác đối tượng “tồn tại lâu dài” . Những đồ vật “sống lâu” là những đồ vật đã tồn tại qua nhiều cuộc thu gom rác. Thông thường chúng sẽ tồn tại cho đến khi kết thúc chương trình. Kết quả là, đống chung, nơi lưu trữ tất cả các đối tượng được tạo, được chia thành nhiều phần. Phần đầu tiên có một cái tên đẹp - Eden (Vườn địa đàng trong Kinh thánh). Đây là một cái tên hay vì đây là nơi các đối tượng sẽ đến sau khi chúng được tạo. Chính trong phần này bộ nhớ được phân bổ cho các đối tượng mới khi chúng ta viếtnew. Nhiều đối tượng có thể được tạo và khi hết dung lượng trong khu vực này, quá trình thu gom rác “nhanh” đầu tiên sẽ bắt đầu. Phải nói rằng người thu gom rác rất thông minh và chọn thuật toán làm việc tùy thuộc vào thứ có nhiều hơn trong heap - rác hay đối tượng đang làm việc. Nếu hầu hết tất cả các đối tượng đều là rác, trình thu thập sẽ đánh dấu các đối tượng “sống” và di chuyển chúng sang vùng bộ nhớ khác, sau đó vùng hiện tại sẽ được dọn sạch hoàn toàn. Nếu có ít rác và phần lớn bị các vật thể sống chiếm giữ, nó sẽ đánh dấu rác, dọn sạch và sắp xếp các đồ vật còn lại. Chúng ta đã nói “bộ sưu tập đánh dấu các đối tượng “sống” và di chuyển chúng đến một vị trí bộ nhớ khác”, nhưng đó là đối tượng nào? Vùng bộ nhớ nơi tất cả các đối tượng tồn tại ít nhất một bộ sưu tập rác được chuyển đi được gọi là Không gian sinh tồn . Ngược lại, Không gian sinh tồn được chia thành các thế hệ . Mỗi đối tượng được chỉ định một thế hệ dựa trên số lượng bộ sưu tập rác mà nó đã trải qua. Nếu có thì thuộc “Thế hệ 1”, nếu 5 – thuộc “Thế hệ 5”. Cùng nhau, Eden và Survival Space tạo thành một khu vực có tên là Thế hệ trẻ . Ngoài Thế hệ trẻ, còn có một vùng bộ nhớ khác trong heap - Thế hệ cũ (“thế hệ cũ”). Đây là những đồ vật có tuổi thọ rất cao đã tồn tại qua nhiều cuộc thu gom rác. Sẽ có lợi hơn nếu lưu trữ chúng tách biệt với tất cả những thứ khác. Và chỉ khi khu vực Thế hệ cũ đã đầy, tức là. Thậm chí có rất nhiều đối tượng tồn tại lâu trong chương trình đến mức không đủ bộ nhớ, việc thu gom rác hoàn chỉnh vẫn được thực hiện. Nó xử lý không chỉ một vùng bộ nhớ mà nói chung là tất cả các đối tượng được tạo bởi máy Java. Đương nhiên, phải mất nhiều thời gian và nguồn lực hơn. Đó là lý do tại sao người ta quyết định cất giữ riêng những đồ vật có tuổi thọ cao. Khi hết chỗ ở các khu vực khác, cái gọi là “thu gom rác nhanh” sẽ được thực hiện. Nó chỉ bao gồm một khu vực, và do đó nó tiết kiệm hơn và nhanh hơn. Cuối cùng, khi ngay cả khu vực dành cho người trên trăm tuổi cũng đã bị tắc nghẽn, việc dọn dẹp toàn bộ sẽ trở nên khó khăn hơn. Vì vậy, công cụ “nặng” nhất chỉ được người lắp ráp sử dụng khi không còn cần thiết nữa. Về mặt sơ đồ, cấu trúc của heap và việc dọn dẹp trông như thế này: Tìm hiểu thêm về máy thu gom rác - 5
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION