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 trochę bardziej przyjrzymy się heap'owi
możliwości wysterowania jego maksymalnego rozmiaru oraz
tak zwanym heap dump mam tu krótki javowy program który
ma na celu nic innego jak po prostu zapchanie naszego heap'a po prostu
do jakiejś linked listy tak która ma nieograniczony rozmiar tak naprawdę ogranicza ją
tylko heap ładujemy powiedzmy jakieś obiekty z
ciekawe czy da się zrobić coś takiego jak new object po prostu tworzymy obiekt tak
okej i tutaj jest dość taka powiedzmy spora liczba że
raczej nie dolecimy do samego końca tak na początku jest jeszcze 10
sekundowy thread sleep który ma na celu po prostu pozwoleniem podpięcia
się wcześniej visualvm okej uruchommy ten program na razie bez
żadnych ograniczeń na heap'ie no okej jak widzimy nasz program teraz
tworzy te obiekty dodaje do link listy i zasadniczo to się będzie
pisało cały czas do góry okej teraz to wyłączmy okej
program został zatrzymany zasadniczo taka sytuacja w której
nie ograniczamy odgórnie powiedzmy z wykorzystaniem jakichś
parametrów naszego heap'a w środowiskach produkcyjnych raczej
spotykana raczej wolimy założyć że nasz program może
od tylu do tylu powiedzmy zajętości chipa wykorzystać
tak wynika to z tego że na środowiskach produkcyjnych często mamy
powiedzmy kilka procesów javowych na przykład jakieś flinki kafki a
to wszystko może się znajdować na jednej maszynie i nie chcemy doprowadzić do sytuacji kiedy na
przykład jakiś memory leak czy wyciek pamięci w jednej aplikacji może
spowodować wykradanie ramu innym programom prawda więc
wolimy powiedzmy ustawić jakiś maksymalny heap też drugą rzeczą
jest to że jeżeli ustawiamy maksymalny heap to w ten sposób trochę determinujemy
to jak działa garbage collector czyli mechanizm on tutaj jest
tak który odśmieca nam nasz heap tak jeżeli tworzymy jakieś
obiekty i one nie są potrzebne stracimy powiedzmy referencje
do tych obiektów bądź obiekty swoimi referencjami tworzą
tak zwane samotne wyspy to są powiedzmy kandydatami do sprzątnięcia właśnie przez
garbage collector no właśnie tylko garbage collector też różnie
działa w zależności od tego ile wolnej pamięci na heap'ie zostało więc
zawsze warto ograniczyć trochę tego heap'a tak powiedzmy
już znając powiedzmy jakąś charakterystykę tego jaki jest
nasz program powinniśmy dobrać właściwą tutaj wartość okej
teraz zróbmy to powiedzmy dla naszego programu okej
tutaj z poziomu idei niech sobie uruchamiamy nasz program to możemy wejść
w run naszego main'a i wtedy możemy wyedytować powiedzmy konfigurację
w jakiej jest odpalany ten program tutaj mam takie miejsce jak vmoptions
tutaj możemy właśnie przekazać te parametry które później trafiają
do maszyny wirtualnej okej to co tutaj wprowadzę to jest
ograniczenie powiedzmy naszego heap'a do 128mb tak
to działa w ten sposób a po prostu mx to jest maksymalny heap
w tym miejscu okej jak teraz to uruchomimy tak
to nasz program szybko się zakończy ponieważ nie starczy miejsca
jak widzimy nasz proces zakończył się z takim exeption'em
out of memory error java heap space to jest po prostu informacja
o tym że nasz heap doszedł do miejsca w którym on już nie mógł dalej rosnąć tak
też nie szło za bardzo powiedzmy sklinować przez
garbage collector te obiekty które stworzyliśmy ponieważ my je trzymamy na liście
i tak naprawdę trzymamy cały czas do nich referencje więc one nie są kandydatami
do usunięcia w tym momencie no czyli mamy tak zwanego właśnie memory leak'a okej
w tej sytuacji sprowokowaliśmy sami tego właśnie heap overflow to
co tutaj dostaliśmy ale też powiedzmy na pewnych systemach produkcyjnych czy
właśnie powiedzmy też które są bardziej skomplikowane jeżeli dostajemy
out of memory error to może chcielibyśmy dostać jakąś informację o tym
co tak naprawdę go spowodowało no przepełnienie heap'a tak no
ale dobrze by było wiedzieć co na tym heap'ie na przykład się znajdowało i
tutaj z pomocą przychodzi coś takiego jak heap dump możemy
stworzyć powiedzmy pełne takie zestawienie takie statystyki tego
co jest w danym momencie na heap'ie takie obiekty jakich klas
w jakich ilościach i też możemy wywołać sobie takie zestawienie i jego
powiedzmy ono jest generowany do pliku możemy sobie tak jakby
zeschedulować jego generowanie w momencie jeżeli poleci nam taki exception
tak akurat out of memory error okej to też robi
się z wykorzystaniem pewnego parametru jvm'a okej tym parametrem
jest heap dump out of memory error tak ten parametr
ta flaga nam pozwoli na wygenerowanie heap dump'a i co
jeszcze podajemy drugą flagę która mówi nam gdzie ma się znaleźć plik tak jak
ma nazywać plik w którym będzie właśnie ten heap dump niech
to będzie dump hprof po prostu uruchommy teraz ten program okej
i nasz program znowu rzucił out of memory error ale jeszcze chwilę później
wygenerowany został właśnie heap dump do tego wskazanego przez nas
pliku okej z jakiegoś powodu idea nie pokazuje plików z rozszerzeniem
hprof ale on i tak się znajduje możemy sobie znaleźć
w naszej przeglądarce plików tak on jest w tym miejscu i teraz
tak utworzony plik jak sobie zajrzymy do środka on nie jest za bardzo czytelny zasadniczo nie
idzie go samodzielnie czytać możemy go wczytać różnymi programami do
analizy właśnie heap dump'ów między innymi jednym z nich jest
visualvm po prostu wchodzimy file load i
tutaj wskazujemy nasz dump zostaje wczytany chwilę to zajmuje okej
w pierwszej kolejności dostajemy jakieś takie zestawienie tego ile powiedzmy ten
heap zajmował w bajtach ile było klas ile było instancji klas prawda no
powiedzmy to za dużo nam nie mówi ale możemy wejść w objects tutaj mam powiedzmy
jakieś takie zakładki no i okej tutaj już mamy zestawienie
klas poszczególnych oraz mamy liczbę instancji
tak to już są poszczególne instancje tych klas i w
ten sposób możemy iść powiedzmy znaleźć sobie klasy
i jej obiekty które tak na prawdę spowodowały nasz memory leak nie zawsze to jest
proste ale tutaj już na pierwszy rzut oka widać że jest
podejrzana liczba obiektów typu note z link listy tak
a w nich nie siedzi nic innego jak nasz object nas to nie dziwi tak ale
powiedzmy gdybyśmy mieli jakiś program który nie wiemy dlaczego ma
jakiś wyciek czy może nie wiemy czy jest wyciek i może po prostu heap jest za
mały tak ale w momencie kiedy on przebije właśnie maximal
heap tak ten parametr ustawiliśmy na to wtedy powiedzmy
że jeżeli wygenerujemy sobie taki właśnie tak heap dump no
to wtedy jestem w stanie zbadać sytuację prawda i ewentualnie trochę dotweakować
na przykład naszą aplikację czy może poprawić jakiegoś bad'a okej
jeszcze jedną rzecz którą chciałem pokazać to że też taki sam heap
dump możemy zrobić na żądanie nie tylko w momencie kiedy poleci tam out
of memory error ale możemy też wykonać go klikając tutaj heap dump na
działającej aplikacji tak dostaniemy dokładnie to samo od razu nam się pojawi też ten
ta zakładka którą możemy przeglądać okej to
wszystko co chciałem ci pokazać w tej lekcji dzięki wielkie i do usłyszenia