2011-02-01 38 views
16

Tôi đang viết trình biên dịch cho ngôn ngữ hướng đối tượng tĩnh. Hiện tại tôi đang nghiên cứu các thuật toán thu gom rác để sử dụng. Tôi tự hỏi nếu có một nhà sưu tập có nghĩa là:Có thuật toán thu thập rác nào đáp ứng các yêu cầu này không?

  • Nguồn mở và tài liệu, để tôi có thể triển khai.
  • Acurrate
  • về thế hệ
  • toàn cầu, tức là chỉ có một nhà sưu tập cho mỗi quá trình, như trái ngược với nói một cho mỗi thread.
  • Tăng dần và/hoặc đồng thời, để tránh tạm dừng lâu từ các bộ sưu tập chính.
  • Phù hợp với mô hình lập trình này. Một ví dụ về những gì sẽ không là một nhà sưu tập mà trở nên rất chậm trong sự hiện diện của nhiệm vụ phá hoại.

Chỉnh sửa: Để làm rõ, tôi đã tự hỏi nếu có một implementable thuật toán mà thực hiện điều này, không nếu có một nhà sưu tập off-the-shelf.

+3

Nếu bạn nhắm mục tiêu nền .NET hoặc Java, bạn sẽ nhận được miễn phí. –

+4

Dưới đây là một loạt bài viết [ridiculously tốt] (http://blogs.msdn.com/b/abhinaba/archive/2009/01/25/back-to-basic-series-on-dynamic-memory-management.aspx) về thu gom rác thải. – jason

+1

@Henk, anh ấy đang viết một trình biên dịch – ThomasMcLeod

Trả lời

2

(Tôi thà để điều này như một bình luận nhưng tôi không có đủ đại diện.)

Nếu bạn đang tìm kiếm thuật toán hơn đang, tôi sẽ definetely có một cái nhìn vào bài báo khoa học. Tôi stumbled khi Kỷ yếu của OOPSLA năm 2003, và ngay lập tức tôi nhớ câu hỏi của bạn --- họ đã hai phiên trên Garbage Collection:

http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-1.html
http://www.oopsla.org/oopsla2003/files/pap-session-garbage-collection-2.html

Ưu điểm của những khoảnh khắc "vụ nổ lớn" để bắt đầu nghiên cứu của bạn là sau đó bạn có thể sử dụng Google Scholar trên bất kỳ bài viết nào có triển vọng và xem liệu có nhiều cập nhật mới hơn hay không, bằng cách tìm kiếm tiêu đề và sau đó nhấp vào liên kết "được trích dẫn bởi" ví dụ:

http://scholar.google.com/scholar?cites=11437015034573374705&as_sdt=2005&sciodt=0,5&hl=en

(Vì bạn có quá nhiều yêu cầu, bạn có thể phải hôn nhiều con ếch trước khi tìm thấy bộ thu trực tuyến.)

0

Bạn có thể lấy cắp bộ thu gom rác từ mono, đây là một triển khai mã nguồn mở của .Net. Gần đây họ đã phát hành một công cụ GC mới (tôi nghĩ) đáp ứng tất cả các yêu cầu trên.

+0

Sau một số nghiên cứu, tôi thấy rằng nhà sưu tầm mới của Mono là điểm dừng chân trên thế giới, vì vậy nó không đáp ứng được các yêu cầu cần thiết. – keiter

0

Vấn đề với việc ăn cắp một người thu gom như thế này: người thu gom rác thường được gắn với ngôn ngữ mà họ được viết. Người thu gom tốt cho các ngôn ngữ chức năng có xu hướng hành động khác với người thu gom đối với những người bắt buộc. mã nguồn mở đặt ở đó có lẽ là lý do để ăn cắp từ:

  • Mono
  • Ocaml
  • Python
  • ...
0

này được (rõ ràng) khó có thể trả lời mà không cần một số ý tưởng tốt hơn của ngôn ngữ bạn đang hy vọng sẽ lưu trữ, nhưng bạn đã xem số Parrot VM chưa? PDD 9: Garbage Collection Subsystem thảo luận về GC của nó và dường như nhấn buzzwords bạn yêu cầu, và ngôn ngữ được thiết kế cho (Perl6 chủ yếu, với lua và một thứ javascript-ish mạnh mẽ được gọi là winxed là giây mạnh) chắc chắn có nhiệm vụ phá hoại và Objects.

Đó là mục tiêu VM, tuy nhiên, không phải là GC độc lập. Tôi thực sự nghi ngờ bạn sẽ tìm thấy GC (ngoài các nhà sưu tập bảo thủ như Boehm) không được liên kết với một số loại máy ảo, vì nó chính xác đòi hỏi nhiều thông tin hơn về khung ngăn xếp hơn là tháo gỡ.

5

Có một thuật toán thu thập rác không thực tế hoàn toàn đáp ứng tất cả các yêu cầu của bạn: tính toán tự động đơn giản. Nhìn chung, việc trả lại thực sự không có đủ tín dụng như một lựa chọn khả thi, nhưng thực sự nó hoạt động rất tốt trong nhiều tình huống, không bao giờ có bất kỳ sự chậm trễ lớn nào, và không cần ma thuật phức tạp.

Một mối quan tâm vẫn đang làm sạch tài liệu tham khảo vòng tròn, mà bạn ít nhất có thể để được thực hiện rất hiếm khi; các nhà phát triển ứng dụng quan tâm đến tốc độ chỉ có thể phá vỡ vòng lặp một cách rõ ràng khi họ cần các đối tượng biến mất.

Một tính năng được đánh giá rất ít về việc đếm ngược là tính năng thân thiện hơn nhiều so với các hình thức thu gom rác khác.Nếu bạn đang chạy một vòng lặp phân bổ một số đối tượng tạm thời nhỏ mỗi lần thông qua vòng lặp, thì việc đếm ngược GC (hoặc quản lý bộ nhớ rõ ràng) có thể tái sử dụng cùng một bộ nhớ mỗi lần, tránh các bộ nhớ cache không cần thiết. Bất kỳ loại GC nào khác sẽ chỉ giải phóng các đối tượng theo định kỳ, dẫn đến dấu chân bộ nhớ lớn hơn nhiều và do đó sẽ chậm đi.

Việc tính toán lại không hiệu quả đối với các hệ thống đa luồng nhiều, bởi vì bạn cần phải lấy khóa mỗi khi bạn chạm vào số lần truy cập. Nhưng nếu bạn đang thiết kế một ngôn ngữ mới dù sao đi nữa, có một điều rất lớn bạn có thể làm để cải thiện hiệu suất và độ tin cậy trên tất cả ngôn ngữ của bạn: ngăn hầu như tất cả các đối tượng không bị chia sẻ giữa các luồng. I E. chia sẻ rõ ràng. Nếu bạn làm điều đó, bạn sẽ biết các đối tượng nào là so với không được chia sẻ, và do đó những đối tượng cần phải được khóa khi tăng/giảm số lượng refcount và có thể được mở khóa bên trái. Khi không có bất kỳ khóa nào, hiệu năng đếm ngược có thể thực sự tuyệt vời.

0

Các Azul rác Collector là độc quyền, nhưng có đầy đủ thông tin có sẵn về thuật toán của họ mà bạn sẽ có thể thực hiện một cái gì đó giống như nó: http://news.ycombinator.com/item?id=2022723

Nó chắc chắn hỗ trợ "pauseless" bộ sưu tập, mặc dù mức độ phức tạp của công việc này là một dấu hiệu tốt về lý do tại sao mọi người thường không.

Các vấn đề liên quan