2015-09-10 21 views
13

java có đối số -XX:MaxInlineLevel (với giá trị mặc định là 9) kiểm soát số lượng cuộc gọi lồng nhau tối đa trong nội tuyến. Tại sao lại có giới hạn như vậy? Tại sao không phải là các chẩn đoán thông thường dựa trên tần suất và kích thước mã đủ để JVM tự quyết định mức độ nội tuyến sâu sắc như thế nào?Tại sao JVM có chiều sâu nội dòng tối đa?

(điều này được thúc đẩy bởi JitWatch thấy tôi rằng một lồng sâu Ổi checkArgument cuộc gọi không được inlined do chiều sâu)

+0

Không nhất thiết phải chắc chắn nhưng có lẽ để tránh bẫy đệ quy lẫn nhau có thể khó khăn/tốn kém để phòng thủ theo những cách khác. – OldCurmudgeon

+1

@OldCurmudgeon nhưng sau đó bạn có MaxRecursiveInlineLevel – MrSimpleMind

+0

@MrSimpleMind - Thú vị - do đó tôi rõ ràng là sai. Phải là một lý do khác. – OldCurmudgeon

Trả lời

10

Một số tìm kiếm ý nghĩa phát hiện ra này thú vị chút fragment (Tôi thực sự đã như xa như trang của việc tìm kiếm của Google):

if (inline_depth() > MaxInlineLevel) { 
     return "inlining too deep"; 
    } 
    if (method() == callee_method 
      && inline_depth() > MaxRecursiveInlineLevel) { 
     return "recursively inlining too deep"; 
    } 

những gợi ý rằng MaxInlineLevel là như mong đợi một giới hạn cứng để cách sâu bạn đi trước khi bạn ngừng nội tuyến. Nó cũng cho thấy rằng MaxRecursiveInlineLevel chỉ đề cập đến các cuộc gọi đệ quy trực tiếp, chứ không phải các cuộc gọi đệ quy đột biến chẳng hạn như foo() gọi bar() gọi foo().

Vì vậy, tôi nghĩ rằng tôi đã đúng trong nhận xét đoán của tôi - MaxInlineLevel là để bảo vệ chống lại lẫn nhau đệ quy vì để phát hiện ra rằng bạn sẽ cần phải giữ tham chiếu đến chiều sâu đầy đủ của ngăn xếp cuộc gọi nội tuyến.

MaxInlineResursionLevel điều khiển foo() gọi foo() nội tuyến.

Lưu ý rằng mã được tham chiếu có thể không phải là JVM thực.

Nhận xét của @apangin đặt phiên bản hiện đại hơn của điểm phát sóng từ Open JDK 8 cho thấy rằng hiện nay không còn đơn giản như vậy nữa. Dường như ngăn xếp đầy đủ được tìm kiếm cho các cuộc gọi đệ quy để đệ quy lẫn nhau bây giờ có thể bị chặn đi quá MaxRecursiveInlineLevel.

+3

Bạn nhìn vào các nguồn rất cũ. Địa điểm phù hợp là tại [hg.openjdk.java.net] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/). 'MaxRecursiveInlineLevel' đếm cả [trực tiếp và gián tiếp] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l389) các cuộc gọi đệ quy. – apangin

+0

@apangin - Điều đó dường như không làm những gì bình luận nói. Nó cũng chỉ so sánh với 'MaxRecursiveInlineLevel'. Tốt tìm thấy mặc dù. – OldCurmudgeon

+3

Đào sâu hơn. [Vòng lặp] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l401) đi qua tất cả các khung nhìn nếu phương pháp callee trình bày bất cứ nơi nào trên ngăn xếp. [MaxInlineLevel] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l380) hiện được đặt trong hàm tạo InlineTree. – apangin

Các vấn đề liên quan