Người thu gom rác có thể và không thể làm gì?


8

GC sẽ xử lý tất cả các vấn đề quản lý bộ nhớ (rò rỉ bộ nhớ)?

Có trường hợp nào bạn không muốn GC kiểm soát một phần mã của bạn không?


Nó không thể tự thu thập, mặc dù nó nên.
đúng

Câu trả lời:


10

Nó sẽ xử lý các vấn đề quản lý bộ nhớ cổ điển (bộ nhớ được phân bổ không bị vô hiệu hóa khi không sử dụng nữa), mặc dù vẫn có thể bị rò rỉ bộ nhớ với hệ thống GC - điều này sẽ tinh tế hơn và sẽ xảy ra khi các đối tượng vẫn giữ tham chiếu cho các đối tượng khác, ngay cả khi họ không còn cần thiết.

Xem câu hỏi Tại sao .NET không thể bị rò rỉ bộ nhớ? và đó là câu trả lời trên StackOverflow.

Có thể x. tình huống khi bạn muốn kiểm soát hoàn toàn việc cấp phát bộ nhớ, nhưng thật lòng mà nói, lợi ích của hệ thống GC là thông thường mà bạn sẽ không cần.


1
Tình huống duy nhất tôi có thể nghĩ đến khi mức phạt quá cao là trong các hệ thống di chuyển lượng dữ liệu khổng lồ rất nhanh qua bộ nhớ hạn chế như đồ họa cao cấp hoặc hệ thống có bộ nhớ rất hạn chế, như bộ điều khiển nhúng.
Kỹ sư thế giới

@WorldEngineer - Đúng, đó là lý do tại sao .NET có các đối tượng được ghim, cho phép bạn kiểm soát nhiều hơn các phần của bộ nhớ.
Oded

Máy tính hiệu năng cao, hệ thống giao dịch có độ trễ thấp, v.v ... tất cả đều thích kiểm soát đối với GC của họ :-)
Martijn Verburg

Ồ, họ có thể điều chỉnh nó tốt Thậm chí còn có cả một lớp các GC cao cấp dành riêng cho việc tạm dừng nhỏ bé và hạn chế thời gian đi vào GC (các GC tăng dần và đồng thời), với các hộp đựng sẵn sàng sản xuất. Nhưng rõ ràng thậm chí điều đó không đủ đối với một số người trong số họ (tôi không thể biết liệu điều đó có hợp lý không). Vì vậy, họ để lại nó, cùng với biên soạn JIT.

@SamSaffron đã đăng liên kết này trên twitter lên một bài viết trong đó hành vi rõ ràng của GC là (ab) được sử dụng để đạt được lợi thế marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip

2

Có nhiều vấn đề về bộ nhớ (con trỏ lơ lửng, tràn bộ đệm và tương tự) và các vấn đề tài nguyên (rò rỉ bộ nhớ, rò rỉ tài nguyên khác). Người thu gom rác chăm sóc:

  • con trỏ lơ lửng
  • rò rỉ bộ nhớ
  • rò rỉ một phần tài nguyên khác

Ngôn ngữ không cho phép số học con trỏ đảm nhiệm:

  • tràn bộ đệm và các trường hợp khác của con trỏ không hợp lệ

Không thể giải quyết các trường hợp khác về vấn đề tài nguyên khi bạn quên xóa tham chiếu đến bộ nhớ / tài nguyên từ một nơi nào đó, do đó bạn vẫn có thể bị rò rỉ bộ nhớ với GC (Các đối tượng ngoại lệ đặc biệt đáng chú ý khi tham khảo nhiều điều bạn không biết).

Mặc dù GC có thể giúp bạn giải phóng các tài nguyên khác ngoài bộ nhớ bằng cách sử dụng bộ hoàn thiện (bộ hủy), nhưng nó sẽ giải phóng các tài nguyên đó với độ trễ không xác định, thường không phù hợp với các tài nguyên như tệp hoặc ổ cắm mạng. Để xử lý loại vấn đề tài nguyên này, bạn cần một số cấu trúc ngôn ngữ cho các tài nguyên có phạm vi như sử dụng câu lệnh trong C #, thành ngữ RAII trong C ++ hoặc phần mở rộng mới nhất để thử cú pháp trong Java 7 và nó vẫn chỉ có ích, vì bạn cần sử dụng nó trong mã .

Không cho phép số học con trỏ và tạo địa chỉ từ các số là cần thiết để có thể chạy trình thu gom rác chính xác. Một số tối ưu hóa hữu ích như nén chỉ có thể được thực hiện trong các bộ sưu tập chính xác (bạn chỉ có thể di chuyển các đối tượng nếu bạn có thể biết chắc chắn tham chiếu là gì, vì vậy bạn có thể cập nhật nó; bạn không thể làm điều đó trong C / C ++).


1

Bộ sưu tập rác hoạt động tốt cho bộ nhớ. Nếu bạn có rất nhiều bộ nhớ, tại sao phải chạy xung quanh để dọn sạch từng byte như đã hoàn thành? GC thường phản ứng với "áp lực bộ nhớ" và dọn dẹp khi cần thiết. Đây là một điều tốt cho bộ nhớ. Tuy nhiên, nếu bạn có một đối tượng chứa tài nguyên không phải bộ nhớ (xử lý tệp, kết nối cơ sở dữ liệu, khóa) cho đến khi áp suất bộ nhớ kích hoạt thì GC thường có nghĩa là giữ tài nguyên đó quá lâu. Bạn cần một cách tiếp cận khác cho những tài nguyên đó. Điều đó có thể có nghĩa là một tài liệu chia sẻ tham chiếu, với bản phát hành xác định khi số tham chiếu đạt đến 0 hoặc cách tiếp cận sử dụng / Loại bỏ của .NET.


0

Hệ thống GC là một phần mềm cố gắng tối ưu hóa việc sử dụng bộ nhớ cho một chương trình đang chạy.

Hệ thống GS là trách nhiệm và là một thành phần của khung (JVM / .NET).

Nó có thể giải phóng bộ nhớ cho một số đối tượng mà nó dự đoán là sẽ không cần thiết cho một ứng dụng sau một điểm nhất định trong quá trình xử lý.

Trong .NET, nó chỉ có thể giải phóng bộ nhớ cho một số đối tượng gốc .NET và không cho đối tượng MS COM.

Các đối tượng MS COM được sử dụng trong .NET phải được giải phóng rõ ràng.

Người giới thiệu:

MSDN: Bộ sưu tập rác

Wikipedia: Bộ sưu tập Gabage


Tại sao hạ cấp - Phản hồi của bạn được đánh giá cao?
NoChance
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.