Dieser Artikel ist der Artikel zum 10. Tag von "Java EE Adventskalender 2016". Tag 9 (vorheriger Tag): @megascus "[Java EE-Webanwendungen modulieren und kombinieren](http://d.hatena.ne.jp/megascus/ 20161209/1481252793) " Tag 11 (morgen): @yyYank
Es ist anderthalb Jahre her, seit ich Java EE gestartet habe. Ich hatte die Gelegenheit, die Leistungsoptimierung von Glassfish während der Entwicklung zu untersuchen, daher werde ich zusammenfassen, was ich damals untersucht habe.
Glassfish (und andere Anwendungsserver) ist standardmäßig "entwicklungsoptimiert". In Bezug auf die automatische Bereitstellungsfunktion, das dynamische Neuladen und die JVM geben wir dem schnelleren ** "Start" ** Vorrang vor dem schnelleren ** "Ausführen" **. Während diese Funktionen während der Entwicklungsphase sehr nützlich sind, können sie während der Produktionsphase einen Leistungsengpass darstellen.
Es ist wichtig zu wissen, wie Glassfish optimiert wird, um einen besseren Service zu bieten und um Ihre Einstellungen für Ihre Produktionsumgebung zu optimieren.
Dieses Mal werde ich die grundlegende Leistungsoptimierung von Glassfish erläutern.
** Hinweis: Die Optimierung während der Entwicklung wird nicht empfohlen und macht keinen Sinn. Die Entwicklung wird sich verlangsamen. ** ** **
Die umgebungsabhängigen Parameter sind wie folgt definiert.
Pfad | Bedeutung |
---|---|
<glassfish> | Pfad, auf dem Glassfish installiert ist |
<domain-name> | Zu optimierender Domainname |
Auch, wenn Sie der Einstellungsdatei Einstellungen hinzufügen möchten
hinzufügen
<!--Zusätzliche Einstellungen-->
Wenn Sie die Einstellungen ändern möchten
Vorher ändern
<!--Einstellungen vor Änderung-->
Nach der veränderung
<!--Einstellungen nach Änderung-->
Es wird vertreten durch.
Es gibt drei Hauptarten der Abstimmung.
** 1. JVM-Tuning ** ist die Idee von "Lasst uns die Leute beschleunigen, die Glassfish überhaupt betreiben". Es kann auf andere Java-Programme angewendet werden. ** 2. Glassfish Tuning ** optimiert buchstäblich die Einstellungen von Glassfish selbst, um es zu beschleunigen. ** 3. Programmoptimierung ** dient zur Optimierung des von Glassfish auszuführenden Programms. Wir werden versuchen, die Arbeit zu beschleunigen, indem wir speichereffizienteren Code und Techniken voll ausnutzen. In diesem Artikel nicht behandelt.
Lassen Sie uns zunächst über die Optimierung der JVM nachdenken.
Starten Sie nach dem Einstellen die Zieldomäne neu.
Die JVM-Einstellungen beim Starten von Glassfish werden in der Datei "
domain.xml
<java-config ...>
<jvm-options>..</jvm-options>
<jvm-options>..</jvm-options>
<jvm-options>..</jvm-options>
</java-config>
Ich denke, es gibt einen Teil. Dies ist die Option, die beim Start von Glassfish an die JVM übergeben wird.
Vorher ändern
<jvm-options>-client</jvm-options>
Nach der veränderung
<jvm-options>-server</jvm-options>
Im Folgenden finden Sie den Unterschied zwischen Servermodus und Clientmodus. Referenz - Reale Unterschiede zwischen "Java-Server" und "Java-Client"?
hinzufügen
<jvm-options>-verbose:gc</jvm-options> <!--Aktivieren Sie die GC-Protokollierung-->
<jvm-options>-XX:+PrintGCDetails</jvm-options> <!--Detailliertere Ausgabe-->
<jvm-options>-Xloggc:/path/to/logfile.log</jvm-options> <!--Ausgabe in Datei-->
Bitte setzen Sie das Protokollausgabeziel auf \
Wenn Sie detailliertere Informationen zu GC erhalten möchten, lesen Sie bitte die folgenden Informationen. Ergänzung - Eine Zusammenfassung der GC-Optionen von Java.
hinzufügen
<jvm-options>-XX:+DisableExplicitGC</jvm-options>
Die Nachteile der manuellen Ausführung von System # gc () finden Sie unter der folgenden URL. Referenzverteilung von WebSphere: Teil 5 "Running System # gc ()"
Vorher ändern
<jvm-options>-Xmx512m</jvm-options>
Standardmäßig ist die Zuweisung von 512 MB festgelegt. Wie viel Speicher zugewiesen wird, wird durch Auslastungstest und Speicherbereinigungsprotokoll optimiert. Wenn Sie sich jedoch nicht sicher sind, setzen Sie den Wert auf "Vorerst bis zu diesem Punkt zulassen". Wenn es kein Problem gibt, stellen Sie es auf "2 GB".
Nach der veränderung
<jvm-options>-Xms2048m</jvm-options>
<jvm-options>-Xmx2048m</jvm-options>
"-Xms" steht für den Anfangswert und "-Xmx" für den Maximalwert. Es wird jedoch empfohlen, diese abzugleichen. Wenn der Anfangswert und der Maximalwert nicht übereinstimmen, erfolgt eine unnötige Zuordnungsverarbeitung. Wenn es kein besonderes Problem gibt, lassen Sie uns übereinstimmen. Ich werde unten eine detailliertere Referenz-URL für die Speicheroptimierung veröffentlichen. Wenn Sie interessiert sind, lesen Sie es bitte und fügen Sie die entsprechenden Einstellungen hinzu. Referenz-JVM-Optimierung
Es ist möglich, dass der Heap-Bereich aufgrund häufiger GC erweitert wurde, das Problem ist jedoch nicht behoben. Beachten Sie, dass dies möglicherweise ein Problem mit dem Programm der Anwendung ist, die Sie ausführen. Siehe unten für Details Ergänzung --- 9. Durch Erhöhen der Heap-Größe wird das Speicherproblem behoben
Wenn Sie tiefer in die Abstimmung der JVM eintauchen, gibt es kein Ende, also werde ich es hier beenden. Wenn Sie interessiert sind, überprüfen Sie es bitte.
Wir werden Honmaru und Glassfish stimmen. Sie können die Einstellungen über die Verwaltungskonsole ändern (localhost: 4848). Wir empfehlen jedoch, einen Befehl zu verwenden, mit dem Sie die Prozesse als Skript organisieren können. Wenn Sie es als Skript speichern, müssen Sie die Einstellungen nicht jedes Mal ändern, wenn Sie den Server einrichten.
Im Folgenden verwenden wir den Befehl "asadmin", der sich in "
$ ./asadmin set server.admin-service.das-config.autodeploy-enabled=false`
Es ist eine praktische Funktion zur automatischen Bereitstellung, die jedoch während der Produktionsphase nicht benötigt wird. Schalten Sie sie daher aus.
$ ./asadmin set server.admin-service.das-config.dynamic-reload-enabled=false
Das dynamische Neuladen ist eine Funktion, die Änderungen in der Anwendung automatisch widerspiegelt, ohne den Server neu zu starten. Es ist sehr praktisch, aber wenn es aktiviert ist, sucht Glassfish in regelmäßigen Abständen nach Änderungen. Schalten Sie es aus, um die Leistung zu verbessern. Standardmäßig wird die Überprüfung alle 2 Sekunden durchgeführt. Wenn Sie es nicht ausschalten möchten, aber einen Leistungsgewinn erzielen möchten, stellen Sie dieses Intervall länger ein.
Beim Ändern des Intervalls auf 1 Minute
$ ./asadmin set server.admin-service.das-config.dynamic-reload-poll-interval-in-seconds=60
$ ./asadmin set server.admin-service.das-config.autodeploy-jsp-precompilation-enabled=true
Verbessern Sie die Leistung, indem Sie JSP (Java Server Pages) vorkompilieren.
$ ./asadmin set-log-levels <logger-name>=WARNING
Das Exportieren einer großen Anzahl von Protokollen führt zu einer schlechten Leistung.
Grundsätzlich reicht es in der Produktionsphase aus, Protokolle mit der Stufe WARNING oder höher zu haben. Wenn also kein Problem vorliegt, setzen wir die Protokollstufe des Loggers auf WARNING.
(Sie können Logger und ihre Protokollstufen mit dem Befehl ./asadmin list-log-Ebenen
auflisten.)
** Achtung: Es ist sicher, viele Protokolle auszuspucken, wenn das System nicht stabil ist, z. B. zu Beginn des Betriebs **
Die Option genStrAsCharArray ist eine Option, die eine Zeichenfolge (String) als Array von Zeichen (char) behandelt. Wenn Sie es als ein Array von Zeichen behandeln, sparen Sie Speicher und reduzieren den Overhead. Diese Abstimmung wird als "Mikrooptimierung" verspottet, aber wenn sich Staub ansammelt ...
Fügen Sie den Einstellungsteil hinzu, der sich auf das JSP-Servlet in "
hinzufügen
<servlet>
<servlet-name>jsp</servlet-name>
...
...
<!--Zusätzlicher Teil-->
<init-param>
<param-name>genStrAsCharArray</param-name>
<param-value>true</param-value>
</init-param>
<!-- /Zusätzlicher Teil-->
</servlet>
Es ist ein Jahr seit dem letzten Java EE Adventskalender 2015 vergangen, an dem ich zum ersten Mal teilgenommen habe. Ich mache mir Sorgen um die Zukunft, zum Beispiel, dass Oracle das Ende der Java EE-Entwicklung riecht, aber ich möchte, dass Java EE sein Bestes gibt, ohne den Gegenwind zu verlieren.
Recommended Posts