Domanda

La JVM (in particolare il HotSpot VM) è famosa per avere un numero enorme di esso può applicare in fase di esecuzione ottimizzazioni.

C'è un modo di guardare ad un certo pezzo di codice e vedere quello che la JVM ha effettivamente fatto?

È stato utile?

Soluzione

Un problema è che "ciò che JVM ha effettivamente fatto ad esso" modifiche tra invocazioni come la JVM è libero di codice di ri-generare.

Per fare un esempio ho studiato qualche giorno fa che cosa Hotspot fa con metodi final rispetto ai metodi virtuali. A giudicare dalle microbenchmarks, le mie conclusioni sono state:

  • Client JVM: se il metodo è efficace final (non v'è alcuna classe caricato che prevale su di esso), la JVM utilizza una chiamata non virtuale. In seguito, se si carica una classe che ignora questo metodo, la JVM cambierà il codice JIT'ed per effettuare le chiamate virtuale. Quindi, dichiarando come finalhas rilevanza non significativa.

  • Server JVM: Qui final sembra non avere rilevanza sia. Ciò che sembra accadere è che la JVM genera una chiamata non virtuale per qualsiasi classe che si sta utilizzando la prima volta , indipendentemente da ciò che le classi vengono caricati. In seguito, se si effettua una chiamata da un oggetto di un'altra classe, la JVM rattoppare tutte le chiamate con qualcosa di simile a questo (immagino che sarà anche il profilo chiamate in modo che possa cambiare velocemente percorso e slow-percorso, se non ha ottenuto bene la prima volta):

    if (object instanceof ClassOfNonVirtualCall) {
        do non-virtual call to ClassOfNonVirtualCall.method
    } else {
        do virtual call to object.method
    }

Se siete veramente interessati a vedere codice generato, si può giocare con il debug JVM da OpenJDK:

http://dlc.sun.com.edgesuite.net /jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly

Altri suggerimenti

Questa è altamente JVM specifica, e sarà molto probabilmente bisogno di fare un po 'seria indagine in particolare JVM si sta guardando.

È possibile vedere le opzioni HotSpot VM disponibili qui http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

La seguente è una risorsa molto buona:

http://wikis.sun.com/display/HotSpotInternals/Home

Di particolare interesse sono lo "strumento LogCompilation" e "Panoramica LogCompilation" link (collegamenti non possono posta diretti come ho appena registrato).

Ecco una buona pagina sulla HotSpot ottimizzazioni . Alcune delle ottimizzazioni può essere visto guardando il bytecode emessa dal compilatore. Altre ottimizzazioni sono dinamici ed esistono solo in fase di esecuzione. Ad esempio, HotSpot può fare sostituzione in pila che modifica la pila direttamente durante l'esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top