Đây là một câu hỏi rất khó chịu và tôi cảm thấy góp phần khiến nhiều người phản đối Java mặc dù ngôn ngữ này hữu ích như thế nào.
Việc bạn không thể tin tưởng "System.gc" để làm bất cứ điều gì là cực kỳ nan giải và có thể dễ dàng tạo ra cảm giác "Sợ hãi, không chắc chắn, nghi ngờ" đối với ngôn ngữ.
Trong nhiều trường hợp, thật tuyệt khi xử lý các xung đột bộ nhớ mà bạn cố tình gây ra trước khi một sự kiện quan trọng xảy ra, điều này sẽ khiến người dùng nghĩ rằng chương trình của bạn được thiết kế kém / không phản hồi.
Có khả năng kiểm soát bộ sưu tập rác sẽ là một công cụ giáo dục tuyệt vời, đến lượt nó giúp mọi người hiểu cách thức hoạt động của bộ sưu tập rác và cách làm cho các chương trình khai thác hành vi mặc định cũng như hành vi được kiểm soát.
Hãy để tôi xem lại các đối số của chủ đề này.
- Đó là không hiệu quả:
Thông thường, chương trình có thể không làm gì cả và bạn biết nó không làm gì cả vì cách nó được thiết kế. Ví dụ, nó có thể phải chờ đợi lâu với hộp thông báo chờ lớn và cuối cùng, nó cũng có thể thêm một cuộc gọi để thu gom rác vì thời gian để chạy sẽ mất một phần rất nhỏ thời gian chờ đợi lâu nhưng sẽ tránh gc hoạt động ở giữa một hoạt động quan trọng hơn.
- Nó luôn luôn là một thực hành xấu và chỉ ra mã bị hỏng.
Tôi không đồng ý, bạn không có vấn đề gì với công cụ thu gom rác. Công việc của nó là theo dõi rác và làm sạch nó.
Bằng cách gọi gc trong thời gian sử dụng ít quan trọng hơn, bạn giảm tỷ lệ chạy khi cuộc sống của bạn phụ thuộc vào mã cụ thể đang chạy nhưng thay vào đó, nó quyết định thu gom rác.
Chắc chắn, nó có thể không hoạt động theo cách bạn muốn hoặc mong đợi, nhưng khi bạn muốn gọi nó, bạn biết không có gì xảy ra và người dùng sẵn sàng chịu đựng sự chậm chạp / thời gian chết. Nếu System.gc hoạt động, thật tuyệt! Nếu không, ít nhất bạn đã thử. Đơn giản là không có mặt trái trừ khi bộ thu gom rác có tác dụng phụ vốn có gây ra điều gì đó bất ngờ khủng khiếp đối với cách người thu gom rác giả sử hành xử nếu được gọi thủ công và chính điều này gây ra sự mất lòng tin.
- Đây không phải là trường hợp sử dụng phổ biến:
Đó là một trường hợp sử dụng không thể đạt được một cách đáng tin cậy, nhưng có thể là nếu hệ thống được thiết kế theo cách đó. Nó giống như làm đèn giao thông và làm cho nó để một số / tất cả các nút của đèn giao thông không làm gì cả, nó khiến bạn đặt câu hỏi tại sao nút này lại bắt đầu, javascript không có chức năng thu gom rác nên chúng tôi không 'xem xét kỹ lưỡng nó nhiều như nó.
- Thông số kỹ thuật nói rằng System.gc () là một gợi ý rằng GC nên chạy và VM có thể tự do bỏ qua nó.
một "gợi ý" là gì? "bỏ qua" là gì? một máy tính không thể đơn giản đưa ra gợi ý hoặc bỏ qua một cái gì đó, có những đường dẫn hành vi nghiêm ngặt mà nó có thể là động được hướng dẫn bởi ý định của hệ thống. Một câu trả lời thích hợp sẽ bao gồm những gì trình thu gom rác thực sự đang làm, ở cấp độ thực thi, khiến nó không thực hiện việc thu thập khi bạn yêu cầu. Là tính năng đơn giản là một nop? Có một số điều kiện mà tôi phải đáp ứng? Những điều kiện này là gì?
Như hiện tại, GC của Java thường trông giống như một con quái vật mà bạn không tin tưởng. Bạn không biết khi nào nó sẽ đến hay đi, bạn không biết nó sẽ làm gì, nó sẽ làm như thế nào. Tôi có thể tưởng tượng một số chuyên gia có ý tưởng tốt hơn về cách Bộ sưu tập Rác của họ hoạt động trên cơ sở theo hướng dẫn, nhưng đại đa số chỉ đơn giản hy vọng nó "chỉ hoạt động" và phải tin vào một thuật toán có vẻ mờ đục để làm việc cho bạn thật khó chịu.
Có một khoảng cách lớn giữa việc đọc về một cái gì đó hoặc được dạy một cái gì đó, và thực sự thấy việc thực hiện nó, sự khác biệt giữa các hệ thống và có thể chơi với nó mà không cần phải xem mã nguồn. Điều này tạo ra sự tự tin và cảm giác làm chủ / hiểu / kiểm soát.
Tóm lại, có một vấn đề cố hữu với câu trả lời "tính năng này có thể không làm gì cả và tôi sẽ không đi vào chi tiết làm thế nào để biết khi nào nó làm gì và khi nào nó không và tại sao nó sẽ không hoặc sẽ, thường ngụ ý rằng nó chỉ đơn giản là chống lại triết lý để cố gắng thực hiện nó, ngay cả khi ý định đằng sau nó là hợp lý ".
Java có thể ổn khi hành xử theo cách của nó, hoặc có thể không, nhưng để hiểu nó, thật khó để thực sự đi theo hướng nào để có được một cái nhìn tổng quan về những gì bạn có thể tin tưởng vào GC để làm và không nên làm, vì vậy quá dễ dàng chỉ đơn giản là không tin vào ngôn ngữ, vì mục đích của ngôn ngữ là kiểm soát hành vi đến mức độ triết học (dễ lập trình viên, đặc biệt là người mới rơi vào khủng hoảng tồn tại từ một số hành vi hệ thống / ngôn ngữ nhất định) có khả năng chịu đựng (và nếu bạn không thể, bạn sẽ không sử dụng ngôn ngữ cho đến khi bạn phải) và nhiều thứ khác bạn không thể kiểm soát mà không biết lý do tại sao bạn không thể kiểm soát chúng vốn có hại.