4.2.1 Absturz in HotSpot Compiler Thema oder Compiled-Code
Wenn das fatale Fehlerprotokoll zeigt an, dass der Absturz in einem Compiler Thread aufgetreten ist, dann ist es möglich (aber nicht immer der Fall ist) dass Sie einen Compiler-Fehler festgestellt haben. Wenn der Absturz im kompilierten Code ist, ist es möglich, dass der Compiler inkorrekt Code generiert hat.
Bei der HotSpot Client-VM (Option -client) erscheint der Compiler-Thread im Fehlerprotokoll als CompilerThread0. Mit der HotSpot Server VM gibt es mehrere Compiler-Threads und diese erscheinen in der Fehlerprotokolldatei als CompilerThread0, CompilerThread1 und AdapterThread.
Unten ist ein Fragment eines Fehlerprotokolls für einen Compilerfehler, der während der Entwicklung von J2SE 5.0 angetroffen und behoben wurde. Die Protokolldatei zeigt, dass die HotSpot Server-VM verwendet wird und der Absturz in CompilerThread1 aufgetreten ist. Darüber hinaus zeigt die Protokolldatei, dass die aktuelle CompileTask die Kompilierung der Methode java.lang.Thread.setPriority war.
Ein unerwarteter Fehler wurde von HotSpot Virtual Machine erkannt: : Java VM: Java HotSpot (TM) Server VM (1.5-Intern-Debug-Mischmodus): --------------- GEWINDE ---------------
Aktueller Thread (0x001e9350) : JavaThread "CompilerThread1" Daemon [_thread_in_vm, id = 20]
Stack: [0xb2500000,0xb2580000), sp = 0xb257e500, Freiraum = 505K Mutter Rahmen: (J = kompilierten Java-Code, j = interpretiert, Vv = VM-Code, C = nativen Code) V [libjvm.so 0xc3b13c +]:
Current CompileTask: opto: 11 java.lang.Thread.setPriority (I) V (53 Byte)
--------------- PROZESS ---------------
Java-Threads: (=> aktueller Thread) 0x00229930 JavaThread "Niedrig Speicher Detector“Daemon [_thread_blocked, id = 21] => 0x001e9350 JavaThread "CompilerThread1" Daemon [_thread_in_vm, id = 20]:
In diesem Fall gibt es zwei mögliche Lösungen:
The brute force approach: change the configuration so that the application is run with the -client option to specify the HotSpot
-Client VM.
Assume that the bug only occurs during the compilation of the setPriority method and exclude this method from compilation.
Der erste Ansatz (die -client Option verwenden) könnte zu configure in einigen Umgebungen trivial sein. In anderen Fällen ist es möglicherweise schwieriger , wenn die Konfiguration komplex ist oder wenn die Befehlszeile zum Konfigurieren der VM nicht leicht zugänglich ist. Im Allgemeinen wird durch den Wechsel von der HotSpot-Server-VM zur HotSpot-Client-VM auch die Spitzenleistung einer Anwendung reduziert. Abhängig von der Umgebung kann diese akzeptabel sein, bis das eigentliche Problem diagnostiziert und behoben ist.
Der zweite Ansatz (die Methode von der Kompilierung ausschließen) erfordert Erstellen der Datei .hotspot_compiler im Arbeitsverzeichnis der Anwendung. Im Folgenden ist ein Beispiel für diese Datei:
ausschließen java/lang/Thema setPriority
das Format dieser Datei ist im allgemeinen CLASS METHODE ausschließen, wo CLASS die Klasse (Fully Qualified mit dem Paketnamen) und METHODE ist der Name der Methode. Konstruktormethoden werden als angegeben und statische Initialisierer werden als angegeben.
Hinweis - Die Datei .hotspot_compiler ist eine nicht unterstützte Schnittstelle. Es ist dokumentiert hier ausschließlich für die Zwecke der Fehlersuche und finden eine temporäre Problemumgehung.
Sobald die Anwendung neu gestartet wird, wird der Compiler nicht versuchen, kompilieren Sie eine der Methoden als ausgeschlossen in der Datei .hotspot_compiler Datei. In einigen Fällen kann dies vorübergehend Abhilfe schaffen, bis die Wurzel des Absturzes diagnostiziert und der Fehler behoben ist.
Damit die HotSpot VM richtig und die 'hotspot_compiler' Datei verarbeitet befindet, um zu überprüfen, die im obigen Beispiel gezeigt wird, sucht die folgenden Protokollinformationen zur Laufzeit.Beachten Sie, dass der Dateiname Trennzeichen ein Punkt ist, kein Schrägstrich.
kompilieren Ohne Berücksichtigung: java.lang.Thread :: setPriority
Danke für die schnelle Antwort, wenn ich Byte-Code-Verifier aktivieren gibt es mehrere Probleme, gibt es andere Arbeit für jetzt. – sailukar
Wenn Ihr Code unter dem Bytecode Verifier fehlschlägt, dann haben Sie bereits ein Problem. Sie verzögern den Fehler nur, indem Sie ihn deaktivieren. – the8472
@ user3895269 Versuchen Sie '-XX: -TieredCompilation'. Es kann dieses spezielle Problem umgehen, aber erwarten Sie nicht, dass die Anwendung ordnungsgemäß funktioniert, wenn der Bytecode die Überprüfung nicht besteht. Es ist besser, sich von den fehlerhaften Agentenbibliotheken fernzuhalten. – apangin