7

Một số ngôn ngữ mới hơn đang triển khai ARC vào trình biên dịch của chúng (Swift và Rust, để đặt tên cho một cặp vợ chồng). Theo tôi hiểu điều này đạt được điều tương tự như thời gian chạy GC (lấy gánh nặng của deallocation hướng dẫn sử dụng đi từ lập trình viên), trong khi hiệu quả hơn đáng kể.Lợi thế của thời gian chạy GC trên ARC thời gian biên dịch là gì?

Tôi hiểu rằng ARC có thể trở thành một quá trình phức tạp, nhưng với sự phức tạp của các nhà sưu tập rác hiện đại, có vẻ như sẽ không phức tạp hơn khi triển khai ARC. Tuy nhiên, vẫn còn rất nhiều ngôn ngữ và khuôn khổ sử dụng GC để quản lý bộ nhớ, và thậm chí cả ngôn ngữ Go, trong đó nhắm mục tiêu lập trình hệ thống, sử dụng GC.

Tôi thực sự không thể hiểu tại sao GC lại thích hợp hơn với ARC. Am i thiếu cái gì ở đây?

Trả lời

20

Có một loạt các sự cân bằng liên quan ở đây, đó là một chủ đề phức tạp. Dưới đây là những người lớn mặc dù:

GC ưu:

  • Tracing người thu gom rác có thể xử lý các chu kỳ trong đồ thị đối tượng. Tính toán tham chiếu tự động sẽ làm rò rỉ bộ nhớ trừ khi các chu kỳ bị phá vỡ bằng tay bằng cách loại bỏ tham chiếu hoặc tìm ra cạnh của biểu đồ sẽ yếu. Đây là một vấn đề khá phổ biến trong thực tế trong các ứng dụng được tính tham chiếu.
  • Truy tìm bộ thu gom rác có thể thực sự nhanh hơn (về mặt thông lượng) so với đếm tham chiếu, bằng cách làm việc đồng thời, theo đợt làm việc, trì hoãn công việc và không làm rối bộ nhớ chạm vào số tham chiếu trong các vòng lặp nóng.
  • nhà sưu tập sao chép có thể nhỏ gọn đống, khai hoang trang bị phân mảnh để giảm khí

ARC ưu:

  • Bởi vì đối tượng phá hoại xảy ra ngay lập tức khi các tính tham khảo chạm 0, kiếp đối tượng có thể được sử dụng để quản lý tài nguyên không nhớ. Với việc thu gom rác thải, thời gian sống là không xác định, vì vậy điều này không an toàn.
  • Công việc thu thập thường trải rộng hơn, dẫn đến tạm dừng ngắn hơn nhiều (bạn vẫn có thể tạm dừng nếu bạn deallocate một đồ thị lớn của các đối tượng)
  • Vì bộ nhớ được thu thập đồng bộ, không thể "chạy nhanh hơn bộ thu "bằng cách phân bổ nhanh hơn nó có thể dọn sạch. Điều này đặc biệt quan trọng khi phân trang VM phát huy tác dụng, vì có trường hợp thoái hóa trong đó chuỗi GC truy cập một trang được phân trang và rơi xa phía sau.
  • Trên một lưu ý liên quan, truy tìm người thu gom rác phải đi bộ toàn bộ đồ thị đối tượng, trong đó lực lượng trang in không cần thiết (có giải pháp giảm thiểu cho như https://people.cs.umass.edu/~emery/pubs/f034-hertz.pdf này, nhưng họ không triển khai rộng rãi)
  • Tracing người thu gom rác thường cần hơn "không gian đầu" hơn tính tham khảo nếu họ muốn nhấn đầy đủ thông của họ

mất cá nhân của tôi về vấn đề này là chỉ có hai điểm mà thực sự quan trọng cho hầu hết các trường hợp là:

  • ARC không thu thập chu kỳ
  • GC không có kiếp xác định

Tôi cảm thấy rằng cả hai vấn đề là ngắt thỏa thuận, nhưng trong sự vắng mặt của một ý tưởng tốt hơn, bạn chỉ cần chọn mà vấn đề khủng khiếp âm thanh tệ hơn với bạn.

+1

Đối với một so sánh khái niệm chung về truy tìm GC so với đếm tham chiếu, bài báo này, "Lý thuyết thống nhất của bộ sưu tập rác", cho thấy cách chúng có thể được xem như là các nhị phân nghiêm ngặt của nhau. Tối ưu hóa và chỉnh sửa khác nhau cho mỗi phương pháp chỉ đơn giản là di chuyển bạn dọc theo một phổ kết nối chúng: https://www.cs.virginia.edu/~cs415/reading/bacon-garbage.pdf – algal

+0

oh, yeah, tôi thích giấy đó: D cảm ơn vì đã liên kết nó –

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