• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JRE,JVM,JIT wytłumaczenie

Object Storage Arubacloud
+3 głosów
486 wizyt
pytanie zadane 3 lutego 2019 w Java przez periedynek Obywatel (1,320 p.)
Cześć. Uczę się nt. różnić pomiedzy JRE,JVM i JIT.

Jeżeli chodzi o JVM, to ogarnąłem mniej więcej jak to działa.

1) javac (który się znajduje w JDK) konwertuje nasz napisy kod na tzw. "bytecode".

2) jvm "łapie" ten bytocde i przechodząc przez te wszystkie komponenty czyli class loader, bytcode verifier, execution engine zamienia bytecode na kod maszynowy

i o ile się nie myle, to jit jest częścią execution engine. Nie potrafię ogarnąć jak to działa. Na stronkach pisza, że usprawnia on JVM, bo sam JVM byłby zbyt wolny ze wzgledu na konwertowanie całego bajtkodu na kod maszynowy. Ludzie piszą, że JIT (just-in-time) konwertuje w czasie run time kod, który jest najbardziej używany na kod maszynowy tak, aby cały kombajn JVM nie musiał konwertować wszystkiego samego sam.

Jak to działa, co to jest ten czas run time, kiedy on występuje?

Jeżeli chodzi o JRE, to na każdej stronie jest napisane, że;

"Actually JVM runs the program, and it uses the class libraries, and other" natomiast

"If you want to run any Java program, you need to have JRE installed in the system.", to co w koncu odpala ten program. Tak wiem, że JRE = JVM+jakies tam biblioteki, ale to w takiem razie to skoro to i to odpala program to po co nam jest JRE?

 

Potrzebuje wytłumaczenia na chłopski rozum, najlepiej na przykładzie.

2 odpowiedzi

0 głosów
odpowiedź 4 lutego 2019 przez mbabane Szeryf (79,280 p.)
wybrane 6 lutego 2019 przez periedynek
 
Najlepsza

Runtime to po prostu czas działania aplikacji. Uruchamiasz aplikację i JIT już działa. Jest polecenie, które uruchamia program javy bez JIT'a:

java -Xint

Zerknij na to na pewno wiele Ci się wyjaśni:

https://www.youtube.com/watch?v=rWdgla54bcc

potem na to:

https://www.youtube.com/watch?v=GXyM7IOTXOM

 

komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
nie mam czasu niestety tyle czasu spędzic na oglądanie.

No dobrze, ale skoro runtime to jest od razu po odpaleniu to w takim razie kiedy działa ten cały JVM jak nie po włączeniu aplikacji? Nie potrafie tego pojac.
komentarz 4 lutego 2019 przez mbabane Szeryf (79,280 p.)
JVM działa po uruchomieniu aplikacji. Uruchamiasz aplikacje java przekazując jej w argumencie wiersza polecen klasę rozruchową Twojej aplikacji. Jeśli w tej klasie znajdzie się metoda main to Twoja aplikacja będzie uruchamiana.
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
ale JIT się odpala razem z JVM, skoro JIT jest częscią JVM, to w którym momencie on już konwertuje bajtkod na kod maszynowy?

Czy to działa na zasadzie takim, ze działają one równolegle, ale JIT wyszukuje najbardziej używane częsci kodu przez co "inna" część JVM nie musi konwertować?
komentarz 5 lutego 2019 przez mbabane Szeryf (79,280 p.)

Zerknij na film nr 1 na samym pocatku jest to omawiane, mysle, że tam jest to lepiej wytłumacone niż ja bym tutaj tworzył.

Jest tam taki przepływ:

source -> javac -> bytecode

bytecode -> classloader -> interpreter

interpreter -> JIT -> optimized native code

Pierwsze 10/15 min z pierwszego filmu o tym opowiada.

komentarz 5 lutego 2019 przez periedynek Obywatel (1,320 p.)
To nie jest tak, że JVM cały kod konwertuje na kod maszynowy, tylko jak się odpala interpreter i lata on kilka razy po programie, to niektóre kawałki są konwertowane przez JIT na kod maszynowy, a niektóre intepretowane od razu przez intepreter, przez co nie trzeba ich zamieniac na kod maszynowy.
komentarz 5 lutego 2019 przez mbabane Szeryf (79,280 p.)
edycja 5 lutego 2019 przez mbabane

