2015-09-10 16 views
13

, satır içi çağrılar için satır içi çağrı sayısını denetleyen -XX:MaxInlineLevel (varsayılan 9 değeriyle) bağımsız değişkenine sahiptir. Neden böyle bir sınır var? JVM'nin ne kadar derinlemesine karar vermesi için yeterli frekans ve kod büyüklüğüne dayalı olağan buluşsal neden olmasın?JVM neden maksimum bir inline derinliğe sahip?

+0

Hiç kesin değil ama muhtemelen başka yollarla savunmak için zor/pahalı olabilecek karşılıklı yineleme tuzaklarını önlemek için. – OldCurmudgeon

+1

@OldCurmudgeon ama o zaman MaxRecursiveInlineLevel – MrSimpleMind

+0

@MrSimpleMind var - İlginç - Bu yüzden açıkça yanlış. Başka bir sebep olmalı. – OldCurmudgeon

cevap

10

Bazı önemli arama bu ilginç küçük fragment (Aslında kadarıyla sayfası olarak var ortaya çıkarır (bu derin iç içe Guava checkArgument çağrı derinliği nedeniyle inlined değil ki bana gösterilen JitWatch tarafından istenir) ) Google arama: Eğer satır içi uygulaması durdurmak önce gitmek ne kadar derin zor bir sınırı beklendiği gibi MaxInlineLevel olduğunu düşündürmektedir

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

. Ayrıca, MaxRecursiveInlineLevel'un, sadece foo()foo() çağrıları gibi, foo() çağrılarını yapan, doğrudan özyinelemeli çağrılara atıfta bulunduğunu da önerir.

Yani benim tahminim yorumunda haklı olduğunu düşünüyorum - MaxInlineLevel sen inlining çağrı yığını tam derinliği başvurular tutmak ihtiyacı olacağını tespit etmek için, çünkü karşılıklı özyineleme karşı korumaktır.

MaxInlineResursionLevel denetimleri foo() aramalar foo() inlining.

Başvurulan kodun gerçek bir JVM olamayabileceğini unutmayın.

Yorumlar @apangin, açık JDK 8'in sıcak noktasının daha modern bir sürümünü bulur, artık bu kadar basit değil. Tam yığının, özyinelemeli çağrılar için arandığı görülüyor, dolayısıyla karşılıklı geri çekilme şimdi de MaxRecursiveInlineLevel geçmişten engelleniyor olabilir.

+3

Çok eski kaynaklara bakıyorsunuz. Doğru yer [hg.openjdk.java.net] adresindedir (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/). MaxRecursiveInlineLevel, hem doğrudan hem de dolaylı (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l389) özyinelemeli çağrıları sayar. – apangin

+0

@apangin - Bu, yorumun söylediği şeyi yapıyor gibi görünmüyor. Ayrıca sadece 'MaxRecursiveInlineLevel' ile karşılaştırılıyor. İyi bulmak olsa da. – OldCurmudgeon

+3

Daha derine inin. [Döngü] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l401), callee yöntemine bakmak isteyen tüm kareler boyunca yürür Yığın herhangi bir yerinde sunar. [MaxInlineLevel] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c1374141598c/src/share/vm/opto/bytecodeInfo.cpp#l380) artık InlineTree yapıcısında ayarlanmıştır. – apangin

İlgili konular