Problema: ho un metodo che compila su oltre 8000 byte di bytecode Java. HotSpot ha un limite magico che rende il JIT non kick-in per i metodi che superano 8000 byte. (Sì, è ragionevole avere un metodo enorme: si tratta di un ciclo di tokenizer.) Il metodo è in una libreria e non voglio richiedere agli utenti della libreria di configurare HotSpot per disattivare il limite magico.Esiste un ottimizzatore bytecode Java che rimuove i gotos inutili?
Osservazione: la decompilazione del bytecode indica che il compilatore Java di Eclipse genera un gran numero di gotos inutili. (javac è anche peggio.) Cioè, ci sono gotos che sono raggiungibili solo dai salti. Ovviamente, il salto che salta al goto dovrebbe invece saltare direttamente dove il goto salta e il goto dovrebbe essere eliminato.
Domanda: Esiste un ottimizzatore bytecode per i file di classe Java 5 che appiattisce inutili catene di salto e rimuove i gotos non necessari?
Edit: Voglio dire modelli come:
8698: goto 8548
8701: goto 0
Ovviamente, la seconda goto può essere raggiunto solo con un salto a 8701, che potrebbe anche essere un salto diretto a 0.
Su una seconda indagini, questo modello discutibile è più comune:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
dove ovviamente, si vorrebbe il compilatore per invertire il confronto "diverso" a confronto "uguale", saltare a 870 4 ed elimina il goto.
Alcune architetture hanno un limite su quanto può essere lontano un ramo relativo (perché mantengono l'indirizzo in un registro a 8 o 16 bit) così spesso lo hanno aggirato con un ramo relativo a un ramo non relativo che utilizzava il pieno dimensione del contatore del programma. La JVM è così? –
Intendi * ETICHETTE * raggiungibili solo da salti? –
Un'annotazione di runtime per dare un suggerimento alla JVM sarebbe sicuramente bella in questo caso ... ma non credo che esista una cosa del genere (e un google veloce non mostra nulla.) – Jared