Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Cześć w tej lekcji pokażę ci jak możesz monitorować garbage collector
czyli taki mechanizm który zajmuje się odśmiecaniem heap'u mamy uruchomiony
jakiś program który tworzy dużą liczbę obiektów tak następnie
gubi do nich referencje przez co w ten sposób prowokuje usunięcie ich przez
garbage collector tutaj analizując w visualvm wykres
heap'u możemy zobaczyć mniej więcej gdzie te kolekcje w sensie to usuwanie
przez garbage collector tak zwane właśnie kolekcje się odbywają są są po
prostu momenty w których powiedzmy na rozmiar heap'u czyli ten niebieski kolor
nam tutaj spada prawda w tym momencie załącza
nam się prawdopodobnie właśnie garbage collector to który usuwa te obiekty które
są już nieużywane tak jakby w jaki sposób ja coś takiego
udało mi się coś takiego wymusić i jeśli zobaczymy w
nasz program to ja teraz też tworzę obiekty w link liście tylko
powiedzmy mam jeszcze pętlę dookoła tak i powiedzmy za
każdym razem tworzę sobie nową linked listę co jakiś czas tak no
i powiedzmy ta poprzednia znika w tym momencie tak więc garbage collector
traktuje jako kandydatów do usunięcia tak no
i teraz dlaczego może nas interesować to co ten garbage collector robi zasadniczo
tego jak ten garbage collector działa może
być wiele rodzajów zasadniczo możemy tutaj nawet przez
nas uruchamiając program jvm'owy możemy sprecyzować
jakiego algorytmu ten garbage collector ma używać ich
jest kilka i każdy z nich trochę inaczej pracuje
tak ma powiedzmy różne czasy wymusza różne
powiedzmy pauzy na jvm'ie ponieważ czasami na przykład usunięcie
jakiejś przestrzeni jakichś powiedzmy obiektów sprawia
że jest potrzeba zatrzymania na przykład całego jvm'a w sensie tak sfixowania
go usunięcia niepotrzebnych obiektów i dopiero później jest on odpalany
co za tym idzie ma to pewien wpływ na wydajność
naszych aplikacji jeżeli na przykład tworzymy dużo obiektów później je
zapominamy to garbage collector ma dużo roboty no
i w związku z tym on też może pauzować nam aplikację dlatego warto
umieć zbierać tak jakby informacje o tym garbage collectorze
te informacje raczej nie będą nam potrzebne
zawsze raczej w momencie kiedy tuningujemy naszą aplikację czyli zauważyliśmy
że są problemy wydajnościowe no to wtedy możemy wykorzystać pewne
narzędzia tak no to pierwszą rzeczą to oczywiście możemy go sobie tutaj podejrzeć
w visualvm co się dzieje tak widzimy jest jakiś meksyk no
ale może byśmy powiedzieli że chcielibyśmy mieć jakieś dokładniejsze logi
takie logi z cyklów mogą nas interesować z tego względu że
powiedzmy garbage collector w zależności od tego jakiego algorytmu używa może
klinować poszczególne powiedzmy fragmenty heap'u czasami
klinuje na przykład całość tak i powiedzmy te fazy różnie mogą
trwać w sensie niektóre wymagają zatrzymania całego jvm a niektóre nie aby
dodać sobie logi naszego garbage collector'a możemy wykorzystać parametry
jvm po prostu podajemy taki parametr tak i
tutaj wskazujemy plik do którego ma być logowane powiedzmy właśnie
akcje garbage collector'a tutaj jeszcze podałem sprecyzowałem
jaki dokładnie algorytm garbage collectora ma być używany z tego
względu że algorytm serial jest powiedzmy jedną z takich takich prostszych na których
będę mógł ci wyjaśnić mniej więcej co tam się dzieje w środku tak tak jak sobie
uruchomię ten program on powiedzmy tam rusza teraz on odczekuje jakiś tam
czas gdybyśmy sprecyzowali w naszym powiedzmy thread sleep no
i tutaj powinien nam się pojawić teraz plik gc log tak ten plik nam
tutaj będzie przyrastał teraz tak długo jak powiedzmy nasz program działa
tak i on na początku jak go to na początek poczytamy mówi jakiego
powiedzmy algorytmu garbage collector używa no i teraz dalej go
czytając pierwszą rzeczą która tutaj może nas interesować to jest w jakim czasie
to zostało wykonana poszczególna linijka tutaj powiedzmy mam takie timestamp'y
względem tego kiedy został uruchomiony nasz jvm i później mamy
trochę powiedzmy jakiś takich informacji które nas teraz na razie nie interesują i później
to co się stało tak powiedzmy to jest pauza młodej
generacji tak pause young teraz o co chodzi z tym young to
są już takie rzeczy które wymagają zrozumienia tego jak poszczególne
algorytmy garbage collector'a działają tutaj powiedzmy jeżeli chcesz
się dowiedzieć jak to dokładnie działa to proponuję ci poczytać coś o samych
tak jakby garbage collector'ach z tego względu że jest to dość obszerne
i nie jest takie proste tak tutaj zdradzę ci że większość
algorytmu garbage collector'a dzieli sobie heap na pewne strefy na
przykład na młodą właśnie strefę czyli na young oraz powiedzmy na old
generation tak tak jakby chodzi o to żeby ten heap podzielić na te
strefy i obiekty rozmieszczać po tych strefach w zależności na
przykład od tego jak długo dane obiekty już żyją to wynika z tego że często
statystycznie obiekty które żyją już długo jakiś czas
w naszej aplikacji jest mniejsze prawdopodobieństwo że one za jakiś
długi okres znikną więc powiedzmy jeżeli garbage collector sobie podzieli nasz
heap na te strefy to może decydować które strefy kiedy powiedzmy
odśmiecać w ten sposób ograniczać powiedzmy właśnie pauzy ok
tutaj dalej jak pójdziemy to jest przyczyna czyli powiedzmy alokacja
się nie udała na przykład zabrakło miejsca tak że coś w stylu dlatego
na przykład właśnie wykonano właśnie pauzę i kolekcje no i później
jest rozmiar tej strefy którą tutaj mieliśmy tak czyli young
przed i po tak oraz cały rozmiar a w tym momencie wykorzystywanego
heap'a tak rozmiar zalokowany na heap tak naprawdę na koniec
mamy coś coś z najciekawsze a mianowicie to ile trwało powiedzmy wykonanie
tej kolekcji tak okej i później jak sobie pójdziemy to jeszcze mamy pause
full i w momencie kiedy jest zrobiony pause full tak w przypadku tego
algorytmu tak naprawdę finalizowana cała aplikacja w tym momencie tak
tak jakby on musi zatrzymać działanie wszystkiego żeby
mógł przelecieć i sprawdzić czy gdzieś u nas na heap'ie nie ma właśnie tych
samotnych wysp pamiętajmy że te obiekty ciągle żyją nie więc
właśnie po to robi tą pauzę okej i takich pauz najchętniej byśmy w
ogóle unikali okej tak jak mówiłem jeżeli chcesz wiedzieć więcej o
garbage collectorze to już odsyłam cię tak jakby do kursów i do
do artykułów poświęconych samemu garbage collectorowi ale już teraz
wiesz jak takie podstawowe informacje o tym co się dzieje wyciągnąć pierwsza rzecz
to że możemy zajrzeć właśnie w ten wykres w visualvm a kolejna
rzecz jeżeli już potrzebujesz wiedzieć ile poszczególne kolekcje i fazy
trwały no to właśnie możesz sobie dodać odpowiednie parametry do naszej
vm no i po prostu sobie to logować okej to
wszystko co chciałem ci pokazać dzięki wielkie i do usłyszenia