Tại sao các nền tảng di động không hỗ trợ thu gom rác thế hệ?


11

Cả Windows Phone / Xbox và Android đều thiếu hỗ trợ cho bộ sưu tập rác thế hệ. Điều này gây khó chịu cho rất nhiều lập trình viên. Dường như có một lý do kỹ thuật hợp pháp cho nó, nhưng tôi không thể tìm ra nó.

Các điện thoại hiện tại có nhiều bộ nhớ hơn và có thể là CPU tốt hơn so với máy tính để bàn / máy tính xách tay chạy .NET 1.1 với thế hệ GC trở lại vào năm 2001, và tôi không thể nghĩ ra bất kỳ lý do nào khiến bộ xử lý ARM sẽ tệ hơn ở thế hệ GC so với x86. Cũng không có nhu cầu đa nhiệm trên điện thoại và bảng điều khiển, do đó, có không gian heap tương đối miễn phí.

Vì vậy, những gì cho?

Chỉnh sửa: Một vài điểm để làm rõ:

  • Các nền tảng này chỉ sử dụng bộ sưu tập rác cho các ứng dụng, vì vậy câu hỏi của tôi không phải là tại sao GC không được hỗ trợ; Câu hỏi của tôi là về lý do tại sao bộ sưu tập rác thế hệ không.
  • Lý do khiến mọi người thất vọng về việc thiếu GC thế hệ là vì GC không có gen là cực kỳ kém hiệu quả. (Điều đó có nghĩa là tuổi thọ pin không phải là lý do.)
  • Tôi tin rằng có một lý do kỹ thuật trung thực cho việc thiếu hỗ trợ GC thế hệ. Đây không phải là một câu hỏi tu từ.

Windows phone (thế hệ hiện tại) không có bộ sưu tập rác. Nó chỉ chạy khi thiết bị còn thiếu bộ nhớ msdn.microsoft.com/en-us/l Library / gg490770.aspx
Tom Squires

@TomSquires GC trên WP7 thực sự chạy một lần mỗi 1 MB phân bổ. Tôi nghĩ rằng bạn có thể nghĩ về trình quản lý tác vụ theo các quy trình cũ.
Rei Miyasaka

Câu trả lời:


5

Tôi nghĩ vấn đề lớn nhất là tuổi thọ pin. Bộ sưu tập rác là một tiện ích dành cho nhà phát triển được mua với giá của các chu kỳ CPU bổ sung trên máy tính của người dùng . Khi CPU của bạn được cắm (máy tính để bàn) hoặc có pin (máy tính xách tay) tương đối lớn, người dùng của bạn sẵn sàng trả tiền cho sự thuận tiện của nhà phát triển với năng lượng bổ sung mà CPU tiêu thụ trong khi thực hiện thu gom rác. Khi pin tương đối nhỏ, người dùng có thể không hào phóng. Họ có thể muốn thanh bổ sung đó cho chính mình - có lẽ để nói chuyện với bạn bè của họ, hoặc giết thêm một vài con lợn trong cuộc chạm trán chết người với những con chim giận dữ.

Bất kể lý do của người dùng là gì, các nhà phát triển hệ điều hành không muốn hình thành nhận thức rằng các thiết bị chạy HĐH của họ tiêu hao pin nhanh hơn so với các thiết bị chạy HĐH của đối thủ. Vì vậy, họ mua nhận thức tốt hơn về thời gian sử dụng pin dự kiến ​​của thiết bị với mức giá thuận tiện cho nhà phát triển: đối với họ, nỗi đau của bạn không phải là vấn đề lớn, miễn là người dùng hài lòng với thiết bị.


3
Thực tế, GC thế hệ hiệu quả hơn nhiều trong hầu hết các trường hợp, vì vậy bạn nghĩ rằng nó sẽ giảm số chu kỳ đồng hồ. Nó cũng không giải thích lý do tại sao một cái gì đó như Xbox không có GC thế hệ, bởi vì Xbox được cắm vào.
Rei Miyasaka

Chà, đó là những gì tôi nghe được trên Stack Overflow. Tuy nhiên, tôi không biết nhiều về XBox-es.
dasblinkenlight

3
Điều đó vẫn không trả lời câu hỏi. Ngay cả khi bộ sưu tập rác sử dụng nhiều năng lượng hơn phân bổ rõ ràng (điều gây tranh cãi - và tôi sẽ không tham gia vào nó), câu hỏi không phải là / tại sao phân bổ rõ ràng tốt hơn so với GC trên thiết bị di động, đó là / tại sao không GC thế hệ tốt hơn so với GC thế hệ trên di động.
Rei Miyasaka

