2015-09-10 4 views
13

java में -XX:MaxInlineLevel (9 के डिफ़ॉल्ट मान के साथ) एक तर्क है जो अधिकतम संख्या में नेस्टेड कॉल को इनलाइन में नियंत्रित करता है। ऐसी कोई सीमा क्यों है? जेवीएम के लिए पर्याप्त आवृत्ति और कोड आकार के आधार पर सामान्य हेरिस्टिक क्यों नहीं हैं, यह तय करने के लिए कि इनलाइन कितनी गहराई से है?जेवीएम में अधिकतम इनलाइन गहराई क्यों है?

(इस JitWatch से प्रेरित है मुझे दिखा रहा है कि एक गहरा नेस्ट अमरूद checkArgument कॉल गहराई के कारण inlined नहीं किया जा रहा था)

+0

बिल्कुल निश्चित नहीं है लेकिन शायद आपसी रिकर्सन जाल से बचने के लिए जो अन्य तरीकों से बचाव के लिए मुश्किल/महंगा हो सकता है। – OldCurmudgeon

+1

@ ओल्डकुरमुडियन लेकिन फिर आपके पास मैक्स रेकर्सइवइनलाइन लेवल – MrSimpleMind

+0

@MrSimpleMind - दिलचस्प है - इसलिए मैं स्पष्ट रूप से गलत हूं। कुछ अन्य कारण होना चाहिए। – OldCurmudgeon

उत्तर

10

कुछ महत्वपूर्ण खोज का खुलासा इस दिलचस्प थोड़ा fragment (मैं वास्तव में जहाँ तक पेज के रूप में मिला गूगल खोज के):

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

कौन सा सुझाव है कि MaxInlineLevel आप कितना गहरा जाने से पहले आप इनलाइनिंग को रोकने के लिए एक हार्ड सीमा के रूप में उम्मीद है। यह भी सुझाव देता है कि MaxRecursiveInlineLevel केवल रिकर्सिव कॉल करने के लिए संदर्भित करता है, म्यूटल रिकर्सिव कॉल जैसे foo() कॉल bar() पर कॉल करता है जो foo() पर कॉल करता है।

तो मुझे लगता है मैं मेरा अनुमान है टिप्पणी में सही था - MaxInlineLevel के खिलाफ आपसी प्रत्यावर्तन की रक्षा के लिए है क्योंकि पता लगाने के लिए कि आप इनलाइन किए जाने वाले कॉल स्टैक से भरा गहराई के लिए संदर्भ रखने की जरूरत होती है।

MaxInlineResursionLevel नियंत्रण foo() कॉल foo() इनलाइनिंग।

ध्यान दें कि संदर्भित कोड वास्तविक JVM नहीं हो सकता है।

@apangin द्वारा टिप्पणियां ओपन जेडीके 8 से हॉटस्पॉट का एक और आधुनिक संस्करण ढूंढती है, यह सुझाव देती है कि आजकल यह उतना आसान नहीं है। ऐसा लगता है कि पूर्ण स्टैक रिकर्सिव कॉल के लिए खोजा जाता है, इसलिए पारस्परिक रिकर्सन को अब MaxRecursiveInlineLevel पर जाने से अवरुद्ध किया जा सकता है।

+3

आप बहुत पुराने स्रोतों को देखते हैं। सही जगह [hg.openjdk.java.net] पर है (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/)। 'MaxRecursiveInlineLevel' दोनों [प्रत्यक्ष और अप्रत्यक्ष] की गणना करता है (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l389) रिकर्सिव कॉल। – apangin

+0

@apangin - ऐसा लगता है कि टिप्पणी क्या कह रही है। इसके अलावा यह केवल 'MaxRecursiveInlineLevel' के खिलाफ तुलना कर रहा है। हालांकि अच्छा खोज। – OldCurmudgeon

+3

गहरा खोदना। [लूप] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l401) कैली विधि को देखकर सभी फ़्रेम के माध्यम से चलता है ढेर पर कहीं भी प्रस्तुत करता है। [मैक्सइनलाइन लेवल] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l380) अब इनलाइन ट्री कन्स्ट्रक्टर में सेट है। – apangin

संबंधित मुद्दे