2011-10-21 43 views
14

Trong một bài giảng về JIT trong Hotspot, tôi muốn đưa ra càng nhiều ví dụ càng tốt về các tối ưu hóa cụ thể mà JIT thực hiện.Tối ưu hóa điểm nóng JIT

Tôi biết chỉ là "phương pháp nội tuyến", nhưng sẽ có nhiều hơn nữa. Hãy bỏ phiếu cho mỗi ví dụ.

Trả lời

13

Vâng, bạn nên quét các bài viết của Brian Goetz để biết ví dụ.

Tóm lại, HotSpot có thể và sẽ:

  1. phương pháp Inline
  2. Tham gia liền kề synchronized khối trên cùng một đối tượng
  3. Loại bỏ ổ khóa nếu màn hình là không thể truy cập từ các chủ đề khác
  4. Loại bỏ mã chết (do đó hầu hết các điểm chuẩn vi mô là vô nghĩa)
  5. Giảm bộ nhớ viết cho không volatile biến
  6. Thay thế các cuộc gọi giao diện với phương pháp trực tiếp gọi cho các phương pháp chỉ thực hiện một lần

vân vân

2

Nhảy tới mã máy gốc tương đương thay vì giải thích JVM về mã op. Việc thiếu một nhu cầu để mô phỏng một máy (JVM) trong mã máy cho một phần được sử dụng rất nhiều của một ứng dụng Java (tương đương với một phần mở rộng của JVM) cung cấp một sự gia tăng tốc độ tốt.

Tất nhiên, đó là hầu hết những gì HotSpot là.

4

Có tổng quan cũ nhưng có khả năng vẫn hợp lệ trong this article.

Các điểm nổi bật dường như được thực hiện tối ưu hóa cổ điển dựa trên có sẵn thông tin profiling runtime:

  • JITting "điểm nóng" vào mã nguồn gốc
  • thích ứng nội tuyến - nội tuyến phổ biến nhất được gọi là hiện thực cho một phương pháp công văn cho để tránh một kích thước mã rất lớn

Và một số thứ nhỏ như GC thế hệ giúp phân bổ các đối tượng sống ngắn hơn và nhiều tối ưu hóa nhỏ hơn khác, cùng với bất kỳ điều gì khác là quảng cáo trừ khi bài viết đó được xuất bản.

Ngoài ra còn có chi tiết hơn official whitepaperHotSpot Internals wiki page khá nitty-gritty liệt kê cách viết mã Java nhanh cho phép bạn ngoại suy những trường hợp sử dụng nào được tối ưu hóa.

10

Có một bài thuyết trình tuyệt vời về tối ưu hóa sử dụng bởi JVM hiện đại trên trang web Jikes RVM: ACACES’06 - Dynamic Compilation and Adaptive Optimization in Virtual Machines

Nó thảo luận về kiến ​​trúc, cân bằng, đo lường và kỹ thuật. Và đặt tên cho ít nhất 20 thứ mà JVM làm để tối ưu hóa mã máy.

+0

Tuyệt vời! Cảm ơn và +1. – alf

+4

Có vẻ như đã chết, hãy thử http://www.complang.tuwien.ac.at/andi/ACACES06.pdf – user60561

7

Tôi nghĩ rằng những thứ thú vị là những thứ mà một trình biên dịch thông thường không thể làm trái với JIT. Phương thức nội tuyến, loại bỏ mã chết, CSE, phân tích trực tiếp, v.v.tất cả đều được thực hiện bởi trình biên dịch C++ trung bình của bạn, không có gì "đặc biệt" ở đây

Nhưng tối ưu hóa điều gì đó dựa trên các giả định lạc quan và sau đó khử kích thước sau này nếu chúng bị sai? (giả định một kiểu cụ thể, loại bỏ các nhánh sẽ thất bại sau này nếu không được thực hiện, ..) Loại bỏ các cuộc gọi ảo nếu chúng ta có thể đảm bảo rằng chỉ tồn tại một lớp vào lúc này (một lần nữa nó chỉ hoạt động hiệu quả với việc khử hiện tượng)? Tối ưu hóa thích nghi là tôi nghĩ rằng một điều thực sự phân biệt JIT từ chạy trình biên dịch mill C++ của bạn.

Cũng có thể đề cập đến hồ sơ thời gian chạy được thực hiện bởi JIT để phân tích tối ưu hóa nào cần áp dụng (không phải duy nhất nữa với tất cả tối ưu hóa hướng dẫn theo cấu hình).