Ich weiß, dass Microsoft .NET die CLR als JIT-Compiler verwendet, während Java den Hotspot hat. Was sind die Unterschiede zwischen ihnen?Was sind die Unterschiede in JIT zwischen Java und. NET
Antwort
Sie sind sehr unterschiedliche Tiere. Wie die Leute darauf hingewiesen haben, kompiliert die CLR den Maschinencode, bevor sie ein Stück MSIL ausführt. Dies ermöglicht neben der typischen Eliminierung von Dead-Code und der Abgrenzung von privaten Optimierungen die Nutzung der CPU-Architektur des Zielrechners (obwohl ich mir nicht sicher bin, ob dies der Fall ist). Dies führt auch zu einem Treffer für jede Klasse (obwohl der Compiler ziemlich schnell ist und viele Plattformbibliotheken nur eine dünne Schicht über der Win32-API sind).
Die HotSpot VM verfolgt einen anderen Ansatz. Es besagt, dass der Großteil des Codes selten ausgeführt wird, daher lohnt es sich nicht, Zeit mit der Kompilierung zu verbringen. Der gesamte Bytecode startet im interpretierten Modus. Die VM führt Statistiken auf Call-Sites und versucht Methoden zu identifizieren, die mehr als eine vordefinierte Anzahl von Malen aufgerufen werden. Dann kompiliert es nur diese Methoden mit einem schnellen JIT-Compiler (C1) und tauscht die Methode aus, während sie läuft (das ist die spezielle Soße von HS). Nachdem die C1-kompilierte Methode einige Male aufgerufen wurde, wird dieselbe Methode mit einem langsamen, aber komplizierten Compiler kompiliert und der Code wird im laufenden Betrieb wieder ausgetauscht.
Da HotSpot Methoden austauschen kann, während sie ausgeführt werden, können die VM-Compiler spekulative Optimierungen durchführen, die in statisch kompiliertem Code nicht sicher sind. Ein kanonisches Beispiel ist das statische Dispatching/Inlining monomorpher Aufrufe (polymorphe Methode mit nur einer Implementierung). Dies geschieht, wenn die VM sieht, dass diese Methode immer zum selben Ziel aufgelöst wird. Was früher ein komplexer Aufruf war, ist auf ein paar CPU-Anweisungen beschränkt, die von modernen CPUs vorhergesagt und weitergeleitet werden. Wenn die Schutzbedingung aufhört, wahr zu sein, kann die VM einen anderen Codepfad verwenden oder sogar in den Interpretiermodus zurückfallen. Basierend auf der Statistik und der Programmauslastung kann der generierte Maschinencode zu unterschiedlichen Zeiten unterschiedlich sein. Viele dieser Optimierungen basieren auf den während der Programmausführung gesammelten Informationen und sind nicht möglich, wenn Sie beim Laden der Klasse einmal kompilieren.
Aus diesem Grund müssen Sie die JVM aufwärmen und eine realistische Arbeitslast emulieren, wenn Sie Algorithmen bewerten (schiefe Daten können zu einer unrealistischen Bewertung der Optimierungen führen). Weitere Optimierungen sind Lock Elision, adaptive Spin-Locking, Escape-Analyse und Stack-Allocation usw.
Das heißt, HotSpot ist nur eine der VMs. JRockit, Azul, IBM J9 und das rücksetzbare RVM, - alle haben unterschiedliche Leistungsprofile.
Siehe auch http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossar.html – ddimitrov
Stimmt es, dass für Java "der gesamte Bytecode im interpretierten Modus startet"? Ich denke, es gibt auch eine Anzahl von Anrufen beim Start und wenn sie den Schwellenwert überschreiten, werden sie beim Start kompiliert. Dies kann vom Compiler abhängig sein: https://www.ibm.com/support/knowledgecenter/de/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/understanding/jit_overview.html – swdon
- 1. Was sind die Unterschiede zwischen ConcurrentQueue und BlockingCollection in .Net?
- 2. Unterschiede zwischen Java und C# und .NET
- 3. Was sind die Unterschiede zwischen Perl und Java Regex-Funktionen?
- 4. Was sind die Unterschiede zwischen JVisualVM und Java Mission Control?
- 5. Was sind die Unterschiede zwischen LLVM und Java-Bytecode?
- 6. Was sind die Unterschiede zwischen & und &&, | und || in R?
- 7. Was sind die Unterschiede zwischen `ToXXXX` und` AsXXXX` Konvertierungsmethoden?
- 8. Was sind die Unterschiede zwischen zweien?
- 9. Was sind die Unterschiede zwischen Karma Reportern?
- 10. Was sind die Unterschiede zwischen ibm jdk und oracle jdk?
- 11. Was sind die Unterschiede zwischen HasOne und Referenzen in Nhibernate?
- 12. Was sind die Unterschiede zwischen ADOdb und PDO in PHP?
- 13. Was sind die Unterschiede zwischen Funktionen und Subroutinen in Fortran?
- 14. Was sind die Unterschiede zwischen JSP und Facelets?
- 15. Was ist/sind die Unterschiede zwischen MSBuild und TFSBuild?
- 16. Was sind die Unterschiede zwischen .NET Core Installer (RC2) und .NET Core SDK Installer (Vorschau 1)?
- 17. Was sind die Unterschiede zwischen den Umgebungsvariablen in ASP.NET Core?
- 18. Was sind die Unterschiede zwischen [Serializable] und [Serializable()]
- 19. Was sind die Unterschiede zwischen maxJsonLength und MaxJsonDeserializerMembers?
- 20. Graph - Was sind die Unterschiede zwischen eingebetteten und topologischen Graphen?
- 21. Was sind die aktuellen Unterschiede zwischen jQuery und Prototype?
- 22. Was sind die Unterschiede zwischen @dynamic und @synthesize?
- 23. Was sind die größten Unterschiede zwischen fopen und curl?
- 24. Was sind die Unterschiede zwischen "./Build.sbt" und "./Project/build.sbt"?
- 25. Was sind die Unterschiede zwischen FLAG_ACTIVITY_RESET_TASK_IF_NEEDED und FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
- 26. Was sind die Unterschiede zwischen MPI und OpenMP?
- 27. Was sind die praktischen Unterschiede zwischen Fliegengewicht und Singleton-Mustern?
- 28. Was sind die Unterschiede zwischen R.styleable, R.style und R.attr?
- 29. Was sind die Unterschiede zwischen Opera Unite und Node.js?
- 30. Was sind die Unterschiede zwischen tcmalloc/jemalloc und Speicherpool
Unterschied in Bezug auf ...? – medopal
NGen wird zum Vorkompilieren von MSIL zu systemeigenem Code verwendet, und zwar für eine gesamte Assembly. Wenn Sie jedoch keinen NGen-Code verwenden, wird der JIT-Compiler in .Net CLR dies im laufenden Betrieb für Sie tun. Ein Vergleich zwischen den beiden wäre besser mit dem JIT-Compiler in der CLR und nicht mit NGen vs Hotspot gemacht. – saret