2016-06-27 7 views
1

Seit einiger Zeit bekomme ich Performance-Probleme mit meiner Java-Anwendung, ich habe JavaMelody für das Profiling verwendet und das Ungewöhnliche ist der "Used Memory" Graph. Es hat viele kurze Spikes, die ~ 8GB Zeile wirklich schnell erreichen und dann, wie ich verstehe, GC räumt den Speicher auf. Hat jemand die Erfahrung zu verfolgen, was diese Spikes bedeuten? Es scheint, als ob sie auf ein bestimmtes Problem hinweisen.Java: Häufige Spikes im "used memory" Graph

GC und JVM konfiguriert sind, als: -XX: PermSize = 384m -XX: MaxPermSize = 512m -XX: + UseCompressedOops -XX: + UseFastAccessorMethods -XX: + CMSClassUnloadingEnabled -XX: + UseParNewGC -XX: -UseParallelOldGC -XX: -UseAdaptiveSizePolicy -XX: SurvivorRatio = 128 -XX: NewSize = 4055m -XX: MaxNewSize = 4055m -XX: + UseConcMarkSweepGC -XX: CMSInitiatingOccupancyFraction = 60 -XX: + UseCMSInitiatingOccupancyOnly -Xms12888 m -Xmx12888m -Dsun.rmi.dgc.client.gcInterval = 1800000 -Dsun.rmi.dgc.server.gcInterval = 1800000

Der Graph ist (Grün ist "bedeuten", Blau ist "Maximum") : Memory graph - 16:00 - 8:00 system without load, 8:00+ - system is under load

Bis 8:00 gab es keine Last am System.

Nach 08.00 Uhr unter Last ist, aber nicht sehr groß ein (~ 20 simultanious Operationen)

Antwort

0

Das sieht aus wie Sie Objekte in Ihrem Eden Raum sind die Zuteilung, die für ein JVM Normalbetrieb ist. Ich schlage vor, dass Sie einen Speicher-Profiler wie Flight Recorder verwenden, um herauszufinden, wie hoch die Zuteilungsraten sind, und ob es eine Möglichkeit gibt, diese zu reduzieren.

Insbesondere, wenn Sie öfter als einmal alle paar Sekunden GC-ing, würde ich versuchen, die Menge an Müll zu reduzieren, die Sie erstellen. Wenn es lang ist, hängt es von Ihrem Anwendungsfall ab, ob es wichtig ist.

Wenn Sie in letzter Zeit kein Speicherprofil erstellt haben, schlage ich vor, dies zu tun, nur um eine andere Ansicht Ihrer Anwendung zu erhalten. Ich fand es nützlich, Fehler zu finden, auch wenn Leistung kein Problem war.

-XX: SurvivorRatio = 128

Das ist ziemlich hoch und schlägt Ihnen eine Menge sehr kurzlebige Objekte. Diese könnten leicht zu optimieren sein.

Ich habe vor kurzem an einer Regel-Engine für einen Kunden in New York gearbeitet, und indem wir einen Tag damit verbracht haben, die Zuteilungsrate zu reduzieren, haben wir die Leistung um den Faktor 2,3 erhöht. Indem wir einen zweiten Tag auf CPU verbracht haben, haben wir dies auf den vierfachen Durchsatz gebracht.

+1

Tatsächlich gab es ein Leck und zu viele Objekte wurden erstellt. SurvivorRatio war auch zu hoch. Vielen Dank! – Immortal