Ich führe eine Java-Anwendung mit den folgenden Einstellungen aus:
-Xms1G -Xmx2G -Xdebug -Xloggc: /usr/local/resin/log/gc.log -XX: + PrintGCDetails -XX: PermSize = 150M -XX: + PrintGCTimeStamps -XX: + PrintTenuringDistribution -XX: + PrintGCApplicationStoppedTime -XX: + PrintGCApplicationConcurrentTime -XX: + PrintHeapAtGC -XX: + UseConcMarkSweepGC
Ich dachte, das Einschalten von -XX: + PrintGCApplicationStoppedTime gibt aus, wie lange die Anwendung bei jedem GC gestoppt wird, aber mehrere Zeilen von Protokollen, die angeben, wie lange die Anwendung zwischen zwei kleineren GCs wie der folgende Protokolle:
%Vor%Warum gibt es mehrere aufeinanderfolgende Zeilen von "Gesamtzeit, für die die Anwendungsthreads gestoppt wurden" und "Anwendungszeit" zwischen zwei untergeordneten GCs. Worauf bezieht sich jede Zeile von ihnen? Ein GC, der nicht im Detail ausgegeben wird? oder sind sie nicht durch GC verursacht?
Wenn ich die Gesamtzeit erfahren möchte, für die meine Anwendung während GCs gestoppt wurde, sollte ich die Zeit in all diesen Protokollen zusammenfassen?
Verwenden Sie -XX:+PrintSafepointStatistics
, um die Ursache jedes Sicherheitspunkts zu ermitteln. Verknüpfen Sie Diese Antwort zeigt an, wo Sie eine vollständige Liste der möglichen Sicherheitsrisiken erhalten.
Dieses Protokoll zeigt Ihnen alle Gründe, warum eine Anwendung gestoppt wurde, nicht nur für GCs. Eine Möglichkeit, diese zu reduzieren, besteht darin, das voreingestellte Sperren auszuschalten (nichts mit GCs zu tun);)
Versuchen Sie
%Vor%Tags und Links java garbage-collection