Frage

Ich habe viele Anwendungen gesehen, die Geräteklassen nehmen und nehmen -javaagent als param beim Laden auch eine -noverify an die Befehlszeile setzen.

Das Java-doc sagt, dass -noverify schaltet sich aus Klassenprüfung.

Doch warum sollte jemand Überprüfung auszuschalten, auch wenn sie Klassen instrumentieren?

War es hilfreich?

Lösung

Start-up-Zeit, würde ich sagen. Überprüfung, die Klassen korrekt sind dauert einige Zeit, wenn die Klasse geladen wird. Da Klassen könnten in einer faulen Art und Weise (nicht auf App starten, aber wenn zum ersten Mal verwendet wird) geladen werden, könnte dies unerwartete und unerwünschte Laufzeitverzögerungen führen.

Eigentlich ist die Klasse nicht generell überprüft werden müssen. Der Compiler wird keine ungültige Bytecode oder Klassenkonstrukt emittiert. Der Grund für die Überprüfung ist, dass die Klasse auf einem System gebaut werden kann, online gehostet erhalten und werden Sie durch das ungeschützte Internet übertragen. Auf diesem Weg könnte ein böswilliger Angreifer den Bytecode ändern und erstellen Sie etwas der Compiler niemals schaffen könnte; etwas, das die JVM abstürzen kann oder möglicherweise umgeht Sicherheitseinschränkungen. So wird die Klasse überprüft, bevor sie verwendet wird. Wenn dies eine lokale Anwendung ist, gibt es in der Regel keine Notwendigkeit, wieder den Bytecode zu überprüfen.

Andere Tipps

Wenn es in Verbindung mit -javaagent verwendet wird, ist es sehr wahrscheinlich, nicht aus Leistungsgründen, sondern weil der Agent erzeugt absichtlich "ungültig" Bytecode.

Es sollte beachtet werden, dass ungültige Bytecode noch gut ausführen könnten, weil einige der Prüfungsregeln sehr streng sind. Zum Beispiel this darf nicht in einem Konstruktor zugegriffen werden, bevor das Super-Konstruktor aufgerufen wurde, weil die Variablen an dieser Stelle nicht initialisiert werden. Aber es könnte noch andere Dinge, die Sie (siehe JRebel Beispiel) tun wollen. Dann verwenden Sie -noverify diese Regel zu umgehen.

Debugging! In der Tat ist das, was ich jetzt tue, und wie ich auf diese Frage gestolpert. Bei Terracotta tun wir eine Menge Bytecode Instrumentierung, und manchmal hilft es, die Prüfer zu deaktivieren, da wir unsere Klasse Adapter debuggen, so können wir sehen, wo genau sie zur Laufzeit fehlschlagen.

Sie haben Recht, wir wollen die Prüfer auf in der Produktion zu bleiben.

Mit JRebel ohne -noverify wird diese Warnung beim Start geben:

  

JRebel: '-noverify' fehlt, Ändern / Hinzufügen / Entfernen von Konstrukteuren wird nicht aktiviert

!

So scheint, dass -noverify ermöglicht Bytecode Wiederbesetzung einige Dinge zu tun, die sonst nicht möglich wären.

Starten Sie Zeit verwendet, um ein bisschen ein Problem zu sein. Allerdings Verifizierer sind jetzt schneller, als Prozessoren sind. Code mit JDK6 Javac wird standardmäßig zusammengestellt ist unter anderem zusätzliche Informationen, um den Verifizierer Schritt schneller zu machen. Apache Harmony nur verwendet einen viel schnelleren Verifizieralgorithmus.

Einige sehr alte Versionen von javac erzeugen falsche Bytecode. Ja auch noch die Sonne PlugIn enthält Fix-Up-Code einiger gebrochenen Klassendateien überprüfen zu lassen.

Der neue Prüfer, die in JAVA 6 eingeführt wird, ist sehr kompliziert für die Code-Manipulationen zu verarbeiten.

Werfen Sie einen Blick auf diese: http: // chrononsystems .com / blog / java-7-Design-Fehler-Leitungen zu riesigen-rückwärts-Schritt-for-the-jvm

und der damit verbundene Fehlerbericht: http://bugs.sun.com/view_bug.do?bug_id=8009595

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top