Giả sử bạn có tệp jar 3 Gb và ứng dụng của bạn chỉ sử dụng một lớp nhỏ trong đó. Liệu JVM có tải toàn bộ tệp jar vào bộ nhớ hay không đọc Bảng Mục lục và chỉ tải các phần cần thiết? Hành vi này có thể kiểm soát được không?Java JVM có tải toàn bộ jar hoặc tai nếu nó chỉ sử dụng một lớp từ nó không?
Trả lời
JVM chỉ tải các lớp được yêu cầu từ Jar khi được gọi. Nếu ứng dụng cần một lớp thì lớp và tất cả các lớp phụ thuộc khác sẽ được nạp. Không chắc chắn nhưng tôi cho rằng đây là trách nhiệm của trình nạp lớp để định vị lớp từ đường dẫn lớp và tải.
Trình tải lớp mặc định chỉ tải những gì cần, khi cần. Nếu bạn có một JAR 10MB trong CLASSPATH của bạn và chỉ cần một tệp .class, JVM sẽ chỉ tải lớp đó vào lần đầu tiên mã của bạn cố gắng truy cập nó. Bytecode .class đi vào không gian perm.
Đó là "có thể điều khiển" theo nghĩa là bạn có thể viết trình tải lớp của riêng bạn, nhưng phải mất một số chuyên môn để làm như vậy.
Nó hoàn toàn phụ thuộc vào JVM và trình nạp lớp. Thông số JVM chỉ định lớp cần xuất hiện để được tải khi sử dụng hoạt động đầu tiên. Trình nạp lớp có thể tải một số lớp sớm hơn so với yêu cầu trong dự đoán. Trong thực tế hầu hết các trình nạp lớp đều trì hoãn tải càng lâu càng tốt.
Tệp Jar là một dạng tệp zip.
Cách chúng được xử lý phụ thuộc nhiều vào JRE.
Các phiên bản cũ của Sun JRE được sử dụng để bộ nhớ ánh xạ toàn bộ tệp. Điều này sẽ phân bổ bộ nhớ logic, nhưng không nhất thiết phải gây ra bất kỳ dữ liệu nào được nạp từ đĩa. (Windows 32 bit thường không có khả năng phân bổ 3 GB bộ nhớ tiếp giáp, mặc dù bạn có thể thực hiện trên các hệ điều hành khác).
Tôi tin rằng hành vi hiện tại là bộ nhớ ánh xạ thư mục trung tâm ở phía sau tệp trong Windows. Dưới các hệ điều hành khác, nó chỉ đọc. Điều này được kiểm soát bởi #define
s trong nguồn.
JDK7 có khả năng làm điều gì đó khác.
Lớp học thường được tải nhẹ nhàng. Tài nguyên được đọc lại mỗi lần. java.util.ResourceBundle
cache.
- 1. Webkit cố gắng để tải về lớp applet Java trước khi đọc nó từ JAR
- 2. Tôi có thể sử dụng thread.stop() trong Java nếu tôi thực sự cần nó không?
- 3. Javascript: sử dụng hoặc một biến, hoặc nếu nó không xác định, một chuỗi mặc định
- 4. add dòng vào một tập tin CHỈ nếu nó không có trong tập tin đã
- 5. Có thể đăng nhập nếu một lớp trong JVM được sử dụng không?
- 6. Zend_Form_Element: thêm lớp nếu nó có lỗi
- 7. Chỉ mkdir nếu nó không tồn tại
- 8. Có thể sử dụng biến công khai trong C# nếu nó là chỉ đọc không?
- 9. Java không có JVM
- 10. Tải một tệp EXE và chạy nó từ bộ nhớ
- 11. Java - Tạo một Lớp từ một Tệp Jar
- 12. Mẫu C++ có sử dụng bộ nhớ nếu nó không bao giờ được tham chiếu không?
- 13. Nếu tôi sử dụng lớp sql groovy trong grails, nó có sử dụng kết nối grails pooling không?
- 14. Tại sao không có lớp java.lang.Array? Nếu một mảng java là một đối tượng, nó không nên mở rộng Object?
- 15. Cách sử dụng các lớp từ tệp .jar?
- 16. Tải các lớp động từ jar
- 17. Lớp Java có được khởi tạo bởi chuỗi sử dụng nó lần đầu tiên không?
- 18. Tôi có thể lấy một đối tượng python từ địa chỉ bộ nhớ của nó không?
- 19. Xóa hoặc ẩn một div nếu nó trống rỗng
- 20. Có an toàn cho Request.IsLocal hoặc nó có thể bị giả mạo không?
- 21. Chọn yếu tố trừ khi nó có một tổ tiên của một lớp được sử dụng chỉ là một selector
- 22. JVM OpenJDK có giống JVM Java Java SE không?
- 23. Có hibernate sử dụng jdbc nội bộ hoặc JTA nội bộ hoặc nó có thể cấu hình? "
- 24. Có an toàn để "upcast" một con trỏ phương pháp và sử dụng nó với con trỏ lớp cơ sở?
- 25. Trình duyệt có lưu vào bộ nhớ cache hình nền CSS nếu nó không được sử dụng không?
- 26. Chuỗi chủ đề random_shuffle có an toàn không? và sử dụng rand_r nếu nó không phải là
- 27. Nếu lớp của tôi triển khai Serializable, tôi có phải triển khai nó trong các lớp con của nó không?
- 28. Khi nào tệp JVM giải nén tệp jar của Java?
- 29. Tạo một cookie nếu (và chỉ nếu) nó không tồn tại
- 30. Là một thùng rác đối tượng nếu nó chỉ được tham chiếu từ rác thải?