Đồng nghiệp của bạn không biết họ đang nói về cái gì.
Hoạt động đắt tiền nhất của bạn sẽ được lắng nghe họ . Họ đã lãng phí thời gian của bạn để hướng bạn đến thông tin đã lỗi thời hơn một thập kỷ (kể từ ngày ban đầu câu trả lời này được đăng) cũng như bạn phải dành thời gian đăng lên đây và nghiên cứu về sự thật.
Hy vọng rằng họ chỉ đang thờ ơ với những gì họ nghe hoặc đọc từ hơn một thập kỷ trước và không biết gì hơn. Tôi cũng sẽ lấy bất cứ điều gì khác mà họ nói là nghi ngờ, đây sẽ là một lời ngụy biện nổi tiếng bởi bất cứ ai luôn cập nhật theo bất kỳ cách nào.
Tất cả mọi thứ là một đối tượng (ngoại trừ primitives
)
Mọi thứ khác ngoài nguyên thủy ( int, long, double
, v.v.) đều là các Đối tượng trong Java. Không có cách nào để tránh việc tạo Object trong Java.
Việc tạo đối tượng trong Java do các chiến lược phân bổ bộ nhớ của nó nhanh hơn C ++ trong hầu hết các trường hợp và cho tất cả các mục đích thực tế so với mọi thứ khác trong JVM có thể được coi là "miễn phí" .
Ngay từ cuối những năm 1990, các triển khai JVM đã có một số chi phí hoạt động trong việc phân bổ các Đối tượng thực tế. Điều này đã không xảy ra kể từ ít nhất là năm 2005.
Nếu bạn điều chỉnh -Xms
để hỗ trợ tất cả bộ nhớ bạn cần để ứng dụng của bạn chạy chính xác, thì GC có thể không bao giờ phải chạy và quét hầu hết rác trong các triển khai GC hiện đại, các chương trình có thời gian ngắn có thể không bao giờ là GC.
Nó không thử và tối đa hóa không gian trống, dù sao đó là cá trích đỏ, nó tối đa hóa hiệu suất của thời gian chạy. Nếu điều đó có nghĩa là Heap JVM được phân bổ gần như 100% mọi lúc, thì cũng vậy. Bộ nhớ heap JVM miễn phí không cung cấp cho bạn bất cứ điều gì chỉ cần ngồi ở đó.
Có một quan niệm sai lầm rằng GC sẽ giải phóng bộ nhớ trở lại phần còn lại của hệ thống một cách hữu ích, điều này là hoàn toàn sai!
Heap JVM không phát triển và co lại để phần còn lại của hệ thống bị ảnh hưởng tích cực bởi bộ nhớ trống trong HVM JVM . -Xms
phân bổ TẤT CẢ những gì được chỉ định khi khởi động và heuristic của nó là không bao giờ thực sự giải phóng bất kỳ bộ nhớ nào đó trở lại HĐH để được chia sẻ với bất kỳ quy trình HĐH nào khác cho đến khi phiên bản JVM đó thoát hoàn toàn. -Xms=1GB -Xmx=1GB
phân bổ 1GB RAM bất kể có bao nhiêu đối tượng thực sự được tạo tại bất kỳ thời điểm nào. Có một số cài đặt cho phép phát hành phần trăm bộ nhớ heap, nhưng với tất cả các mục đích thực tế , JVM không bao giờ có thể giải phóng đủ bộ nhớ này để điều này xảy rado đó, không có quá trình nào khác có thể lấy lại bộ nhớ này, vì vậy phần còn lại của hệ thống không được hưởng lợi từ Heap JVM là miễn phí. Một RFE cho điều này đã được "chấp nhận" 29-NOV-2006, nhưng chưa có gì được thực hiện về nó. Đây là hành vi không được coi là mối quan tâm của bất cứ ai có thẩm quyền.
Có một quan niệm sai lầm rằng việc tạo ra nhiều đối tượng tồn tại nhỏ khiến JVM tạm dừng trong thời gian dài, điều này cũng sai.
Các thuật toán GC hiện tại thực sự được tối ưu hóa để tạo ra nhiều đối tượng nhỏ tồn tại trong thời gian ngắn, về cơ bản là heuristic 99% cho các đối tượng Java trong mọi chương trình. Các nỗ lực tại Object Pooling thực sự sẽ làm cho JVM hoạt động kém hơn trong hầu hết các trường hợp.
Các đối tượng duy nhất cần gộp ngày hôm nay là các Đối tượng tham chiếu đến các tài nguyên hữu hạn bên ngoài JVM; Ổ cắm, tệp, kết nối cơ sở dữ liệu, vv và có thể được sử dụng lại. Các đối tượng thông thường không thể được gộp chung theo nghĩa như trong các ngôn ngữ cho phép bạn truy cập trực tiếp vào các vị trí bộ nhớ. Bộ nhớ đệm đối tượng là một khái niệm khác nhau và có thể hoặc không phải là thứ mà một số người ngây thơ gọi là gộp chung , hai khái niệm này không giống nhau và không nên bị lẫn lộn.
Các thuật toán GC hiện đại không gặp phải vấn đề này bởi vì chúng không phân bổ theo lịch trình, chúng sẽ phân bổ khi cần bộ nhớ trống trong một thế hệ nhất định. Nếu heap đủ lớn, thì không có sự thỏa thuận nào xảy ra đủ lâu để gây ra bất kỳ tạm dừng nào.
Các ngôn ngữ động hướng đối tượng đang đánh bại C ngay cả ngày nay trong các bài kiểm tra nhạy cảm.