100% kodu na pewno nie jest optymalizowane przez JIT. Może być tak, że kod Javy (a właściwie bytecode) będzie taki zawiły i skomplikowany, że JIT nie będzie w stanie go przerobić.

JIT ma też pewne poziomy optymalizacji i z tego co zrozumiałem większość kodu pisanego przez programistę może być w tych pierwszych poziomach zoptymalizowana. Takimi optymalizacjami są na przykład inlining, lub usuwanie tzw. dead code (DeadCodeElimination) (czyli kodu, który na pewno się nie wykona - czasami kompilator javac to łapie i nie pozwala na kompilacje, np. przy wyjątkach jeśli bardziej szczegółowy wyjątek jest łapany po wyjątku ogólnym). Takim deadCodem będzie np. wołanie pustej metody.

Istnieją także bardziej zaawansowane optymalizacje, które będą wykonywane dla jakiegoś fragmentu kodu. Taki kod jest wybierany głównie na podstawie częstotliwości jego wywoływania/wykonywania. Jeśli daną metodę będziesz wołał 100 tyś razy to na pewno JIT podejmie próbę optymalizacji. Przykładem jest zdaje się optymalizacja Hot paths czyli wyłączenie kodu który dla 99% przypadków wywołań jest zawsze taki sam np. jakieś ify gdzie dla 99% przypadków będzie false i nie będzie wejścia w blok jeśli prawda.

komentarz 5 lutego 2019 przez periedynek Obywatel (1,320 p.)
W sensie no JIT konwertuje na kod maszynowy tylko te części, które są najbardziej używane w programie, np. wielokrotne wywołanie funkcji. Chodzi mi o tę część, która nie jest konwertowana na kod maszynowy przez JIT.

Czy nie jest tak, że intepreter nie kownertuje tego co JIT nie przekonwertował, tylko od razu odpala program?
komentarz 5 lutego 2019 przez mbabane Szeryf (79,280 p.)
edycja 5 lutego 2019 przez mbabane

Czy nie jest tak, że intepreter nie kownertuje tego co JIT nie przekonwertował, tylko od razu odpala program?

Zgodnie z tym przepływem JIT działa po interpreterze. Więc interpreter nic nie skonwertuje od JIT'a. Co najwyżej oleje ten kod i go nie zoptymalizuje bo np. taki kod jest wołany prawie nigdy. I jeśli jawnie nie powiesz żeby nie było JIT'a to na pewno coś zostanie zrobione. Interpretacje można inaczej nazwać tłumaczeniem.

O to chyba można porównać do czytania tekstu po ang. przez nas. Jeśli znasz jakieś zwroty z ang. możesz błyskawicznie zrozumieć tekst - a nawet jeśli danej części nie rozumiesz to wyciągniesz szybko z kontekstu - i to będzie wersja z JIT-em. Bez JIT'a będzie tak, że musisz najpierw cały tekst przetłumaczyć z ang na polski dopiero potem będziesz mógł zrozumieć o czym on jest.

Jest tylko coś takiego, że JIT może się jakby pomylić i wycofać swoją optymalizacje. Niestety jest tak że jeśli JIT stwierdza, że jego optymalizacja jest zła to wraca do punktu wejścia - przywraca kod sprzed wszystkich optymalizacji. Może wtedy nastąpić jego ponowna optymalizacja. Na przykład polimorfizm może do tego doprowadzić. Przez 100 tyś razy była wykonywana odziedziczona metoda A obiektu O1, ale za 101 tyś razem został on podmieniony na O2, który ma inną wersję metody A. JIT robi prrrrrrr i cofa wszystkie optymalizacje. Naturalnie może potem ponownie dokonać jakiejś optymalizacji.

komentarz 5 lutego 2019 przez periedynek Obywatel (1,320 p.)
No tak tak, ale chodzi mi co sie dzieje z kodem, ktory nie jest jitowany. On nie jest konwertowany na kod maszynowy, tylko jest od razu tak jakby wykonywany?
komentarz 6 lutego 2019 przez mbabane Szeryf (79,280 p.)
edycja 6 lutego 2019 przez mbabane

Gdy jita nie ma to kod jest najpierw interpretowany a potem wykonywany. Niestety nie analizowałem tego na własną rękę, a źródła z których czerpałem wiedzę prawdopodobnie jakoś jawnie tego nie poruszały.

