Là người thu gom rác thế hệ vốn đã thân thiện với bộ nhớ cache?


38

Một trình thu gom rác thế hệ điển hình giữ dữ liệu được phân bổ gần đây trong một vùng bộ nhớ riêng. Trong các chương trình điển hình, rất nhiều dữ liệu tồn tại trong thời gian ngắn, do đó, việc thu thập rác trẻ (một chu trình GC nhỏ) thường xuyên và thu thập rác cũ không thường xuyên là một sự thỏa hiệp tốt giữa chi phí bộ nhớ và thời gian thực hiện GC.

Theo trực giác, lợi ích của trình thu gom rác thế hệ so với trình thu gom một vùng sẽ tăng lên khi tỷ lệ độ trễ của bộ nhớ chính so với bộ đệm tăng lên, vì dữ liệu trong vùng trẻ được truy cập thường xuyên và được giữ ở một nơi. Kết quả thí nghiệm có chứng thực trực giác này không?


một cuộc thảo luận meta liên quan về các thẻ thích hợp cho câu hỏi.
Kaveh

Câu trả lời:


19

Dưới đây là một vài bài viết nói về ý nghĩa bộ đệm của bộ thu gom rác thế hệ:

Từ những gì tôi có thể thu thập, vấn đề chính là các hệ thống thu gom rác đánh đổi không gian trong bộ nhớ để tránh thu gom trước. Điều tương tự áp dụng cho bộ nhớ cache. Như bạn đã đề xuất, những thứ ở thế hệ đầu tiên rất có thể sẽ nằm trong bộ đệm, và do đó việc phân bổ và thu thập của chúng sẽ nhanh hơn nhiều so với thứ gì đó trong bộ nhớ chính hoặc được phân loại ra đĩa. Vấn đề chính là kích thước của thế hệ đầu tiên liên quan đến kích thước bộ đệm của bạn. Nếu bộ nhớ cache của bạn đầy trước khi thế hệ đầu tiên thực hiện, thì bạn bắt đầu mất những lợi ích đó khi các lỗi bắt đầu chồng chất.


10

Có một khía cạnh rất khó khăn của tất cả các công cụ thu gom rác có thể được trình bày trong một số mô tả và đó là "quét toàn bộ" hoặc "thu thập đầy đủ". Định kỳ, ngẫu nhiên, không liên tục họ phải quét tất cả các đối tượng. người thu thập thế hệ tốt hơn trong việc hoãn quét toàn bộ và giảm thiểu thời lượng của nó, nhưng nó vẫn được yêu cầu.

Bộ sưu tập thế hệ sẽ tập trung vào thứ đôi khi được gọi là không gian "vườn ươm", nhưng cuối cùng nó sẽ / chắc chắn phải thu thập trên không gian thế hệ "cũ hơn", gây ra toàn bộ bộ nhớ.

Quá trình quét toàn bộ này không tương thích với hầu hết tất cả các bộ nhớ đệm và (đặc biệt là!) Theo nghĩa là hầu như tất cả các lược đồ bộ nhớ / ảo hóa bộ nhớ sẽ / phải thất bại nặng nề trong bất kỳ cải thiện hiệu năng nào trong trường hợp này.

Vì vậy, câu trả lời chính cho câu hỏi này là tần suất quét toàn bộ được kích hoạt và mức độ "xấu" của nó khi nó xảy ra và nếu nó có thể được dung thứ. điều này dẫn đến một thuộc tính / câu hỏi phụ thuộc vào ứng dụng nhiều hơn.

Nói cách khác, "hầu hết" hoạt động của trình thu thập, bộ đệm có thể sẽ giúp nó (bộ đệm và không gian vườn ươm "trẻ" nói chung sẽ chồng chéo lên nhau!), Nhưng có một định kỳ, không liên tục, cuối cùng, không thể tránh khỏi, nặng nề, thậm chí có thể "khổng lồ" [xuống cấp] tăng hiệu suất khi không gian "thế hệ cũ" được thu thập đầy đủ và "tỷ lệ trúng" bộ đệm sẽ xuống cấp rất tệ vì nhiều đối tượng bên ngoài nó đều được nạp đầy đủ trong một vòng lặp chặt chẽ quét / thu thập chu kỳ. Nói cách khác, sự gián đoạn định kỳ không thể giải thích được (trong đó ước tính thống kê / trung bình / xu hướng của hiệu suất, vv là sai lệch và không thể áp dụng).

Những gì hiện đang nổi lên là một số hệ thống thu thập mới được thiết kế để kết hợp với các hệ thống quản lý bộ nhớ cơ bản (bộ nhớ đệm / ảo hóa). Dường như các cách tiếp cận lịch sử tách rời hoàn toàn các hệ thống thu thập bộ nhớ, bộ nhớ đệm và ảo hóa riêng biệt sẽ không thực hiện tốt như các phương pháp kết hợp / tích hợp / giải quyết cả ba khía cạnh với nhau.

Xem ví dụ bộ sưu tập rác nhận biết bộ đệm của Zhou và Demsky.


Vì vậy, bạn có thể lập luận rằng các GC thế hệ thân thiện với bộ đệm so với các thế hệ không cổ điển (cổ điển)?
Raphael

Tôi sẽ lập luận rằng GC nên được thiết kế theo cách tích hợp với bộ nhớ cache & bộ nhớ ảo như một phần của thiết kế của nó, điều này rất khó trong các kiến ​​trúc hiện có. tuy nhiên để mở rộng câu trả lời-- vâng, các bộ sưu tập thế hệ tổng hợp / liên kết / nhóm các đối tượng được sử dụng thường xuyên vào bộ nhớ liền kề sẽ tương thích với bộ đệm hơn so với các thiết kế khác trong đó các đối tượng được sử dụng thường xuyên và không thường xuyên bị phân tán / xen kẽ (mặc dù sau này vẫn sẽ có một số lợi ích bộ nhớ cache).
vzn

1
Một khía cạnh hơi khó khăn trong việc hợp nhất các kiến ​​trúc GC và bộ nhớ đệm / ảo hóa là các kiến ​​trúc như vậy thường không quan tâm đến nội dung của các trang bộ nhớ, nhưng trong một hệ thống GC, chúng bắt buộc phải có. Các ngôn ngữ khác nhau đôi khi hứa hẹn các tính năng liên quan đến GC khác nhau cho các lập trình viên và việc tìm ra các tính năng hỗ trợ ở cấp độ HĐH có thể khó khăn. Cách tiếp cận tốt nhất có lẽ sẽ nói rằng mỗi đối tượng cần chứa một con trỏ tới cấu trúc có các trường ban đầu được xác định bởi HĐH, nhưng có thể được theo sau bởi dữ liệu cụ thể theo ngôn ngữ mà HĐH sẽ không biết hoặc quan tâm.
supercat
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.