2016-10-29 3 views
1

Iam mit Blick auf JVM Absturz cosistently während hotdeploy ermöglicht (unter Java-Einstellungen für die Ingangsetzung JAVA_OPTS -Xmx4096m -XX: MetaspaceSize = 512m -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath = crash - XX: ThreadStackSize = 512 -XX: + UseConcMarkSweepGC -XX: ParallelGCThreads = 5 -XX: NewRatio = 2 -XX: + UnlockDiagnosticVMOptions -XX: -UseLoopPredicate -Xdebug -Xrunjdwp: Transport = dt_socket, Adresse = $ DEBUG_PORT, Server = y, suspendieren = n -XX: NewRatio = 2 -Dspringloaded.synchronize = true JAVA_OPTS = `echo $ JAVA_OPTS -Dspringloaded.synchronize = true -javaagent: gefederte-1.2.1.jar -noverify )JVM Absturz Problematische Rahmen: Canonicalizer :: do_If

Umwelt: JDK 1.8 U 66, RHEL 6,7

 

    # 
    # A fatal error has been detected by the Java Runtime Environment: 
    # 
    # SIGSEGV (0xb) at pc=0x00007faee9a1e27c, pid=27208, tid=140379827795712 
    # 
    # JRE version: Java(TM) SE Runtime Environment (8.0_66-b17) (build 1.8.0_66-b17) 
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.66-b17 mixed mode linux-amd64) 
    # Problematic frame: 
    # V [libjvm.so+0x35027c] Canonicalizer::do_If(If*)+0x1c 
    # 
    # Core dump written. Default location: core.27208 
    # 
    # An error report file with more information is saved as: 
    # hs_err_pid27208.log 
    # [ timer expired, abort... ] 

Antwort

2

Ich habe sowohl -javaagent als auch -noverify in der Java-Optionsliste bemerkt.

Es sieht aus wie springloaded Agent generiert ungültigen Bytecode, während die Bytecodeverifizierung explizit deaktiviert ist. Keine Überraschung, dies kann zu unvorhersehbaren Ergebnissen einschließlich JVM-Absturz führen.

Dies ist kein JVM-Problem, aber höchstwahrscheinlich ein Fehler in springloaded Agent. Versuchen Sie, die Option -noverify zu entfernen.

-XX:-TieredCompilation möglicherweise auch dieses spezielle Problem umgehen, aber nicht erwarten, dass die Anwendung ordnungsgemäß funktioniert, wenn der Bytecode die Überprüfung nicht besteht. Es ist besser, sich von den fehlerhaften Agentenbibliotheken fernzuhalten.

+0

Danke für die schnelle Antwort, wenn ich Byte-Code-Verifier aktivieren gibt es mehrere Probleme, gibt es andere Arbeit für jetzt. – sailukar

+0

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

+0

@ 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

0

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

Source

0

mit @apangin Einverstanden, Sie im Programm-Bytecode Intrumentation tun (-agent), sondern gibt -noverify. Wenn die Verifizierung deaktiviert ist, können solche Abstürze auftreten.

Sie sollten -noverify oder -Xverify: none während der Bytecode-Eingabe nicht verwenden.

Für diejenigen von Ihnen, die mit der Bytecode-Verifizierung nicht vertraut sind, ist es einfach Teil des JVM-Prozesses zum Laden von Klassen, der den Code auf bestimmte gefährliche und verbotene Verhaltensweisen prüft. Sie können diesen Schutz auf vielen JVMs deaktivieren (aber nicht), indem Sie -Xverify: none oder -noverify der Java-Befehlszeile hinzufügen. https://blogs.oracle.com/buck/entry/never_disable_bytecode_verification_in

Verwandte Themen