Bộ sưu tập rác được gọi tự động khi đối tượng được tham chiếu đến không còn có sẵn cho bất kỳ biến nào. Nhưng tôi thích biết tại sao chúng ta gọi một cách rõ ràng bằng cách sử dụng System.gc() khi thu gom rác được gọi tự động. Khi nào chúng ta gọi System.gc();liên quan đến việc thu thập rác. Tại sao chúng ta cần gọi System.gc() ;?
Trả lời
Chúng tôi không.
Chúng tôi không làm như vậy.
Có lẽ kinh nghiệm của tôi bị giới hạn, nhưng tôi có không một lần thấy cần thiết để gọi System.gc().
Tôi sẽ trích dẫn Brian Goetz trên khía cạnh hiệu suất (nếu bạn chưa nghe nói về anh ấy, nhìn anh ta lên - và đọc phần còn lại của bài viết này, quá):
Một loại thứ ba mà các nhà phát triển thường nhầm lẫn nghĩ rằng họ đang giúp các nhà sưu tập rác là việc sử dụng
System.gc()
, mà gây ra một bộ sưu tập rác (thực sự, nó chỉ cho thấy rằng đây có thể là một thời điểm tốt cho một bộ sưu tập rác). Thật không may,System.gc()
kích hoạt một bộ sưu tập đầy đủ, trong đó bao gồm truy tìm tất cả các đối tượng sống trong heap và quét và nén các thế hệ cũ. Điều này có thể là rất nhiều công việc.Nói chung, tốt hơn là để hệ thống quyết định khi nào cần thu thập đống và có hay không thực hiện bộ sưu tập đầy đủ.
Bạn không. Như bạn nói, thu gom rác là tự động. System.gc() thậm chí không ép buộc một bộ sưu tập rác; nó chỉ đơn giản là một gợi ý cho JVM rằng "bây giờ có thể là thời điểm tốt để dọn dẹp một chút"
Nói chung, cố gắng buộc bộ thu gom rác thực hiện những gì bạn muốn với System.gc() là một hack được áp dụng bởi những người nghĩ rằng họ biết rõ hơn họ thực sự làm, hoặc như là một (cố gắng) workaround cho mã bị hỏng.
Tôi đã viết Java trong nhiều năm và tôi chưa thấy một tình huống mà gọi System.gc thực sự là điều đúng đắn nên làm (trong bất cứ điều gì tôi đã viết)
Tôi đã nhìn thấy mã thiếu sót thực sự chạy chậm hơn với System.gc(), bởi các nhà phát triển nghĩ rằng họ biết rõ hơn. –
Một số triển khai của JVM (chủ yếu cho phần cứng nhúng/phần mềm thấp) hứa hẹn sẽ thu thập rác khi System.gc() được gọi. Tuy nhiên bạn không bao giờ cần điều này. – Thirler
Nhiều thuật toán thu thập rác làm gián đoạn chương trình của bạn, chặn thực thi trên tất cả các chuỗi cho đến khi quá trình gặt được hoàn thành. Việc gọi 'System.gc()' quá thường xuyên sẽ làm tổn thương nghiêm trọng hiệu suất và (hầu như) luôn không cần thiết. – Matthew
Bạn không cần nó. Hãy suy nghĩ về nó như một công cụ chẩn đoán, giống như có thể ghi vào một bàn điều khiển gỡ lỗi.
Ví dụ: hãy tưởng tượng rằng nếu bạn đang làm điểm chuẩn, bạn sẽ muốn yêu cầu GC thu thập rác sau mỗi lần chạy điểm chuẩn.
Bạn do cần. Nó rất hữu ích cho dù những người khác nói gì.
Ví dụ sử dụng: Giả sử bạn vừa hoàn thành tác vụ nền dài đã sử dụng nhiều bộ nhớ. Không ai trong số các đối tượng đó sẽ được sử dụng lại. Vì nhiệm vụ mất nhiều thời gian nên người dùng sẽ không quan tâm đến khoảng 5-10 giây nữa. này là thời điểm thích hợp để thu thập rác.
Nếu bạn không GC tại thời điểm đó, nó sẽ xảy ra sau đó. Có lẽ trong quá trình sử dụng tương tác của chương trình tại thời điểm đó trải nghiệm người dùng bị thay đổi.
- 1. Tại sao chúng ta cần strdup()?
- 2. Tại sao chúng ta cần sợi
- 3. Tại sao chúng ta cần ng-click?
- 4. lý do tại sao chúng ta cần Hadoop cho hypertable
- 5. Tại sao chúng ta cần một thẻ fieldset?
- 6. Tại sao chúng ta gọi phương thức doesNotRecognizeSelector:?
- 7. Tại sao chúng ta cần các nhà thầu tĩnh?
- 8. Java không thu thập bộ nhớ rác
- 9. Tại sao chúng ta cần funcall trong Lisp?
- 10. Tại sao chúng ta cần giao diện trong Java?
- 11. Thuật toán thu thập rác JVM
- 12. Tại sao chúng ta cần các Dịch vụ Web RESTful?
- 13. Trong hoàn cảnh nào, chúng ta cần gọi GC.Collect hai lần
- 14. Tại sao chúng ta cần phương pháp ContinueWith?
- 15. Tại sao chúng ta cần ssh không mật khẩu Hadoop?
- 16. Tại sao chúng ta cần toán tử === đặc biệt này?
- 17. Tại sao chúng ta cần Properties trong C#
- 18. PHP: Tại sao chúng ta cần hàm so sánh chuỗi?
- 19. Tại sao chúng ta cần sử dụng cơ số?
- 20. flexbox vs bảng, tại sao chúng ta cần flexbox?
- 21. Tại sao chúng ta cần đặt khoảng trống trước% c?
- 22. Tại sao chúng ta cần toán tử "delete []"?
- 23. tại sao chúng ta thích? đến ?? toán tử trong C#?
- 24. Rác thu thập cam kết trong git
- 25. __i686.get_pc_thunk.bx là gì? Tại sao chúng ta cần cuộc gọi này?
- 26. Bộ nhớ lớn không phải rác thải được thu thập
- 27. Tại sao rác Android thu thập quá nhiều lần với Jacksons ObjectMapper?
- 28. Tại sao chúng ta sử dụng Response.ClearHeaders()?
- 29. MVC: tại sao chúng ta cần "điều khiển", hoặc khi nào chúng ta nên sử dụng mẫu này?
- 30. Tại sao chúng ta tái cấu trúc?
Bạn không bao giờ nên gọi System.gc(). Tại sao bạn nghĩ rằng bạn cần phải gọi nó? –