Według mnie jeśli kod nie przejdzie przez jitowe optymalizacje będzie najpierw interpretowany, a potem wykonywany.

komentarz 6 lutego 2019 przez mbabane Szeryf (79,280 p.)
Jedno jeszcze sprostowanie. Kod bytecode będzie zawsze zinterpretowany (forma dokonana). Czyli JIT analizuje już zinterpretowany kod i może tę interpretację poprawić. Coś na zasadzie, że tłumaczysz angielski tekst obok nauczyciela (JIT) i w razie jak coś nie do końca dobrze zrozumiesz/przetłumaczysz nauczyciel Cię poprawi.
komentarz 6 lutego 2019 przez periedynek Obywatel (1,320 p.)
a, okej. Czyli cały kod jest intepretowany, mamy napisaną książkę i JIT wprowadza poprawki do tej książki a następnie program jest wykonywany?
komentarz 6 lutego 2019 przez mbabane Szeryf (79,280 p.)

Cały tylko myk z JIT-em polega na tym, że on to robi w trakcie wykonywania, nie przed wykonaniem. Można powiedzieć, że on optymalizuje przed kolejnym wykonaniem. I jeśli w czasie pracy JITa, on poprawi dany fragment kodu to przy kolejnym wywołaniu tego samego kodu, kod będzie wykonany z naniesionymi poprawkami JIT'a.

+1 głos
odpowiedź 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Srodowisko javy sklada sie z kilku zbiorow programow i bibilotek. JRE jest to java runtime environment, czyli srodowisko uruchomieniowe. Zawiera ono wirtualna maszyne javy JVM wraz z kilkoma programami i bibliotekami podstawowymi w formie bytecodu.

Odpadają jakikolwiek program w javie odpalasz wlasnie jvm. On ma w sobie class lodery, garbage collectory i tak dalej. Jednym z takich dodatkowych featurow jest JIT just in time compiler. Jego glownym zadanien jest dodatkowa optymalizowaniu tych elementow kodu ktore wykonuja sie najczesciej. W skrocie dziala to tak ze kawalek kodu jest agresywniej optymalizowany.
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
Ale to nie jest dalej odpowiedź dla mnie dobra.

Skoro JVM odpala program, to co daje JRE. Prosze o nie mowienie, ze jest to środowisko uruchomieniowe i to ono odpala, to bo już wiem:D
komentarz 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
JRE niczego nie odpala. Tak jak JDK jest zbiorem programów pozwalających na development tak JRE jest zbiorem programów i bibliotek pozwalających na uruchomienie programu napisanego w java. JRE zawiera w sobie JVM na którym odpalamy programy.
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
Ale ja nie potrafię tego pojąć, w takim razie skoro jre to taki komputer, a jvm to gra?

jre daje srodowisko a jvm odpala sam program?
komentarz 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Nie. JVM to komputer. JRE to karton w którym Ci ten komputer przyjechał wraz z płytkami sterowników.
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
ale ja nie potrzebuje zadnego kartonu do komputera ani sterowników i bez tego go odpalę :D
komentarz 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Nie rozumiem troche
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
Chodzi mi o to, że skoro to JVM odpala wszystko, to nie potrzebuje JRE aby odpalić ten program, bo skoro mówisz ze to jest karton i sa to sterowniki, to nie są one wymagane do tego by włączyć komputer czyli tzw program.
komentarz 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Ale mając JVM masz też JRE, bo JVM wchodzi w skład JRE. To nie są rozłączne rzeczy. Sam JVM nie odpali programu bo zabraknie mu klas z biblioteki standardowej.
komentarz 4 lutego 2019 przez periedynek Obywatel (1,320 p.)
No tak, ja wiem że JVM jest częscią JRE, które zawiele biblioteki (util,math etc.). Czyli po prostu JVM odpala program, a JRE daje mu miejsce gdzie moze ten program odpalić?
komentarz 4 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Można tak to nazwać.

Podobne pytania

0 głosów
2 odpowiedzi 684 wizyt
0 głosów
2 odpowiedzi 701 wizyt
pytanie zadane 15 października 2019 w C i C++ przez coderCpp93 Gaduła (4,200 p.)
+5 głosów
2 odpowiedzi 212 wizyt
pytanie zadane 19 czerwca 2020 w Java przez reaktywny Nałogowiec (41,050 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...