CORE Flashcards
Czym jest JVM ?
Java Virtual Machine (JVM) to środowisko uruchomieniowe, które umożliwia wykonywanie kodu napisanego w języku Java na różnych platformach
- Działa jako warstwa abstrakcyjna pomiędzy kodem źródłowym, a systemem operacyjnym, co pozwala na tłumaczenie i wykonywanie kodu Java bezpośrednio na danej platformie.
- JVM jest wykorzystywany do interpretacji kodu bajtowego, a także do optymalizacji wydajności aplikacji.
- odśmiecanie pamięci
- obługa wyjątków
- biblioteka standardowa
Czym jest byte code ?
Kod bajtowy jest zestawem instrukcji dla wirtualnej maszyny Javy (ang. Java Virtual Machine: JVM). Interpreter kodu bajtowego Javy umożliwia wykonanie programu.
Z czego składa sie JVM ?
- Ładowarka klas (Class Loader).
- Sterta (Heap).
- Stosy języka (language Stacks)
- Rejestr komputera PC (PC Registers).
- Stosy metod natywnych (Native Method Stacks).
- Platforma programistyczna (Native Method Interface).
Biblioteki (Native Method Libraries).
Co to jest Execution Engine ?
wykonuje “.class” (kod bajtowy). Odczytuje kod bajtowy wiersz po wierszu, wykorzystuje dane i informacje obecne w różnych obszarach pamięci i wykonuje instrukcje
Składa się z :
- interpretera
- Just-in-time compiler
- garbage collector
Co to jest Class Loader ?
Jest to podsystem, który wykorzystuje się do ładowania plików klas. Wykonuje on ładowanie, inicjowanie i łączenie.
Method Arera
- wszystkie informacje o klasach
- bazwa klasy, metody, zmienne
Stack
- zmienne loklane
- wszystkie wątki mają swój stack
PC Registers
Przechowuje on adres aktualnie realizowanej instrukcji maszyny wirtualnej Java. Każdy wątek w Java posiada osobny rejestr PC.
Native Method Stacks
Zawiera wszystkie metody natywne używane w aplikacji.
Interpreter
wykonuje krok po kroku instrukcje programu zapisane w postaci kodu bajtowego
JIT w JVM
- FEATURE JVM które poprawia wydajność aplikacji
- kompiluje bytecode do kodu maszynowego w czasie wykonywania
- analizuje kod bajtowy i kompiluje do maszynowego jeśli zdecyduje, że jest często wykonywany kod
- pozwala to na szybsze wykonywanie kodu niż intepretowaniu kodu za każdym wykonaniem
- kompilator może reagować na faktyczne zapotrzebowanie użytkowników aplikacji w trakcie jej działania
Heap
- obiekty
Garbage Collection
- ## proces automatycznego uwalniania pamięci sterty przez usuwanie obiektów które nie są juz osiągalne przez program
Które obiekty są do Garabage Collection
Obiekt nie ma już żadnych referencji wskazujących na niego.
Wszystkie referencje do obiektu wyszły poza zakres.
JDK
- dostarcza środowisko do tworzenia (Development Tools) oraz wykonywania JRE
- kompilator debugger
JRE
- środowisko do wykonywania programów
Czym jest pakiet ?
- pakiet to przestrzeń nazw która organizuje zestaw powiązanych klas i interfejsów
- pakiety pomagają w zapobieganiu konfliktom nazw
- pakiety zapewniają również mechanizm kontroli widoczności
Equals i HashCode kontrakt ?
- jeśli x.equals(y) jest true, to x.hashCode() = y.hashCode().
- jeżeli informacje użyte w porównaniach equals() nie zostaną zmienione, to metoda hashCode() musi zawsze zwracać tę samą wartość.
- Dwa obiekty są róże equals mogą mieć ten sam hashcode ale nie powinny.
Czym Jest Hash?
- liczba całkowita, powstała na skutek funkcji hashujących
- główna zaletą hashu jest **prównywanie hashy **jest dużo szybsze niż porównywanie wszystkich pól
- wada - hashe nie są unikalne
- równość hashy nieoznacza równości pół
Jak tworzony jest hash ?
- Weź pewną liczbę – w książce Effective Java jest to narzucona liczba 17.
- Pomnóż aktualny hash przez 31
- Dodaj do hashu wartość/hash pola w klasie
- Krok drugi i trzeci wykonaj dla każdego pola
- Zwróć hash
Co jeśli nie zaimplementujemy equals i hashcode
- będziemy prównywać obiekty za pomocą referencji
- do porównywania obiektów na podstawie pól potrzebujemy zaimplementować metodę equals i hashCode
Co jesli nie dotrzymamy kontraktu hashcode equals
- Problemy z kolekcjami: Jeśli dwa różne obiekty mają ten sam kod hashCode i są uważane za równe przez equals, mogą one zastąpić siebie nawzajem w strukturach takich jak HashSet.
- Niespodziewane wyniki: Obiekty, które powinny być traktowane jako różne, mogą być traktowane jako identyczne, co może prowadzić do błędnych wyników w operacjach takich jak wyszukiwanie, dodawanie lub usuwanie z kolekcji.
- Problemy z wydajnością: Nieoptymalna implementacja hashCode() może prowadzić do problemów z wydajnością, gdy obiekty są używane w kolekcjach bazujących na hashach.
Konwersja zawężająca
- rzutowanie w dół łanucha dziedziczenia
- JVM sprawdza czy damy pboelt rzeczywiście dziedziczy ten typ
- używanie instanceof
Konwersja rozszerzająca
- rzutowanie w góre łanucacha dziedziczenia
- nie jest konieczne sprawdzanie
- Referencja do obiektu może być zawsze zapisana w zmiennej, której typ odpowiada typowi dowolnego z jej przodków.