1
@Rei: Các trò chơi thường yêu cầu mọi thứ phải có tính quyết định; ít nhất, họ cần hiệu suất dự đoán. Một vài nano giây bị lãng phí ở đây và một vài nano giây bị lãng phí ở đó - vào những thời điểm không thể đoán trước - có thể làm hỏng trải nghiệm trò chơi. Thu gom rác thế hệ là không thể đoán trước.
Kiến

2
@djacobson Tôi không nghĩ đó là sự thật. Giống như tôi đã nói trong câu hỏi, nếu đó chỉ là các nền tảng của Microsoft bỏ qua GC thế hệ, thì có lẽ đó chỉ là một lý do hậu cần / quan liêu, và tôi sẽ không buồn hỏi. Nhưng Android cũng gặp phải vấn đề tương tự, vì vậy đây có thể là lý do kỹ thuật, điều đó có nghĩa là ai đó trên P.SE có thể có câu trả lời dứt khoát.
Rei Miyasaka

3

Dự đoán tốt nhất của tôi sẽ không phải là lý do kỹ thuật, mà là các nhà phát triển cho các nền tảng điện thoại đó đơn giản là chưa nỗ lực. Tôi biết đó không phải là câu trả lời mà bạn hy vọng, nhưng nếu bạn đã thực hiện bất kỳ sự phát triển di động nào, bạn có thể nhận thấy có rất nhiều trái cây treo thấp. Có lẽ họ chỉ đơn giản là không có thời gian để viết nhiều triển khai GC, tinh chỉnh tất cả chúng và chọn một cách tốt nhất. Tại sao mọi người sẽ dành thời gian để phát minh lại bánh xe khi thay vào đó họ có thể phát hành các API mới, hào nhoáng, kém suy nghĩ? ;)

FWIW, và như đã xác nhận lý thuyết của tôi, thời gian chạy mới (ART) của Android sẽ có một thế hệ GC và họ dự định sẽ có một GC nén trong tương lai .


2

Có một số chi phí bổ sung để thu gom rác thế hệ.

Bộ sưu tập thế hệ cần có khả năng tìm ra khi các đối tượng cũ trỏ đến các đối tượng mới hơn. Chúng ta không thể lần theo dấu vết của đối tượng cũ hơn để tìm ra những trường hợp này bởi vì điều đó sẽ đánh bại mục đích của bộ sưu tập thế hệ. Thay vào đó, bằng cách nào đó chúng ta cần phát hiện khi điều này xảy ra và ghi chú về nó cho giai đoạn thu thập. Bất kể bạn sẽ làm điều đó như thế nào, nó sẽ thêm một số chi phí vào quy trình thu thập.

Trên một hệ thống máy tính để bàn, hệ điều hành của bạn đang bận rộn làm tất cả mọi thứ với bộ nhớ phía sau hậu trường. Nó hỗ trợ các tính năng như chia sẻ các trang giữa các quy trình, ghi các trang không sử dụng vào đĩa, cung cấp ánh xạ bộ nhớ giữa các quy trình, v.v ... Tôi hiểu rằng một số chức năng được sử dụng ở đó giúp cho việc theo dõi con trỏ được thay đổi hiệu quả hơn. Hoạt động đã lo lắng về những gì bạn đang thay đổi trong bộ nhớ, vì vậy sử dụng thông tin đó cho mục đích mới không phải là vấn đề.

Tôi nghi ngờ rằng các hệ thống di động không làm tất cả những thứ tương tự đằng sau hậu trường. Kết quả là, họ không có cùng mức thông tin mà máy tính để bàn sẽ có. Do đó, chi phí liên quan đến việc thực hiện một bộ sưu tập chung cao hơn và ít có khả năng có giá trị hơn.


Tận dụng lợi thế tối đa của các thế hệ GC yêu cầu sử dụng hàng rào ghi để phát hiện khi các đối tượng thế hệ cũ được viết. Mặt khác, ngay cả khi phần "đánh dấu" của GC không thể hưởng lợi từ các thế hệ, tôi sẽ nghĩ rằng người ta vẫn có thể cải thiện hiệu suất bằng cách chỉ di chuyển mọi thứ trong các thế hệ mới hơn (thực sự, thực hiện giai đoạn "gắn thẻ" trên các thế hệ cũ như cũng như mới hơn có thể hữu ích nếu nó cho phép người ta biết có bao nhiêu bộ nhớ có thể phục hồi tồn tại trong mỗi thế hệ).
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.