2013-05-08 43 views
24

Tôi đang thực sự gặp khó khăn để hiểu những điều sau đâyviệc sử dụng các JVM là gì nếu JIT là thực hiện bytecode chuyển đổi thành các lệnh máy

Trước đây tôi biết:

Khi một chương trình Java được biên dịch .class tập tin sẽ được tạo . Trong mã đó là ở dạng byte. Sau đó, JVM sẽ dịch mã byte đó thành định dạng máy có thể hiểu được.

Bây giờ tôi nhìn thấy trong one of the questions in SO

Một Just-In-Time (JIT) biên dịch là một tính năng của dịch thời gian chạy , thay vì giải thích bytecode mỗi khi một phương pháp được gọi, sẽ biên dịch bytecode vào mã máy hướng dẫn của máy chạy

Vì vậy, tại đây JIT đang chuyển đổi bytecode thành hướng dẫn máy. Sau đó, việc sử dụng JVM là gì. Chúng tôi có thể làm điều này với JIT. Trong kiến ​​thức của tôi JIT là chỉ cải thiện hiệu suất của JVM.

Thanks in advance ..

Trả lời

2

Để được rõ ràng:

JVM thực hiện tất cả mọi thứ như:

Nó sẽ nằm trên đỉnh của hệ điều hành và cung cấp trừu tượng giữa chương trình java biên soạn và hệ điều hành. Bằng cách này, java chương trình được biên soạn không phải lo lắng về nền tảng nào mà nó có để làm việc với công việc . Chương trình Java biên dịch mã thành các mã bytecode mà JVM có thể hiểu và thực thi.

JIT

Khi JVM biên dịch các tập tin lớp, nó không hoàn toàn lớp tập tin; nó chỉ biên dịch một phần của nó khi cần. Điều này tránh việc phân tích cú pháp mã nguồn hoàn chỉnh . Loại biên dịch này được gọi là JIT hoặc biên dịch Just-In-Time. JVM là nền tảng thế hệ Mã (OS) phụ thuộc JIT là nền tảng định hướng, tạo ra mã byte mẹ đẻ, vì vậy nó là nhanh hơn một hơn JVM :)

+0

Nhưng tôi thấy câu lệnh JIT biên dịch toàn bộ tệp lớp một lần.Nhưng trong câu lệnh jvm đang thực hiện biên dịch.Xin giải thích – Anusha

+0

@Anusha yah ... JVM thực hiện phần biên dịch [từng dòng] một trình thông dịch gốc cho java..but JIT là một tùy chọn, nó cũng biên dịch, không phải mọi thứ chỉ là một phương thức/chức năng cần thiết. Đối với trường hợp xem xét: Trình biên dịch JIT không kiểm tra các điều kiện biên Java như con trỏ Null hoặc mảng ngoài giới hạn ngoại lệ. Cách duy nhất trình biên dịch JIT biết nó có một ngoại lệ con trỏ null là bởi một tín hiệu được nâng lên bởi hệ điều hành. –

+0

Điều này chỉ là sai. Trình biên dịch Java javac phân tích cú pháp mã nguồn Java và biên dịch nó sang mã Java bytecode (máy độc lập), các tệp .class của bạn. Trình biên dịch JIT biên dịch bytecode thành mã máy riêng (đặc trưng cho CPU). Mã máy đầu ra JIT vẫn thực hiện kiểm tra giới hạn và xử lý ngoại lệ Java. – arjunyg

1

Nó biên dịch nó chỉ trong thời gian cho JVM với tối ưu hóa.

21

JIT chỉ là một phần của JVM. Các phần khác bao gồm thông dịch viên bytecode, xác minh tải lớp và các cơ chế liên kết, và mã nguồn gốc hỗ trợ cho các công cụ như phản chiếu, I/O và vân vân.

Theo nghĩa đó, JIT không làm cho JVM chạy nhanh hơn chút nào. Thay vào đó, mã này làm cho Mã Java chạy nhanh hơn ... nếu như JVM chỉ giải thích nó.

Thực tế, JVM không bắt đầu giải thích bytecode.Sau một khoảng thời gian, JVM sau đó sử dụng trình biên dịch JIT của nó để biên dịch các phương thức được sử dụng nhiều thành mã gốc, sử dụng các số liệu thống kê được thu thập trong khi diễn giải để điều chỉnh mã cho vấn đề trong tầm tay.

Bằng cách này, phần này của văn bản mà bạn trích dẫn là vụng về và về mặt kỹ thuật không chính xác:

Một Just-In-Time (JIT) biên dịch là một tính năng của dịch thời gian chạy ... (context)

Trên thực tế, JIT không phải là tính năng của thông dịch viên. Thay vào đó, JIT là chức năng của JVM mà hoạt động cùng với thông dịch viên.

0

Máy ảo Java (JVM) cung cấp toàn bộ môi trường để chạy chương trình Java. Nó tích hợp với hệ điều hành, tải các lớp và chạy các chương trình. Trình biên dịch Just-In-Time (JIT) chỉ là một phần nhỏ có thể bị vô hiệu hóa (-Xint) nhưng khi được kích hoạt, sẽ cung cấp một cải tiến hữu ích về hiệu năng. Đã có các triển khai của JVM không bao gồm JIT và các triển khai thực hiện bằng cách biên dịch trước Java thành mã máy giống như các ngôn ngữ truyền thống, chẳng hạn như C hoặc C++.