Các thuật toán đằng sau GC tạm dừng thấp là gì?


12

Một số ngôn ngữ, ví dụ như java, đã giới thiệu một GC tạm dừng thấp.

Những người đó có thể làm hầu hết công việc mà không cần tạm dừng cả thế giới. Đây rõ ràng là một vấn đề khá khó khăn vì nó đòi hỏi phải phân tích bộ nhớ khi luồng đang sửa đổi nó, dẫn đến dữ liệu có thể được sử dụng khi bắt đầu quá trình và không còn nữa khi kết thúc hoặc dữ liệu dường như bị xóa bỏ nhưng vì tài liệu tham khảo đã được di chuyển trong bộ nhớ và không bao giờ xuất hiện ở nơi mà GC đang tìm kiếm.

Vậy về cơ bản, thuật toán đằng sau đó là gì?

Tài liệu nghiên cứu hoặc liên kết bài viết thực sự kỹ thuật sẽ được coi là câu trả lời hợp lệ, vì chủ đề này thực sự là kỹ thuật.

Câu trả lời:


16

Vậy về cơ bản, thuật toán đằng sau đó là gì?

Về cơ bản, đây là một thuật toán đánh dấu và quét mà "chỉ" chạy đồng thời trong một luồng riêng biệt.

Đối với các tài liệu nghiên cứu về chủ đề đó:


5

theo như tôi hiểu, trình thu gom rác Java G1 sử dụng cái gọi là vùng heap để tránh tạm dừng toàn thế giới. Theo cách tôi thấy, trong khi một trong các khu vực bị khóa bởi GC thực hiện dọn dẹp, việc cấp phát bộ nhớ được thực hiện ở khu vực khác.

Đây là một lời giải thích từ Jeremy Manson :

Nguyên tắc rất đơn giản: trình thu thập phân chia đống thành các vùng có kích thước cố định và theo dõi dữ liệu trực tiếp trong các vùng đó. Nó giữ một bộ con trỏ - "bộ nhớ" - vào và ra khỏi khu vực. Khi một GC được coi là cần thiết, nó sẽ thu thập các vùng có ít dữ liệu trực tiếp nhất (do đó, "rác đầu tiên"). Thông thường, điều này có thể có nghĩa là thu thập toàn bộ một khu vực trong một bước: nếu số lượng con trỏ vào một khu vực bằng 0, thì nó không cần phải đánh dấu hoặc quét khu vực đó ...


5

JVM thời gian thực của IBM sử dụng một trình thu gom rác có tên Metronome , phân tách hoạt động của GC thành các lượng tử riêng biệt và xen kẽ chúng với xử lý ứng dụng. Vì vậy, về cơ bản thay vì tạm dừng GC thế giới (và không xác định) tạm dừng, ứng dụng thay vì chạy chậm hơn một chút trong khi GC được thực hiện song song.

Có một GC khác thực hiện phân mảnh động và đáp ứng các yêu cầu cứng trong thời gian thực, nhưng tài liệu tham khảo duy nhất tôi có thể tìm thấy ở đây (yêu cầu thành viên ACM).

Một trình thu gom rác thời gian thực thú vị đồng thời là vô tận . Nó sử dụng phương pháp đánh dấu và quét truyền thống, nhưng được thiết kế để sử dụng trên các hệ thống đa bộ xử lý và hỗ trợ đa luồng đồng thời không khóa.


Đẹp ! Thật tệ là tôi không có quyền truy cập vào ACM, bài viết này có vẻ rất thú vị.
deadalnix

2

Lý do nó hoạt động là vì trong Java, chỉ có GC có thể giải phóng bộ nhớ có thể chứa các tham chiếu GC. Điều đó có nghĩa là miễn là bạn có thể đọc các đối tượng trong một luồng riêng biệt một cách an toàn, bạn sẽ chỉ cần tạm dừng chương trình để quan sát các tham chiếu trên ngăn xếp.

Tôi sẽ đề nghị đột biến rằng họ thực hiện một số hình thức sao chép trên văn bản để thông báo cho GC về sự thay đổi.


Điều đó không phải là đủ, miễn là tham chiếu có thể được cập nhật bất cứ lúc nào bởi bất kỳ chủ đề.
deadalnix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.