Problem: Ich habe eine Methode, die zu über 8000 Byte Java Bytecode kompiliert. HotSpot hat eine magische Grenze, die dazu führt, dass der JIT für Methoden, die 8000 Bytes überschreiten, nicht aktiviert wird. (Ja, es ist vernünftig, eine riesige Methode zu haben. Dies ist eine Tokenizer-Schleife.) Die Methode ist in einer Bibliothek und ich möchte nicht, dass Benutzer der Bibliothek HotSpot konfigurieren müssen, um das magische Limit zu deaktivieren.Gibt es einen Java-Bytecode-Optimierer, der nutzlose gotos entfernt?
Bemerkung: Das Dekompilieren des Bytecodes zeigt, dass der Eclipse Java Compiler viele sinnlose GOTOS generiert. (Javac ist noch schlimmer.) Das heißt, es gibt Gotos, die nur von Sprüngen aus erreichbar sind. Offensichtlich sollte der Sprung, der zum Goto springt, stattdessen direkt dorthin springen, wo der Goto springt und der Goto sollte eliminiert werden.
Frage: Gibt es einen Bytecode-Optimierer für Java 5-Klassendateien, der sinnlose Sprungketten abflacht und dann unnötige gotos entfernt?
Edit: Ich meine Muster wie:
8698: goto 8548
8701: goto 0
Offensichtlich kann die zweite gehe nur durch einen Sprung auf 8701, die einen direkten Sprung auf 0
als auch sein könnte, auf einem zweiten erreichbar Untersuchung dieses fragwürdige Muster ist häufiger:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
Wo offensichtlich, möchte man den Compiler den „ungleich“ Vergleich auf „gleich“ -Vergleich umkehren, springt zu 870 4 und beseitigen Sie den goto.
Einige Architekturen haben eine Grenze, wie weit eine relative Verzweigung gehen kann (weil sie die Adresse in einem 8- oder 16-Bit-Register haben), so dass sie oft mit einer relativen Verzweigung zu einer nicht relativen Verzweigung, die die vollständige Verzweigung verwendete Programmzählergröße. Ist die JVM so? –
Meinst du * LABELS * nur von Sprüngen erreichbar? –
Eine Laufzeit Annotation, um einen Hinweis auf die JVM zu geben, wäre in diesem Fall sicher nett zu sein .... aber ich glaube nicht, dass so etwas existiert (und ein schnelles Google macht nichts.) – Jared