Warum hat der JVM erfordern warmup?
Ich verstehe, dass in der Java virtual machine (JVM), warm-up ist potenziell erforderlich, da Java-Lasten-Klassen mit ein lazy loading-Prozess und als solche Sie wollen sicherstellen, dass die Objekte initialisiert werden, bevor Sie beginnen, die wichtigsten Transaktionen. Ich bin C++ Entwickler und habe nicht zu tun hatte mit ähnlichen Anforderungen.
Jedoch die Teile, die ich bin nicht in der Lage zu verstehen, sind die folgenden:
- Welche Teile des Codes sollten Sie sich Aufwärmen können?
- Auch wenn ich ein paar warme Teile des Codes, wie lange es warm bleiben (vorausgesetzt, dieser Begriff bedeutet nur, wie lange Ihre Klasse Objekte bleiben im Speicher)?
- Wie funktioniert es helfen, wenn ich Objekte, die erstellt werden müssen, jedes mal, wenn ich eine Veranstaltung?
Betrachten ein Beispiel für eine Anwendung, die erwartet wird, zu empfangen von Nachrichten über eine socket-und die Verhandlungen könnten sich Neue Bestellung, Bestellung Bearbeiten und die Bestellung Stornieren oder die Transaktion bestätigt.
Beachten Sie, dass die Anwendung über High-Frequency-Trading (HFT), so ist die Leistung extrem wichtig ist.
- Sie können finden
-XX:+PrintCompilation
nützlich für die Verfolgung Zusammenstellung Verhalten. Vielleicht möchten Sie auch zu wenden Sie sich an oracle, Sie arbeiten auf einem AOT-compiler, die derzeit nur an gewerbliche Kunden AIUI. Ich glaube, einige andere JVM-Anbieter bieten auch AOT. - Siehe auch diese links: jvm-Optionen auf Windows, jvm-Optionen für Linux -, Solaris -, Mac
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel, die Sie nicht haben, etwas zu tun. Aber für eine low-latency-Anwendung, sollten Sie warm-up, den kritischen Pfad in Ihrem system. Sollten Sie unit-tests, so schlage ich vor, Sie führen diese auf start-up, Aufwärmen bis der code.
Selbst, sobald Ihr code wird erwärmt, Sie haben, um sicherzustellen, dass Ihre CPU-caches warm zu bleiben, wie gut. Können Sie sehen eine deutliche Verlangsamung in der Leistung nach einem sperrvorgang zum Beispiel Netzwerk-IO, für bis zu 50 Mikro-Sekunden. In der Regel ist dies kein problem, aber wenn Sie versuchen zu bleiben, unter sagen wir 50 Mikro-Sekunden, die meisten der Zeit, dies wird ein problem sein, die meisten der Zeit.
Hinweis: Warmup erlauben können, die Flucht-Analyse kick und einige Objekte auf dem stack. Dies bedeutet, dass solche Objekte nicht optimiert werden sollen, entfernt. Es ist besser, memory profile Ihrer Anwendung, bevor Sie die Optimierung Ihres Codes.
Gibt es keine zeitliche Begrenzung. Es hängt davon ab, ob der JIt-erkennt, ob die Annahme es aus, wenn die Optimierung des Codes stellte sich heraus, falsch zu sein.
Wenn Sie möchten, niedrige Latenz oder hoher Leistung, Sie sollte so wenig Objekte wie möglich. Ich Ziel die Herstellung von weniger als 300 KB/Sek. Mit dieser Zuordnung beurteilen können Sie haben ein Eden Raum groß genug, um kleinere sammeln, einmal am Tag.
Ich schlage vor, Sie re-Objekte verwenden, so viel wie möglich, wenn es unter deinem budget allocation, kann es nicht Wert sein, sich Gedanken über.
Könnten Sie Interesse an unserer open-source-software, die verwendet wird, für die HFT-Systeme zu verschiedenen Investment-Banken und Hedge-Fonds.
http://chronicle.software/
Insbesondere, die Sie interessieren könnten https://github.com/OpenHFT/Java-Thread-Affinity wie diese Bibliothek kann dazu beitragen, scheduling-jitter in kritischen threads.
Code kompiliert wird, über hintergrund-thread(s). Dies bedeutet, dass selbst wenn eine Methode könnte sein förderfähigen für in systemeigenen code kompilieren, es bedeutet nicht, dass es so getan hat esp auf Start, wenn der compiler ist ziemlich beschäftigt bereits. 12K ist nicht unvernünftig, aber es könnte höher sein.
Erwärmung bezieht sich auf ein Stück code ausführen oft genug, dass die JVM beendet Interpretation und kompiliert native (zumindest für die erste Zeit). In der Regel, dass ist etwas, was Sie nicht wollen, zu tun. Der Grund dafür ist, dass die JVM sammelt Statistiken über die in Frage stehenden code, den es verwendet, während der code-Generierung (ähnlich dem Profil angepassten Optimierungen). Also, wenn ein code-Stück in Frage "erwärmt" mit fake-Daten, die andere Eigenschaften als die realen Daten könnte man auch verletzen Leistung.
EDIT: Da die JVM nicht durchführen können ganze Programm statische Analyse (Sie können nicht wissen, was der code wird von der Anwendung geladen werden), kann es machen Sie stattdessen einige Vermutungen über die verschiedenen Arten von Statistiken, die es gesammelt hat. Als Beispiel beim Aufruf einer virtuellen Funktion (in C++ sprechen) auf eine genaue Aufruf von Lage und bestimmt, dass alle Arten haben die gleiche Umsetzung, dann wird der Anruf gefördert werden, um direkten Anruf (oder auch inline). Wenn später, dass die Annahme, wenn Sie nachweisbar falsch sind, dann der alte code muss "unkompilierte", sich richtig zu Verhalten. AFAIK HotSpot klassifiziert call-Websites als monomorphe (single-Umsetzung), bi-morphogenetisches (genau zwei..verwandelt sich in, wenn (imp1-Typ) {imp1} else {imp2} ) und die vollständige polymorphe..virtuellen Versand.
Und es gibt einen weiteren Fall, in dem neu zu kompilieren tritt..wenn Sie haben, tiered-Zusammenstellung. Die erste Stufe wird weniger Zeit damit verbringen, versuchen, guten code zu produzieren-und wenn die Methode "heiß genug", dann wird das teurer compile-time-code-generator kicks in.
Warm-up ist selten erforderlich. Es ist relevant, wenn man z.B. performance-tests, um sicherzustellen, dass der JIT-warm-up-Zeit nicht die Ergebnisse verzerren.
Im normalen Produktions-code, den Sie nur selten sehen-code, der bedeutete, für warm-up. JIT wird warm-up während der normalen Verarbeitung, so gibt es sehr wenig Vorteil, um die zusätzlichen code, der nur für die. Im schlimmsten Fall könnten Sie die Einführung von bugs, die etwas mehr Entwicklungszeit und sogar Schaden Leistung.
Es sei denn, Sie wissen, für bestimmte, dass Sie brauchen eine Art von warm-up, machen Sie sich keine sorgen. Die Beispiel-Anwendung, die Sie beschrieben sicherlich nicht brauchen.
Moderne (J)VMs Statistiken zur Laufzeit, über die code wird am häufigsten verwendet und wie es verwendet wird. Eine (von Hunderten, wenn nicht tausenden) Beispiel ist die Optimierung der Anrufe auf die virtuellen Funktionen (in C++, lingo), die nur auf Umsetzung. Die Statistiken können nach Ihrer definition nur gesammelt zur Laufzeit.
Klasse laden selbst ist Teil der warm-up als gut, aber natürlich ist es automatisch geschieht, bevor die Ausführung von code innerhalb dieser Klassen, so gibt es nicht viel zu befürchten
Den Teil, der entscheidend ist für die performance der Anwendung. Der wichtigste Teil ist die "warm it up", genauso wie es beim normalen Gebrauch, da sonst die falschen Optimierungen werden gemacht (und später rückgängig gemacht).
Dies ist wirklich schwer zu sagen, der JIT-compiler überwacht ständig die Ausführung und Leistung. Wenn gewisse Schwelle erreicht ist, wird es versuchen zu optimieren, Dinge. Es wird dann weiter die Leistung überwachen, um zu überprüfen, dass die Optimierung tatsächlich hilft. Wenn nicht könnte es unoptimize der code. Auch Dinge, die vielleicht passieren, dass ungültig-Optimierungen, wie das laden von neuen Klassen. Ich würde überlegen, diese Dinge nicht vorhersagbar, zumindest nicht auf Basis einer stackoverflow-Antwort, aber es gibt tools, die Ihnen sagen, was der JIT ist zu tun: https://github.com/AdoptOpenJDK/jitwatch
Einem einfachen Beispiel könnte sein: Sie erstellen Objekte in einer Methode, da ein Verweis Blätter der Anwendungsbereich der Methode, die Objekte gespeichert werden auf dem heap, und schließlich der Abholung durch den garbage collector. Wenn der code, der die Verwendung dieser Objekte ist so stark genutzt wird, könnte es am Ende immer inline in einem einzigen big-Methode, eventuell nachbestellt, bis zur Unkenntlichkeit, bis diese Objekte Leben nur innerhalb dieser Methode. An diesem Punkt können Sie auf den Stapel gelegt und entfernt werden, wenn die Methode beendet wird. Dies spart enorme Mengen von Müll-Sammlung und wird nur passieren nach einigen warm-up.
Mit allen, die gesagt hat: ich bin skeptisch auf die Vorstellung, man muss etwas besonderes tun, um sich aufzuwärmen. Einfach die Anwendung starten, und verwenden Sie es, und der JIT-compiler wird es nicht sein Ding gut. Wenn Sie Probleme haben, dann erfahren Sie, was der JIT Ihre Anwendung, und wie die Feinabstimmung, die Verhalten oder wie schreiben Sie Ihre Anwendung so, dass es Vorteile die meisten.
Der einzige Fall, wo ich eigentlich wissen, über die Notwendigkeit für warm-up sind benchmarks. Denn wenn Sie es vernachlässigen dort erhalten Sie falsche Ergebnisse fast garantiert.
Es gibt keine Antwort auf diese Frage im Allgemeinen. Es kommt ganz auf Ihre Anwendung.
Objekte bleiben im Speicher, solange Ihr Programm hat einen Verweis auf Sie, fehlt es an einer speziellen weak-Referenz verwenden oder etwas ähnliches. Das lernen über, wenn Ihr Programm "hat eine Referenz", um etwas ein wenig mehr verdecken, als Sie vielleicht auf den ersten Blick denken, aber es ist die Grundlage für die Speicherverwaltung in Java und der Mühe Wert.
Dies ist ganz abhängig von der Anwendung. Es gibt keine Antwort im Allgemeinen.
Ich Sie ermutigen, zu studieren und zu arbeiten mit Java um zu verstehen, Dinge wie zum laden von Klassen, Speicher-management und performance-monitoring. Es dauert einige Zeit zum instanziieren eines Objekts im Allgemeinen dauert es mehr Zeit zum laden einer Klasse (die, natürlich, ist in der Regel viel weniger oft). In der Regel, sobald eine Klasse geladen wird, bleibt es im Speicher für die Lebensdauer des Programms, - das ist die Art von Sache, die Sie sollten verstehen, nicht nur eine Antwort zu.
Gibt es auch Techniken zu lernen, wenn Sie nicht wissen, Sie schon. Einige Programme verwenden "pools" von Objekten, die instanziiert werden, bevor Sie eigentlich benötigt, dann übergeben um die Verarbeitung zu übernehmen, sobald die Notwendigkeit entsteht. Dies ermöglicht eine Zeit-kritische Teil des Programms zu vermeiden, die Zeit der Instanziierung während der Zeit-kritischen Periode. Die pools erhalten Sie eine Auflistung von Objekten (10? 100? 1000? 10000?), und instanziieren Sie mehr, wenn nötig, etc. Aber die Verwaltung der pools ist ein erheblicher Programmieraufwand, und, natürlich, Sie Speicher belegen, die mit den Objekten in den pools.
Wäre es durchaus möglich, zu verwenden, bis genügend Speicher, um garbage collection auszulösen, viel mehr oft, und DAS SYSTEM VERLANGSAMEN SIE beabsichtigten, ZU beschleunigen. Dies ist der Grund, warum Sie brauchen, um zu verstehen, wie es funktioniert, nicht nur "eine Antwort bekommen".
Andere Betrachtung-bei weitem die meisten Anstrengungen in das Programme schneller verschwendet wird, als in nicht benötigt. Ohne umfangreiche Erfahrungen mit der Anwendung betrachtet wird, und/oder die Messung das system, Sie wissen einfach nicht, wo (oder ob) - Optimierung wird auch spürbar sein. System - /Programm-design zur Vermeidung pathologischer Fälle der Langsamkeit SIND nützlich, und nicht annähernd die Zeit und den Aufwand der 'Optimierung'. Die meisten der Zeit, es ist alles, jeder von uns brauchen.
-- edit -- add just-in-time-Kompilierung, um die Liste der Dinge zu studieren und zu verstehen.
Es ist alles über
JIT
- Compilers, der verwendet wird, auf dieJVM
zu optimieren-bytecode in der Laufzeitumgebung (weiljavac
können nicht verwenden Sie die erweiterte oder agressive Optimierung der Technik durch Plattform-unabhängige Natur der bytecode -)können Sie Aufwärmen der code, werden Ihre Nachrichten. Tatsächlich, in den meisten Fällen werden Sie nicht brauchen, um es durch spezielle warm-up-Zyklen: lass einfach die Anwendung starten und Prozess einige der ersten Nachrichten -
JVM
werden versuchen, Ihr bestes tun, um zu analysieren, code-Ausführung und-Optimierungen machen 🙂 Manueller warm-up mit gefälschten Proben können liefern noch schlechtere Ergebnissecode wird optimiert, nach einiger Zeit und optimiert wird, bis irgendein Ereignis im Programm-flow-würde degradate code Zustand (nach
JIT
compiler wird versuchen den code optimieren wieder - dieser Prozess endet nie)kurzlebigen Objekte sind Gegenstände optimiert werden auch, aber in der Regel sollte es helfen, Ihre message-Verarbeitung pragmatisierte code effizienter zu sein
Ich immer im Bild, wie die folgenden:
Sie als (C++ Entwickler) könnte sich vorstellen, ein automatisierte iterativen Ansatz, indem Sie die
jvm
kompilieren/hotloading/ersetzt verschiedene bits ein Stück mit (imaginären analog)gcc -O0
,-O1
,-O2
,-O3
Varianten (und manchmal verwerfen Sie Sie, wenn es hält es für unbedingt notwendig)Ich bin mir sicher, das es nicht unbedingt was passiert, könnte aber eine nützliche Analogie für einen C++ dev.
Auf einer standard-jvm die Zeit es dauert für ein snippet für jit wird von
-XX:CompileThreshold
die 1500 standardmäßig.(Quellen und jvm-Versionen sind unterschiedlich - aber ich denke, das ist für jvm8)
Weiter ein buchen, die ich bei der hand haben, Staaten unter Host-Performace JIT Kapitel (S. 59), dass die folgenden Optimierungen werden gemacht, während JIT:
EDIT:
über Kommentare
Ich weiß nicht, ob es einfach nur ein Hinweis, aber da openjdk ist die open-source-betrachten wir die verschiedenen Grenzen und Nummern in globals.hpp#l3559@ver-a801bc33b08c (für jdk8u)
(Ich bin nicht eine jvm dev dies ist vielleicht der komplett falsche Ort, um zu sehen)
Meinem Verständnis - stimmt; vor allem, wenn du meinst
-Xcomp
(force compile) - diese blog auch heißt es, dass es verhindert, dass die jvm zu tun, jede profiling - also die Optimierung von - wenn Sie nicht laufen-Xmixed
(Standard).Ich weiß wirklich nicht, die details, aber die
gobals.hpp
ich verlinkte in der Tat definiert einige Frequenz-Intervallen.