कुछ महत्वपूर्ण खोज का खुलासा इस दिलचस्प थोड़ा 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
पर जाने से अवरुद्ध किया जा सकता है।
बिल्कुल निश्चित नहीं है लेकिन शायद आपसी रिकर्सन जाल से बचने के लिए जो अन्य तरीकों से बचाव के लिए मुश्किल/महंगा हो सकता है। – OldCurmudgeon
@ ओल्डकुरमुडियन लेकिन फिर आपके पास मैक्स रेकर्सइवइनलाइन लेवल – MrSimpleMind
@MrSimpleMind - दिलचस्प है - इसलिए मैं स्पष्ट रूप से गलत हूं। कुछ अन्य कारण होना चाहिए। – OldCurmudgeon