Theo như tôi biết, chúng tôi không thể ép buộc Bộ sưu tập rác trong JAVA. Điều tốt nhất chúng tôi có thể làm là gửi yêu cầu bằng cách gọi số System.gc()
hoặc Runtime.gc()
. Làm như vậy sẽ gửi yêu cầu thu gom rác tới JVM nhưng không đảm bảo rằng việc thu gom rác sẽ xảy ra. Vì vậy, câu hỏi của tôi là: Có lý do cụ thể nào không, TẠI SAO JVM được thiết kế theo cách không hỗ trợ Bộ sưu tập lực lượng rác?Tại sao JVM được thiết kế theo cách nó không cho phép lực lượng thu gom rác?
Trả lời
Buộc thu gom rác không hiệu quả và không cần thiết trong hầu hết các trường hợp ... nếu bạn đã viết chương trình của mình một cách chính xác.
tham khảo:
Nó chỉ ra rằng nếu bạn kiểm soát sự ra đời của JVM mà sẽ chạy ứng dụng của bạn (hoặc Applet hay servlet hoặc bất cứ điều gì) sau đó bạn có thể đảm bảo rằng gọi System.gc()
sẽ chạy GC. Hoặc ít nhất, đó là trường hợp với Sun/Oracle JVM ... nơi hành vi được kiểm soát thông qua tùy chọn -XX
trên lệnh java
.
Điểm mà javadoc tạo ra là điều này phụ thuộc vào nền tảng và ứng dụng di động không thể dựa vào nó.
Đối với câu hỏi của bạn:
TẠI SAO JVM được thiết kế theo một cách mà nó không hỗ trợ quân Garbage Collection?
Để JVM có thể được bảo vệ khỏi tác động hiệu suất của mã được viết sai; ví dụ. trong các ứng dụng, plugin, thư viện của bên thứ ba, v.v.
(Và tôi tưởng tượng một phần vì các kỹ sư Sun ban đầu có chút chán nản với những người phàn nàn rằng "Java chậm" khi vấn đề thực sự là các cuộc gọi không cần thiết System.gc()
...)
1 - Nhưng không phải lúc nào. Ví dụ: gọi System.gc()
vào thời điểm thuận tiện có thể là cách tránh tạm dừng liên quan đến GC vào thời điểm bất tiện. Tuy nhiên, nếu mã của bạn chỉ hoạt động nếu bạn chạy GC tại một số điểm nhất định, thì bạn đang làm điều gì đó sai.
Java được thiết kế sao cho (không giống như trong C++), bạn không phải lo lắng về bản thân bằng cách lấy lại bộ nhớ bị bỏ qua. Nếu bộ nhớ thời gian chạy được cấu hình đúng, bạn không cần phải lo lắng về việc thu gom rác. Có nói rằng, làm một gc() thường sẽ kích hoạt một quét của không gian thế hệ trẻ.
Gosh, và ở đây tôi nghĩ rằng các nhà sưu tập rác đã được thực hiện cho C + + thực sự làm việc!
@PeteBecker - Bạn đang đề cập đến các nhà sưu tập bảo thủ C++ như Boehm GC, con trỏ thông minh hay cái gì khác? –
@StephenC - con trỏ thông minh là một hình thức quản lý bộ nhớ tự động, nhưng chúng không phải là bộ sưu tập rác. –
- 1. Có một JVM thiếu bộ thu gom rác không?
- 2. Tại sao Ada không có bộ thu gom rác?
- 3. Công cụ thu gom rác cho dalvik
- 4. Thu gom rác trễ?
- 5. Tại sao vô hiệu hóa bộ thu gom rác?
- 6. Thu gom rác - các nút gốc
- 7. Nếu bạn muốn lực lượng thu gom rác trên một biến trong Javascript, nó là tốt hơn để thiết lập nó là null hoặc không xác định?
- 8. JRuby - Cách khởi động bộ thu gom rác?
- 9. Thuật toán thu thập rác JVM
- 10. Thu gom rác trong Perl
- 11. JVM có bắt buộc thu gom rác khi đạt đến giới hạn -Xmx không?
- 12. Thời gian thu gom rác cực dài
- 13. Buộc thu gom rác của mảng, C#
- 14. Buộc thu gom rác thải
- 15. OutOfMemoryError - tại sao Chủ đề chờ đợi không được thu gom rác?
- 16. Thông báo Thu gom Rác Bỏ lỡ
- 17. Tại sao UserThread chạy với ScheduleExecutorService không bị thu gom rác
- 18. đế và bộ thu gom rác Đi
- 19. Thông báo thu gom rác thải?
- 20. Thu gom rác java trong hộp thoại
- 21. Thùng rác có thể thu gom được không? (và lý do tại sao hoặc làm thế nào để tránh nó)
- 22. Các loại giá trị có được thu gom rác không?
- 23. Tham khảo chéo và thu gom rác
- 24. đa và thu gom rác thải
- 25. Cam kết sẽ được thu gom rác nếu nó được nhắc đến bằng thẻ chứ không phải theo ngành?
- 26. Khi nào để thu gom rác
- 27. Tại sao bạn không gọi finalize() hoặc bắt đầu thu gom rác?
- 28. Elasticsearch không khả dụng khi đổ bộ thu gom rác?
- 29. Chi phí của người thu gom rác di chuyển
- 30. Các trường tĩnh có mở để thu gom rác không?
tại sao phải không? Làm thế nào là hữu ích để buộc một bộ sưu tập rác? – Henry
A * cụ thể * triển khai JVM * có thể * chọn để đảm bảo như vậy sẽ thực hiện một GC. Oracle/Open JDKs thì không. Có câu hỏi ở đây là sau đó: "Đối với những gì * lý do thực hiện * hiện' gc' không ngay lập tức buộc một GC dừng trong JVM tiêu chuẩn? " – user2864740
Giả sử bạn muốn tránh tạm dừng GC vào những thời điểm không thích hợp, bạn có thể chống lại chúng bằng cách sử dụng bộ thu gom tạm dừng thấp (như CMS hoặc G1) và có các nhóm đối tượng cho các loại đối tượng cần thiết liên tục.Điều đó sẽ giảm thiểu các sự kiện _stop-the-world_ ở mức tối thiểu, vì các nhóm đối tượng nên chống lại sự phân mảnh heap, đó là gót chân achilles cho CMS và G1. – mucaho