2010-03-24 26 views
12

Wiem, że Microsoft .NET używa CLR jako kompilatora JIT, podczas gdy Java ma Hotspot. Jakie są różnice między nimi?Jakie są różnice w JIT między Javą a .Net

+2

Różnica pod względem ...? – medopal

+1

NGen służy do prekompilacji MSIL do kodu natywnego i robi to dla całego zespołu, jednak gdy nie ma kodu NGen, kompilator JIT w .NET CLR zrobi to za ciebie. Porównać między tymi dwoma byłoby lepiej wykonane z kompilatora JIT w CLR, a nie z NGen vs Hotspot. – saret

Odpowiedz

22

Są to bardzo różne bestie. Jak zauważyli ludzie, CLR kompiluje się do kodu maszynowego zanim wykona fragment MSIL. To pozwala na to, oprócz typowej eliminacji martwego kodu i optymalizacji szeregowej, aby wykorzystać konkretną architekturę procesora maszyny docelowej (chociaż nie jestem pewien, czy to robi). Powoduje to również trafienie dla każdej klasy (chociaż kompilator jest dość szybki, a wiele bibliotek platform jest tylko cienką warstwą w stosunku do Win32 API).

Maszyna wirtualna HotSpot stosuje inne podejście. Przewiduje, że większość kodu wykonywana jest rzadko, dlatego nie warto poświęcać czasu na jego kompilację. Cały kod bajtowy rozpoczyna się w trybie zinterpretowanym. VM przechowuje statystyki w witrynach wywołujących i próbuje zidentyfikować metody, które są nazywane więcej niż wstępnie określoną liczbę razy. Następnie kompiluje tylko te metody z szybkim kompilatorem JIT (C1) i zamienia metodę podczas działania (to specjalny sos HS). Po tym jak metoda C1-kompilowana została wywołana kilka razy, ta sama metoda jest kompilowana z powolnym, ale wyrafinowanym kompilatorem, a kod jest ponownie zamieniany w locie.

Ponieważ HotSpot może wymieniać metody podczas pracy, kompilatory VM mogą wykonywać pewne spekulatywne optymalizacje, które są niebezpieczne w statycznie skompilowanym kodzie. Przykładem kanonicznym jest statyczne wysyłanie/podkreślanie połączeń monomorficznych (metoda polimorficzna z tylko jedną implementacją). Odbywa się to, jeśli VM zauważy, że ta metoda zawsze działa na ten sam cel. To, co kiedyś było skomplikowaną inwokacją, zostało zredukowane do kilku strażników instrukcji CPU, które są przewidywane i potokowane przez nowoczesne procesory. Gdy warunek strażnika przestaje być prawdziwy, maszyna wirtualna może przyjąć inną ścieżkę kodu lub nawet powrócić do trybu interpretacji. W oparciu o statystyki i obciążenie pracą programu generowany kod maszynowy może być inny w różnym czasie. Wiele z tych optymalizacji opiera się na informacjach zebranych podczas wykonywania programu i nie są one możliwe, jeśli kompilujesz raz podczas ładowania klasy.

Dlatego należy rozgrzewać maszynę JVM i emulować realistyczne obciążenie podczas testowania algorytmów (przekrzywione dane mogą prowadzić do nierealistycznej oceny optymalizacji). Inne optymalizacje to elimika blokady, adaptacyjne spin-locking, analiza ucieczki i alokacja sterty, itp.

Powiedział, że HotSpot jest tylko jedną z maszyn wirtualnych. JRockit, Azul, J9 IBM i resetowalny RVM, - wszystkie mają różne profile wydajności.

+0

Zobacz także http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html – ddimitrov

+0

Czy to prawda, że ​​dla kodu Java "cały kod bajtowy rozpoczyna się w trybie interpretacji"? Wydaje mi się, że liczba połączeń została również podjęta na starcie, a jeśli przekroczy próg, zostaną skompilowane podczas uruchamiania. Może to być zależne od kompilatora: https://www.ibm.com/support/knowledgecenter/en/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/understanding/jit_overview.html – swdon

Powiązane problemy