Powinieneś: mieć doświadczenie w programowaniu w języku Java znać podstawy zarządzania pamięcią w wirtualnej maszynie
|
|
- Leszek Przybylski
- 9 lat temu
- Przeglądów:
Transkrypt
1 Zarządzanie pamięcią w Sun JVM Artykuł jest próbą uporządkowania wiedzy z zakresu zarządzania pamięcią w wirtualnej maszynie Javy. Opisuje sposoby zarządzania pamięcią, pokazuje jaką rolę w zarządzaniu odgrywa garbage collector, opisuje szczegółowo implementację GC oraz wskazuje metody poprawiania efektywności automatycznego odśmiecania pamięci. Publikacja przedstawia kolejno: typy pamięci w JVM, ogólny algorytm odśmiecania, szczegółowe omówienie garbage collector'ów w implementacji Sun Hotspot JVM, parametry pozwalające optymalizować JVM w kontekście zarządzania pamięcią, typy wyjątków związanych z pamięcią, typy referencji do obiektów i ich związek z odśmiecaniem pamięci. Dowiesz się: o zarządzaniu pamięcią w Sun JVM typach GC metodach optymalizacji GC Powinieneś: mieć doświadczenie w programowaniu w języku Java znać podstawy zarządzania pamięcią w wirtualnej maszynie Notatka od autora: W artykule wiele terminów zostało bezpośrednio zaczerpniętych z języka angielskiego i nie zostały one przetłumaczone na język polski tak, aby nie wprowadzać terminologii, która byłaby niejasna lub do której programista nie jest przyzwyczajony. Są one oznaczone kursywą. Dodatkowo w artykule stosuje się zamiennie terminy odśmiecacz pamięci, garbage collector oraz skrót GC. W artykule jako twórcę JVM podaje się firmę Sun, natomiast obecnie właścicielem produktów Sun jest firma Oracle. Podział pamięci w JVM Na wstępie omówię podział pamięci w JVM, co pozwoli wyobrazić sobie jak wirtualna maszyna przechowuje dane naszego programu. W JVM mamy kilka miejsc gdzie są przechowywane dane, należą do nich: liczniki rozkazów, stos, sterta, przestrzeń metod, przestrzeń stałych czasu wykonania, stos metod natywnych. Liczniki rozkazów JVM przechowuje w nich adresy aktualnie wykonywanych instrukcji maszyny wirtualnej. Każdy wątek powołany do życia w JVM ma swój własny licznik rozkazów. Stos JVM Każdy wątek powołany do życia ma swój własny stos wywołań metod. Na stosie są odkładane ramki wywołań metod. Ramka jest wydzielonym obszarem pamięci dla metody. Nowa ramka jest tworzona w momencie wywołania nowej metody. Natomiast w momencie powrotu z wywoływanej metody, wskaźnik stosu przesuwa się na początek miejsca gdzie została zaalokowana ramka dla metody, co umożliwia ponowną alokację tej części stosu. Każda ramka przechowuje zmienne lokalne, operand stack i dodatkowe informacje ramki (pozwalające na obsługę powrotu z funkcji oraz obsługę wyjątków). Aktywna może być tylko jedna ramka, gdyż jeden wątek może wykonywać jedną metodę w tym samym czasie. Operand stack jest to stos wywołań dla instrukcji bytecode'u javy. Dla przykładu jeśli wywołujemy instrukcję iadd, która reprezentuje dodawanie dwóch liczba całkowitych, to metoda ta zdejmuje dwie liczby z operand stack i wynik swego działania umieszcza ponownie na operand stack. Sterta Miejsce gdzie alokowane są obiekty dla naszego programu. W dalszej części artykułu zostanie ona szczegółowo omówiona, gdyż jest istotna z
2 punktu widzenia działania GC. W tym miejscu należy dodać, że sterta jest współdzielona pomiędzy wszystkimi wątkami. Przestrzeń metod Przechowywane są tu dane dla klas, takie jak pola statyczne, kod metod i konstruktorów oraz Runtime Constant Pool dla każdej klasy. Fizycznie znajduje się w przestrzeni permanent generation sterty. Przestrzeń ta jest dzielona pomiędzy wszystkie wątki. Przestrzeń stałych czasu wykonania (Runtime Constant Pool) Jest to tablica symboli. Przechowuje dane z constant pool table z pliku class. Zawiera odwołania symboliczne do: binarnych reprezentacji klas i interfejsów, pól i metod klas, metod interfejsów. Dodatkowo zawiera literały stringowe. Stos metod natywnych Wirtualna maszyna dla wywołań metod natywnych wykorzystuje tradycyjny stos znany z języka C. Ogólny schemat organizacji pamięci przedstawia rysunek 1. Nie zawiera on informacji o stercie. Rysunek 1: Schemat organizacji pamięci w Sun JVM Automatyczne zarządzanie pamięcią i odśmiecanie Java w dużej mierze eliminuje trudną i generującą mnóstwo błędów potrzebę zarządzania pamięcią. W Javie robi to odśmiecacz pamięci. GC monitoruje zajętość sterty i podejmuje decyzję kiedy rozpocząć proces odśmiecania pamięci sterty. Programista powołuje obiekt do życia i nie martwi się jego usunięciem w momencie zakończenia korzystania z obiektu (wyjście z danego zakresu programu- bloku, funkcji). Obiekt będzie istniał w pamięci do momentu uruchomienia procesu odśmiecania. Jeśli w momencie odśmiecania GC stwierdzi, że nie ma referencji do obiektu w programie, usunie nieużywany obiekt. Oczywistą wadą automatycznego zarządzania pamięcią jest jego wydajność w stosunku do zarządzania manualnego przez programistę. Niemniej jednak korzyści wynikające ze zmniejszenia liczby błędów są na tyle znaczące, że stało się ono normą w nowoczesnych językach programowania (Java, C#). Z automatycznym zarządzaniem pamięcią wiążą się również inne problemy, które mają istotny wpływ na samą implementację odśmiecaczy pamięci. Należą do nich: bezpieczne usuwanie obiektów nieużywanych (należy usuwać tylko obiekty, które już nigdy nie będą używane przez nasz program) zapobieganie fragmentacjom pamięci sterty (fragmentacja pamięci sterty obniża znacząco efektywność automatycznego zarządzania pamięcią) efektywne działanie zapobiegające długim przerwom w pracy aplikacji skalowalność (poprawne działanie mechanizmu na wielu procesorach) Ogólny algorytm odśmiecania pamięci W tej sekcji opiszę ogólny mechanizm odśmiecania pamięci. Większość implementacji odśmiecania jest jego wariacją. Proces odśmiecania można podzielić na trzy istotne etapy: faza oznaczania (mark) faza wymiatania (sweep) faza złączania (compact) W niektórych implementacjach nie występuje faza trzecia. W części pierwszej fazy oznaczania zostają zidentyfikowane wszystkie obiekty będące na stosach aktywnych wątków, zmiennych statycznych oraz referencji JNI. Wszystkie stają
3 się korzeniami drzewa obiektów przez które będzie przechodził GC w celu oznaczenia osiągalnych obiektów na stercie. Druga część tej fazy to przejście przez drzewo obiektów i oznaczenie obiektów osiągalnych. W fazie wymiatania GC identyfikuje wszystkie obszary pamięci zajmowane przez obiekty, które nie są osiągalne i oznacza je jako obszary dopuszczone do ponownej alokacji. Po zakończeniu fazy wymiatania struktura sterty może uleć fragmentacji, czyli występowaniu wielu obszarów niezaalokowanych pomiędzy obszarami gdzie znajdują się używane obiekty, to spowalnia proces alokacji, dodatkowo może to doprowadzić do sytuacji, w której mamy dużo wolnej pamięci, w której nic nie możemy zaalokować, bo poszczególne obszary są zbyt małe, żeby w nich zmieścić obiekt. Aby rozwiązać wyżej opisany problem często implementuje się algorytm złączania nieużywanych obszarów pamięci w celu ograniczenia fragmentacji pamięci. Jest to faza złączania algorytmu odśmiecania pamięci. Sposoby realizacji algorytmu odśmiecania pamięci Algorytm odśmiecania pamięci może być zaimplementowany w różnoraki sposób. Wybrany przez twórców określonego JVM ma istotny wpływ na jego efektywność. W tabeli 1 znajdują się możliwe podejścia do implementacji odśmiecacza pamięci. Każde z zamieszczonych w tabeli podejść ma swoje wady i zalety. Przedstawiam je dokładnie przy prezentowaniu poszczególnych garbage collector'ów, gdyż każdy z omawianych w dalszej części GC wykorzystuje inne podejście w wymienionych aspektach. Aspekty Wielowątkowość Współbieżność Przeciwdziałanie fragmentacji Możliwe rozwiązania Aplikacja i GC używają tego samego wątku Podejście stop-theworld, GC zatrzymuje pracę aplikacji do momentu zakończenia oczyszczania pamięci Kompaktowanie pamięci lub kopiowanie obiektów żyjących do nowego obszaru sterty. Zapobiega fragmentacji pamięci, dodatkowo podobnie jak kompaktowanie przyspiesza czas późniejszej alokacji obiektów na stercie. Aplikacja i GC używają innych wątków GC pracuje współbieżnie z aplikacją, są tylko krótkie przerwy w pracy aplikacji. Nie da się zapewnić całkowitej współbieżności ze względu na konieczność oznaczania zbioru obiektów wykorzystywanych przez aplikację Brak kompaktowania Tabela 1: Sposoby realizacji procesu odśmiecania Organizacja sterty w Hotspot Sun JVM Sterta w maszynie wirtualnej Sun jest podzielona na następujące obszary: eden, survivor1, survivor2, tenured oraz permanent generation. Przedstawia to rysunek 2. Rysunek 2: Schemat podziału pamięci sterty w Sun JVM Obszar eden, survivor1, survivor2 zwany jest młodą generacją. Obszar tenured oraz permanent generation (perm gen) nosi nazwę dojrzałej generacji. Zaprezentowany podział sterty będzie przywoływany wielokrotnie w dalszej części artykułu. W obszarze eden znajdują się nowo zaalokowane obiekty. W obszarze survivor1 oraz survivor2 znajdują się obiekty, które przetrwały przynajmniej jedno odśmiecanie pamięci. W obszarze tenured znajdują się obiekty, które przetrwały kilka odśmiecań. Omawiam to szczegółowo dla poszczególnych
4 garbage collector'ów. W obszarze permanent generation mamy zbiór obiektów reprezentujących pola klas, metody klas włączając ich bytecode'y, tablicę obiektów zawierających odwołania do metod, obiekty wewnętrzne JVM oraz przestrzeń stałych czasu wykonania. Wymienione tutaj elementy składowe zostały omówione w sekcji Podział pamięci w JVM. Proces odśmiecania w Hotspot Sun JVM Od implementacji java 1.5se update 6 wszystkie garbage collector'y są generacyjne i uwzględniają czas życia obiektu na stercie. W wirtualnej maszynie Sun proces odśmiecania można podzielić na dwa podprocesy: odśmiecanie częściowe (minor collection) dotyczące młodej generacji oraz odśmiecanie pełne (major collection) dotyczące dojrzałej generacji. Proces odśmiecania został podzielony na dwa podprocesy ze względu na konieczność poprawy efektywności odśmiecania. Po pierwsze odśmiecanie częściowe jest częstsze i zajmuje się usuwaniem krótkożyjących obiektów, odśmiecanie pełne jest sporadyczne i dosyć kosztowne z punktu widzenia czasu pracy garbage collector'a. Jeśli kończy się pamięć dla młodej generacji następuje odśmiecanie częściowe, natomiast jeśli kończy się pamięć dla dojrzałej generacji następuje odśmiecanie pełne. Przebieg każdego podprocesu jest zgodny z ogólnym algorytmem odśmiecania pamięci, czyli występują w tych podprocesach fazy: oznaczania, wymiatania i ewentualnie kompaktowania. Typy odśmiecaczy pamięci W Sun JVM możemy wyróżnić trzy typy GC: Serial GC Parallel GC zwany również Throughput GC Concurrent Low Pause GC zwany również CMS GC Serial GC wykorzystuje ten sam wątek do odśmiecania (w odśmiecaniu częściowym i pełnym), który obsługiwał aplikację. Aplikacja zostaje zatrzymana (podejście stop-the-world) do momentu zakończenia odśmiecania młodej oraz dojrzałej generacji. Żyjące i odpowiednio dojrzałe obiekty (które były nowo zaalokowane i oznaczone jako osiągalne w bieżącym odśmiecaniu) z przestrzeni eden są kopiowane do przestrzeni survivor2 (to). Obiekty zbyt duże, aby pomieścić się w wolnej przestrzeni survivor2 (to) są od razu kopiowane do przestrzeni tenured. Obiekty, które znajdowały się w przestrzeni survivor1 (from) i przetrwały jedno odśmiecanie są przenoszone do survivor2 (to). Obiekty, które przetrwały kilka odśmiecań w przestrzeni survivor1 (from) są przenoszone z tej przestrzeni do przestrzeni tenured. Po zakończeniu danego odśmiecania, przestrzeń to staje się przestrzenią from do następnego odśmiecania, przestrzeń eden jest pusta, bo obiekty które są osiągalne zostały przeniesione do przestrzeni from i nie ma jeszcze nowo zaalokowanych obiektów. Przestrzeń to również jest pusta. Dla lepszego wyobrażenia proces odśmiecania został zaprezentowany na rysunkach 3-6. Rysunek 3: Schemat sterty wraz z obiektami przed rozpoczęciem odśmiecania Rysunek 4: Schemat sterty wraz z obiektami w czasie odśmiecania Serial Garbage Collector Włączenie podanego GC wymaga użycia opcji -XX:+UseSerialGC.
5 world. Używany algorytm odśmiecania jest taki sam jak dla Serial GC czyli mark-sweepcompact w wersji jednowątkowej. Rysunek 5: Schemat sterty wraz z obiektami po zakończeniu odśmiecania Rysunek 6: Schemat sterty wraz z obiektami po zakończeniu odśmiecania i zamianie przestrzeni to i from Pełne odśmiecanie (major collection) działa następująco: generacja tenured jest odśmiecana za pomocą typowego algorytmu mark-sweepcompact przedstawionego na początku artykułu w sekcji Ogólny algorytm odśmiecania. Przebiega on tutaj według etapów: obiekty osiągalne z korzeni drzewa obiektów zostają oznaczone. Obiekty nieosiągalne zostają wymiecione. Wszystkie obiekty żyjące zostają przeniesione na początek przestrzeni tenured, tak aby nie zostawały dziury w pamięci, prowadzące do fragmentacji. To pozwala na ponowną alokację na stercie po ostatnim zajętym fragmencie. Opisany GC najlepiej sprawdza się dla aplikacji desktopowych z pojedynczym CPU. Szczegóły dotyczące stosowania poszczególnych GC zostały przedstawione w sekcji Sposób postępowania przy optymalizacji pracy JVM. Throughput Garbage Collector Włączenie wymienionego GC wymaga użycia opcji -XX:+UseParallelGC. Dla wymienionego garbage collectora odśmiecanie młodej generacji (minor collection) jest zrównoleglone (wiele wątków zajmuje się odśmiecaniem). Ich użycie proporcjonalnie skraca czas odśmiecania w stosunku do wersji jednowątkowej. W procesie odśmiecania pełnego (major collection) wykorzystano podejście stop-the- W java 1.5se update 6 rozbudowano powyższy garbage collector nadając mu nazwę Parallel Compacting Collector, który uruchamiany jest za pomocą opcji -XX:+UseParallelOldGC. W procesie odśmiecania młodej generacji wykorzystuje się algorytm ten sam co w zwykłym Parallel Collector. Natomiast odśmiecanie dojrzałej generacji ma specjalny algorytm odśmiecania. Sterta jest dzielona na obszary, które są obsługiwane przez osobne wątki w zakresie oznaczania ich życia. Pojawia się dodatkowa faza podsumowania (summary phase), w której znajdowany jest punkt graniczny złączania pamięci. Obszar na początku sterty jest mniej podatny na fragmentację, dlatego znajduje się punkt graniczny (dense prefix) sterty, od którego warto rozpocząć kompaktowanie. Tylko część sterty na prawo od tego znacznika jest poddawana kompaktowaniu. Rysunek 7: Porównanie działania Serial i Parallel GC Ten odśmiecacz jest wybierany domyślnie dla serwerowych odmian JVM. Concurrent Low Pause Collector Włączenie tego typu GC wymaga użycia opcji -XX:+UseConcMarkSweepGC. Ten typ GC przewiduje wykorzystanie wielu wątków w procesie odśmiecania częściowego oraz pełnego. Odśmiecanie częściowe działa identycznie jak
6 w Parallel GC. Odśmiecanie pełne używa algorytmu mark-sweep-compact omówionego na początku artykułu tylko w wersji równoległej. Większość pracy odbywa się współbieżnie z aplikacją. Na początku rozpoczyna się oznaczanie początkowe (initial mark), w której identyfikujemy obiekty żyjące osiągalne z aplikacji (set of roots). Jest to operacja przeprowadzana przez jeden wątek. Rozpoczyna się faza oznaczania, która obsługuje wiele wątków. Ponieważ aplikacja cały czas działa, nie wszystkie obiekty mogą zostać oznaczone jako osiągalne. Dlatego mamy fazę ponownego oznaczania (remark), która identyfikuje obiekty zmodyfikowane podczas pierwszego oznaczania. Faza ta jest zrównoleglona, ale aplikacja zostaje zatrzymana, żeby nie doszło do modyfikacji kolejnych obiektów. Rysunek 8: Porównanie działania Serial GC oraz CMS GC Opisywany GC jest jedynym odśmiecaczem, który nie ma fazy kompaktowania. Ponieważ może dojść do fragmentacji pamięci ten GC ma możliwość łączenia sąsiednich bloków pamięci. Dodatkowo ma on funkcję Incremental Mode, która pozwala na podział żądań pomiędzy wątki dla odśmiecania młodej generacji. Podzielone żądania są wykonywane na zmianę z aplikacją. Ta funkcjonalność jest użyteczna, gdy mamy mało procesorów dostępnych dla JVM. Włączenie funkcji wymaga użycia argumentu -XX: +CMSIncrementalMode. Powyższy odśmiecacz powinniśmy stosować, jeśli dla naszej docelowej aplikacji musimy zminimalizować przerwy w jej pracy. Jest on idealny dla systemów internetowych. Podsumowanie pracy GC Serial GC Współbieżność Wielowątkowość Odśmiecanie częściowe i pełne jest w trybie stop-the-world GC i aplikacja - ten sam wątek Kompaktowanie Odśmiecanie częściowe - kompaktowanie przez kopiowanie (część sterty jest pusta) Odśmiecanie pełne - kompaktowanie przez kopiowanie (przeniesienie na początek obszaru dojrzałej generacji) Parellel GC Współbieżność Wielowątkowość Odśmiecanie pełne w trybie stopthe-world Odśmiecanie częściowe w trybie równoległym GC i aplikacja - różne wątki Kompaktowanie Odśmiecanie częściowe - kompaktowanie przez kopiowanie (część sterty jest pusta) Odśmiecanie pełne - kompaktowanie przez kopiowanie (przeniesienie na początek obszaru dojrzałej generacji) ParellelCompacting GC Współbieżność Wielowątkowość Odśmiecanie pełne w trybie stopthe-world Odśmiecanie częściowe w trybie równoległym GC i aplikacja - różne wątki Kompaktowanie Odśmiecanie częściowe - kompaktowanie przez kopiowanie (część sterty jest pusta) Częściowe kompaktowanie po wymiataniu w obszarze gęstym dla odśmiecania pełnego
7 CMS GC Współbieżność Wielowątkowość Kompaktowanie Odśmiecanie pełne w trybie równoległym Odśmiecanie częściowe w trybie równoległym GC i aplikacja - różne wątki Złączanie sąsiednich bloków pamięci wyłączenie opcji. -XX:opcja=wartość oznacza ustawienie określonej wartości dla podanej opcji. Niemniej jednak pojawiają się również opcje, które nie spełniają powyższej konwencji. Opcje monitorowania GC Poniższe opcje monitorowania należy wpisać jako argumenty uruchomienia procesu javy. Metryki pozwalające ocenić pracę garbage collector'a Pracę garbage collector'a możemy oceniać w czterech aspektach: przepustowości (throughput) procentowy udział czasu działania nie przeznaczonego na odśmiecanie do czasu całkowitego pracy JVM przerw w działaniu aplikacji (pause) czas, w których aplikacja przestaje działać na rzecz GC zajętości sterty (footprint) wielkość sterty będącej w użyciu dostępności (promptness) czas po jakim JVM po oznaczeniu obiektu jako nieosiągalnego, może ponownie w jego miejsce zaalokować nowy obiekt Wielkości te pozwalają porównać pracę opisywanych w artykule odmian garbage collector'ów. Konfiguracja opcji zarządzania pamięcią Wirtualna maszyna Javy daje programistom duże możliwości sterowania mechanizmem zarządzania pamięcią, w szczególności automatycznym odśmiecaniem. Poniższe kilka sekcji będzie prezentować poszczególne opcje. Najpierw zostaną przedstawione opcje pozwalające włączyć monitoring JVM oraz zostaną opisane rezultaty włączenia monitoringu. Sun stosuje następującą konwencję przy zapisywaniu opcji -XX:+opcja oznacza włączenie opcji, -XX:-opcja oznacza -verbose:gc Podstawowe informacje o każdym odśmiecaniu Przykładowy log: [GC K->83000K(776768K), secs] [GC K->83372K(776768K), secs] [Full GC K->83769K(776768K), secs] Powyższy log pokazuje wielkość sterty zajętą przez obiekty przed i po uruchomieniu GC. W nawiasie mamy aktualną wielkość sterty, oczywiście część tej sterty jest pusta. Podany czas jest czasem odśmiecania. Widzimy tutaj dwa procesy odśmiecania: częściowe (GC) oraz pełne (Full GC). -XX:+PrintGCDetails Dodatkowe informacje dotyczące pracy GC. Wymaga również włączenia opcji -verbose:gc. Przykładowy log dla Serial GC: [GC [DefNew: 64575K->959K(64576K), secs] K->133633K(261184K), secs] Pokazuje jaka część przetrwała odśmiecanie dla młodej generacji (część DefNew), pozostała statystyka wyświetla informacje jak dla verbose:gc -XX:+PrintGCTimeStamps Wyświetla to co dla opcji PrintGCDetails z dodatkowym znacznikiem czasu. Przykładowy log: : [GC : [DefNew: 8128K-> 8128K(8128K), secs] : [Tenured: 18154K->2311K(24576K), secs] 26282K-> 2311K(32704K), secs]
8 DefNew pokazuje wyniki odśmiecania dla młodej generacji, Tenured pokazuje wyniki odśmiecania dla dojrzałej generacji. -Xloggc:gc.log zapisuje logi gc do pliku. W podanym przykładzie jest to plik log.gc. Poniżej dłuższy przykład logu GC w wersji CMS GC: [GC [ParNew: 64576K->960K(64576K), secs] K->78078K(261184K), secs] [GC [ParNew: 64576K->960K(64576K), secs] K->79533K(261184K), secs] [GC [ParNew: 64576K->960K(64576K), secs] K->81128K(261184K), secs] [GC [1 CMS-initial-mark: 80168K(196608K)] 81144K(261184K), secs] [CMS-concurrent-mark: 0.129/0.129 secs] [CMS-concurrent-preclean: 0.007/0.007 secs] [GC[ Rescan (non-parallel) [ grey object rescan, secs][root rescan, secs], secs][weak refs processing, secs] [1 CMS-remark: 80168K(196608K)] 82493K(261184K), secs] [CMS-concurrent-sweep: 1.208/1.208 secs] [CMS-concurrent-reset: 0.036/0.036 secs] [GC [ParNew: 64576K->960K(64576K), secs] 66308K->4171K(261184K), secs] [GC [ParNew: 64576K->960K(64576K), secs] 67787K->5695K(261184K), secs] [GC [ParNew: 64576K->960K(64576K), secs] 69311K->7154K(261184K), secs] DefNew pokazuje wyniki odśmiecania dla młodej generacji, GC pokazuje wyniki odśmiecania dla dojrzałej generacji. Pokazane są czasy trwania poszczególnych faz: oznaczanie inicjalne (Cms-initial-mark), oznaczanie właściwe wielowątkowe, ponowne skanowanie referencji zmienionych (rescan). Kolejno następuje faza wielowątkowego wymiatania, trwająca 1,208 sekundy. Dla nas istotne jest ile czasu trwają fazy oznaczania początkowego (initial-remark) oraz ponownego oznaczania (rescan), gdyż one zatrzymują pracę aplikacji. W podanym przykładzie przerwa systemu wynosi około 0,0225 sekundy. Opcje konfigurujące podstawowe parametry GC Domyślna wielkość sterty w Sun Hotspot JVM wynosi 128MB dla maszyn 32-bitowych. Opcje -Xms=xxxM and -Xmx=xxxM pozwalają na ustawienie odpowiednio początkowej wielkości sterty oraz maksymalnej wielkości sterty. Opcja -XX:MaxPermSize=xxxM pozwala określić wielkość permanent generation. Parametry pozwalające na zarządzanie generacjami -XX:MinHeapFreeRatio=xx -XX:MaxHeapFreeRatio=yy Pierwszy parametr określa stosunek minimalnej wielkości wolnego miejsca na stercie do całej sterty, drugi parametr określa maksymalną ilość wolnej pamięci w stosunku do całej sterty. Wartości domyślne to odpowiednio 40, 70. Co oznacza, że jeśli wielkość wolnego miejsca na stercie spadnie poniżej 40% całej sterty, to zostanie zaalokowane więcej pamięci dla sterty. Jeśli wolne miejsce przekroczy 70% całkowitej wielkości sterty to część miejsca zostanie zwolniona. -XX:NewRatio=3 Oznacza, że stosunek pomiędzy wielkością sterty przeznaczoną na młodą i dojrzałą generacją wynosi 3 do 1. Implikacje wynikające ze strojenia tej wielkości są dosyć szerokie. Im większa sterta dla młodej generacji tym mniej odśmiecań częściowych i mogą być one dłuższe, gdyż GC będzie miał więcej zaalokowanej pamięci do przejrzenia. Jednocześnie mniejsza część sterty zostaje przeznaczona dla generacji dojrzałej, co wpływa na większą liczbę odśmiecań pełnych. Programista modyfikujący tą wielkość powinien uwzględniać podaną wskazówkę - jeśli mamy dużo długożyjących obiektów, to wtedy ta wartość powinna być mniejsza. Parametr ten jest istotny, gdyż jeśli obiekty z przestrzeni młodej generacji nie mogą zostać w kolejnych odśmiecaniach przesunięte do przestrzeni tenured, to wiele obiektów długożyjących będzie w przestrzeni młodej
9 generacji i będzie usuwanych w fazach odśmiecania częściowego, co wydłuży znacząco przebieg tej fazy. -XX:NewSize=xxxM Określa początkową część sterty przeznaczoną na młodą generację -XX:MaxNewSize=xxxM Określa maksymalną część sterty przeznaczoną na młodą generację -XX:SurvivorRatio=6 Określa stosunek wielkości przestrzeni survivor do przestrzeni eden. W podanym przykładzie jest to stosunek 6 do 1. Jeśli przestrzeń survivor będzie zbyt mała, wtedy obiekty będą bezpośrednio kopiowane do tenured, co wpływa na efektywność odśmiecań częściowych. W tym kontekście, że te obiekty będą mogły zostać usunięte tylko przez odśmiecanie pełne zamiast przez odśmiecanie częściowe. Opcje JVM dla poszczególnych GC Parallel Collector Parametr -XX:ParallelGCThreads=n -XX:MaxGCPauseMillis=n -XX:GCTimeRatio=80 Opis liczba wątków przeznaczona dla GC wskazówka maksymalnej długości pauzy (nie może przekraczać podanego czasu w milisekundach) stosunek czasu pracy aplikacji do czasu działa systemu (tutaj 20% czasu pracy jest poświęcana na GC) Wartość domyślna to 99, co oznacza ze 1% czasu pracy jest poświęcone na odśmiecanie Są jeszcze inne opcje, ich szczegółowy opis można znaleźć w dokumencie Sun dotyczącym optymalizacji pracy JVM. Powyżej zostały wymienione i opisane te najważniejsze. Do bardziej rozbudowanych opcji należą: -XX:YoungGenerationSizeIncrement=n -XX:TenuredGenerationSizeIncrement=n -XX:AdaptiveSizeDecrementScaleFactor=n Dokładny ich opis można znaleźć na stronie gc-tuning html. Concurrent Low Pause Collector Parametr -XX: CMSInitiatingOccupancyFraction =n -XX:ParallelGCThreads=n Opis jeśli zajętość przekroczy podaną wartość progową wtedy rozpoczyna się odśmiecanie generacji dojrzałej. Domyślna wartość to 92%. liczba wątków przeznaczona dla GC Dla włączonego IncrementalMode dodatkowo można ustawić opcje: Parametr -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX: CMSIncrementalDutyCycle=n Opis podział procesu GC na fazy czas pojedynczego cyklu jest budowany na podstawie statystyk JVM. W java se6 domyślnie włączone. procentowy podział czasu pomiędzy kolejnymi odśmieceniami częściowymi, które może wykorzystywać GC Niżej wymienione opcje nadpisują domyślne ustalane przez JVM parametry cykli, które JVM sam sobie ustawia na podstawie statystyk swojej pracy: -XX:CMSIncrementalDutyCycleMin=n -XX:CMSIncrementalSafetyFactor=n -XX:CMSIncrementalOffset=n -XX:CMSExpAvgFactor=n Dokładny ich opis można znaleźć na stronie gc-tuning html.
10 Sposób postępowania przy optymalizacji pracy JVM Sun zaleca, aby na ile to jest możliwe pozwolić JVM pracować na domyślnych wartościach parametrów pracy GC. Gdyż niepoprawna konfiguracji może wprowadzić więcej szkody, niż pożytku. Proponowana ścieżka postępowania przy optymalizacji GC dla JVM: Najpierw wybieramy domyślny GC. Ustalamy parametry optymalizacyjne, które z naszego punktu widzenia mogą poprawić efektywność pracy GC. Jeśli to za mało, to wybieramy sami inny GC. Jeśli musimy wybrać inny GC, to Sun zaleca postępowanie zgodnie z określoną heurystyką. Poniżej znajduje się heurystyka postępowania przy dobieraniu GC, kilka zaleceń zostało wcześniej wymienionych przy opisie poszczególnych GC. Jeśli sterta jest mniejsza niż 100MB, to wybieramy SerialGC. Jeśli pojedynczy procesor, to wybieramy SerialGC. Jeśli wydajność aplikacji najważniejszy i nie ma ograniczeń na dopuszczalne pauzy systemu czyli mogą być większe niż 1s to wybieramy ParallelGC lub ParallelOldGC. Jeśli czas odpowiedzi ważniejszy niż przepustowość oraz przerwy na GC nie mogą być dłuższe niż 1s to używamy ConcMarkSweepGC Zarządzanie pamięcią w kontekście programowania W dalszej części artykułu zostaną przedstawione zagadnienia pokrewne zarządzaniu pamięcią i bardziej dotykające pracy programisty w środowisku developerskim. Jak rozpoznawać problemy z zarządzaniem pamięcią. Typy błędów zgłaszanych przez JVM W JVM mamy sześć obszarów gdzie mogą znajdować się dane: rejestr pc, stos, sterta, przestrzeń metod, przestrzeń stałych czasu wykonania (Runtime Constant Pool), stos dla metod natywnych. Obszary te zostały opisane na początku artykułu, w tym miejscu wspomina się o nich w kontekście obszarów, w których mogą pojawić się wyjątki związane z zarządzaniem pamięcią, poza rejestrem pc. Dla niego nie występują wyjątki zarządzania pamięcią. Najistotniejsze z punktu widzenia błędów zarządzania pamięcią są stos oraz sterta. Stos dla JVM może być rozszerzany w czasie działania programu. Jeśli nie ma możliwości przydzielenia pamięci na stosie bądź nie ma pamięci dla stosu dla nowo utworzonego wątku wtedy JVM rzuca wyjątek java.lang.outofmemoryerror. Mamy więc dwie sytuacje dla stosu, w których może pojawić się wyjątek zarządzania pamięcią. Wyjątek java.lang.outofmemoryerror pojawia się znacznie częściej dla sterty. Zostaje on rzucony wtedy gdy nie można zaalokować nowego obiektu na stercie. Podobnie dzieje się dla przestrzeni metod, Runtime Constant Pool, stosu metod natywnych. Dla tych przestrzeni również zostanie rzucony wyjątek OutOfMemoryError, gdy nie można zaalokować odpowiednich obiektów w tych obszarach. Dodatkowo dla stosu może pojawić się również inny wyjątek, znacznie bardziej popularny, a mianowicie java.lang.stackoverflowerror. Wyjątek StackOverFlowError zostaje rzucony kiedy wirtualna maszyna potrzebuje więcej pamięci dla stosu lub stosu wywołań natywnych niż wynika to z konfiguracji wirtualnej maszyny. Maksymalny stos dla pojedynczego wątku można skonfigurować korzystając z opcji (-Xss, dla przykładu -Xss128k). Najczęstszą przyczyną błędu StackOverflowError nie jest jednak błędna konfiguracja wirtualnej maszyny, a stworzenie nieskończonego wywołania rekurencyjnego. Poniżej znajduje się dodatkowo omówienie OutOfMemoryError w zależności
11 od szczegółowej informacji wyjątku. Wyjątek java.lang.outofmemoryerror: Requested array size exceeds VM limit pojawia się wtedy, kiedy programista próbuje zaalokawać tablicę, która nie mieści się na stercie. Jest to błąd programistyczny. Należy zweryfikować poprawność kodu. Drugi najbardziej popularny błąd zarządzania pamięcią to java.lang.outofmemoryerror: PermGen space. Brakuje miejsca dla obiektów opisujących klasy i metody. Należy rozszerzyć stertę lub nadać więcej miejsca dla obiektów w przestrzeni permanent generation. W sekcji Opcje JVM są zdefiniowane parametry, które należy podać w konfiguracji JVM, aby powiększyć stertę przeznaczoną dla permanent generation. Odśmiecanie z puntu widzenia programisty Wszystkie zamieszczone informacje w tym artykule podają szczegółowe zasady zarządzania pamięcią w JVM. Część z tych informacji nie musi być istotna z punktu widzenia programisty, gdyż nie zawsze musi on wiedzieć szczegółowo jak działa automatyczne zarządzanie pamięcią w JVM. Z punktu widzenia programisty istotne są trzy aspekty: kiedy zostaje uruchomiony proces odśmiecania kiedy obiekt zostaje usunięty z pamięci co się dzieje z obiektem w momencie odśmiecania Programista może wysłać żądanie do GC z prośbą o rozpoczęcia odśmiecania wywołując metodę System.gc(), Runtime.gc(). Jednak jest to tylko prośba do GC o uruchomienie odśmiecania, jeśli GC stwierdzi, że rzeczywiście brakuje pamięci wtedy rozpocznie odśmiecanie, w przeciwnym wypadku nie podejmie żadnych działań. Tak więc programista nie ma wpływu na rozpoczęcie procesu odśmiecania. Druga istotna kwestia dla programisty, to proces postępowania JVM z obiektem, który nie jest już używany. Jeśli obiekt zostanie oznaczony jako nieużywany tzn. nie ma żadnej twardej referencji do niego i zostanie uruchomiony GC, wtedy następuje wywołanie metody finalize danego obiektu. Metoda finalize wykonuje się w niedeterministycznym porządku w stosunku do kolejności powoływania, a potem usuwania obiektów. Dodatkowo może się nie wykonać, jeśli zostanie wywołana metoda System.exit(). Dlatego nie należy zwalniać zasobów w tej metodzie, bo mogą one nigdy nie zostać zwolnione, co więcej będą one zwalniane w niedeterministycznym momencie w zależności od decyzji GC dotyczącej odśmiecania. Programista przeciążając finalize dla hierarchii obiektów musi pamiętać, żeby wywołać finalize obiektu wyżej w hierarchii gdyż nie zostanie to zrobione exlipicite. Powinna to być ostatnia akcja (super.finalize()) w naszym finalizatorze. Programista powinien również pamiętać, że jeśli zostanie rzucony wyjątek w finalize i nie jest on obsłużony w metodzie, to GC lekceważy wyjątek i kończy się finalizowanie obiektu. Typy referencji Typy referencji omówiono w tym artykule ze względu na ich wpływ na odśmiecanie pamięci. W JVM możemy wyróżnić kilka typów referencji do obiektów zaalokowanych na stercie. Istnieją twarde referencje, które tworzymy poprzez wywołanie operatora new i przypisanie obiektu do zmiennej. Tak ja poniżej: TestObject object = new TestObject(); Obiekt powiązany w taki sposób podlega odśmiecaniu w momencie zwolnienia wszystkich referencji do niego, czyli w tym przypadku ustawienia wartości referencji object=null. Ogólnie rzecz ujmując obiekt jest usuwany z pamięci, jeśli nie ma do niego żadnych referencji twardych z żadnego wykonywanego wątku, z żadnej statycznej klasy lub z jakiegoś obiektu do którego prowadzi twarda (zwykła) referencja. W JVM istnieje kilka innych odmian referencji
12 prowadzących do obiektów. GC może usunąć te obiekty pomimo, że są do nich ustawione referencje w programie. Należą do nich: SoftReference Obiekt do którego istnieje odwołanie przez SoftReference może zostać usunięty przez GC w momencie zbliżania się do końca pamięci sterty. Używamy jej gdy mamy jakiś zbiór obiektów, który może zostać ponownie załadowany z dysku, bazy danych (np.: obrazki przechowywane w pamięci dla aplikacji webowej) WeakReference WeakReference różnią się w stosunku do SoftReference tylko algorytmem sprawdzającym ścieżkę osiągalności obiektu. PhantomReference Obiekty osiągalne fantomowo, to są obiekty które już przeszły fazę finalizacji. Metoda get dla takiej referencji zawsze zwraca null. Ale dzięki kolejce ReferenceQueue możemy wykonać coś w systemie po etapie finalizacji określonego obiektu. Jest to bardzo wyszukane zachowanie i rzadko stosowane przez programistów. SoftReference i WeakReference wykorzystuje się do implementacji cache'y z użyciem HashMap, gdzie klucz jest obiektem osiągalnym poprzez taką referencję. Jeśli więc obiekt na który wskazuje klucz nie ma w czasie wykonania programu twardej referencji wskazującej na niego, to GC może taki klucz i obiekt wyrzucić z mapy, jeśli zacznie mu brakować pamięci. Mamy nawet specjalną odmianę mapy, która zapewnia mechanizm opisany powyżej WeakHashMap. Dla wymienionych wyżej typów referencji istnieje specjalna struktura ReferenceQueue pozwalająca ustalić, które obiekty wskazywane przez różne typy referencji zostały wyrzucone przez GC. Dla SoftReference i WeakReference do kolejki wpadają obiekty zaraz po usunięciu (gdy referencja wskazująca na obiekt zostaje ustawiona na null). Dla PhantomReference do kolejki wpadają obiekty, które są osiągalne tylko poprzez taką referencję, czyli po fazie finalizacji obiektu. Gdzie szukać dodatkowych informacji o JVM oraz o zarządzaniu pamięcią Literatura dotycząca poruszonego w artykule tematu jest dosyć uboga, do tego często chaotyczna zarówna w aspekcie treści jak również sposobu prezentacji. Poniżej zamieszczono kilka najważniejszych i nielicznych odnośników do literatury związanej z tematem: dex.jsp? topic=/com.ibm.java.doc.diagnostics.60/diag/understandi ng/mm_gc.html management_whitepaper.pdf options-jsp html html l/vmspectoc.doc.html Łukasz Baran Inżynier oprogramowania w firmie e-point S.A., gdzie zajmuje się projektowaniem i implementacją systemów internetowych w technologii JEE. Absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej oraz Szkoły Głównej Handlowej. Interesuje się platformą Java SE, Java EE oraz dobrymi praktykami programistycznymi. Kontakt: lukasz.baran@yahoo.com
Podstawy programowania obiektowego
Podstawy programowania obiektowego Technologie internetowe Wykład 5 Program wykładu Podejście obiektowe kontra strukturalne do tworzenie programu Pojęcie klasy i obiektu Składowe klasy: pola i metody Tworzenie
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE WINDOWS 1 SO i SK/WIN 006 Wydajność systemu 2 SO i SK/WIN Najprostszym sposobem na poprawienie wydajności systemu, jeżeli dysponujemy zbyt małą ilością pamięci RAM
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Języki programowania z programowaniem obiektowym Laboratorium
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Czym jest stos i sterta?
W języku C# istnieje kilka podstawowych typów danych. Na pierwszy rzut oka nie widać między nimi żadnej różnicy, jednak pojawia się w charakterystycznych sytuacjach takich jak przekazywanie parametrów
JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI
JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI Gdy wywołujesz daną funkcję, program przechodzi do tej funkcji, przekazywane są parametry i następuje wykonanie ciała funkcji. Gdy funkcja zakończy działanie, zwracana
dr inż. Jarosław Forenc
Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2010/2011 Wykład nr 7 (24.01.2011) dr inż. Jarosław Forenc Rok akademicki
Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.
Laboratorium 7 Wstęp Jednym z podstawowych własności Javy jest wielowątkowość. Wiąże się to z możliwością współbieżnego wykonywania różnych operacji w ramach pojedynczej wirtualnej maszyny Javy (JVM).
Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa
1 Java Wprowadzenie 2 Czym jest Java? Język programowania prosty zorientowany obiektowo rozproszony interpretowany wydajny Platforma bezpieczny wielowątkowy przenaszalny dynamiczny Rozumiana jako środowisko
Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
REFERAT O PRACY DYPLOMOWEJ
REFERAT O PRACY DYPLOMOWEJ Temat pracy: Projekt i budowa systemu zarządzania treścią opartego na własnej bibliotece MVC Autor: Kamil Kowalski W dzisiejszych czasach posiadanie strony internetowej to norma,
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Język programowania prosty bezpieczny zorientowany obiektowo wielowątkowy rozproszony przenaszalny interpretowany dynamiczny wydajny Platforma
Programowanie współbieżne Wykład 2. Iwona Kochańska
Programowanie współbieżne Wykład 2 Iwona Kochańska Miary skalowalności algorytmu równoległego Przyspieszenie Stały rozmiar danych N T(1) - czas obliczeń dla najlepszego algorytmu sekwencyjnego T(p) - czas
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Programowanie w języku C++
Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Backend Administratora
Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Logiczny model komputera i działanie procesora. Część 1.
Logiczny model komputera i działanie procesora. Część 1. Klasyczny komputer o architekturze podanej przez von Neumana składa się z trzech podstawowych bloków: procesora pamięci operacyjnej urządzeń wejścia/wyjścia.
Ogranicz listę klasyfikacji budżetowych do powiązanych z danym kontem księgowym
Zależności i kontrola danych budżetowych w systemie Sz@rk FK 1. Wstęp Począwszy od wersji Sz@rk FK 2011 (11.03.30) wprowadzono do programu finansowoksięgowego nowe możliwości dotyczące kontrolowania poprawności
1. Pamięć wirtualna. 2. Optymalizacja pliku pamięci wirtualnej
1. Pamięć wirtualna Jeśli na komputerze brakuje pamięci RAM wymaganej do uruchomienia programu lub wykonania operacji, system Windows korzysta z pamięci wirtualnej, aby zrekompensować ten brak. Aby sprawdzić,
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami
Rok akademicki 2015/2016, Wykład nr 6 2/21 Plan wykładu nr 6 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2015/2016
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura
Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Pierwsze kroki Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura Co znaczy
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język
1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4
Spis treści 1 Wątki 1 2 Tworzenie wątków 1 3 Synchronizacja 3 4 Dodatki 3 5 Algorytmy sortowania 4 6 Klasa Runnable 4 Temat: Wątki Czym są wątki. Grafika. Proste animacje. Małe podsumowanie materiału.
16MB - 2GB 2MB - 128MB
FAT Wprowadzenie Historia FAT jest jednym z najstarszych spośród obecnie jeszcze używanych systemów plików. Pierwsza wersja (FAT12) powstała w 1980 roku. Wraz z wzrostem rozmiaru dysków i nowymi wymaganiami
Tytuł szkolenia: Tworzenie wydajnego oprogramowania w języku Java - techniki zaawansowane
Kod szkolenia: J/ADV Tytuł szkolenia: Tworzenie wydajnego oprogramowania w języku Java - techniki zaawansowane Dni: 5 Opis: Adresaci Szkolenia: Szkolenie jest adresowane do programistów języka Java, którzy
Administracja i programowanie pod Microsoft SQL Server 2000
Administracja i programowanie pod Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 9 Optymalizacja zapytań Pobieranie planu wykonania Indeksy i wydajność - 1 - Zadania optymalizatora
Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++
Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
SYSTEM INFORMATYCZNY KS-SEW
DOKUMENTACJA TECHNICZNA KAMSOFT S.A. 40-235 Katowice ul. 1-Maja 133 Tel. (032) 2090705, Fax. (032) 2090715 http://www.kamsoft.pl, e-mail: 5420@kamsoft.pl SYSTEM INFORMATYCZNY NR KATALOGOWY 2334PI06.00
Wprowadzenie do programowania
do programowania ITA-104 Wersja 1 Warszawa, Wrzesień 2009 ITA-104 do programowania Informacje o kursie Zakres tematyczny kursu Opis kursu Kurs przeznaczony jest do prowadzenia przedmiotu do programowania
Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6
Zawartość Wstęp... 1 Instalacja... 2 Konfiguracja... 2 Uruchomienie i praca z raportem... 6 Wstęp Rozwiązanie przygotowane z myślą o użytkownikach którzy potrzebują narzędzie do podziału, rozkładu, rozbiórki
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Spis treści. 1 Moduł RFID (APA) 3
Spis treści 1 Moduł RFID (APA) 3 1.1 Konfigurowanie Modułu RFID..................... 3 1.1.1 Lista elementów Modułu RFID................. 3 1.1.2 Konfiguracja Modułu RFID (APA)............... 4 1.1.2.1
1. Opis. 2. Wymagania sprzętowe:
1. Opis Aplikacja ARSOFT-WZ2 umożliwia konfigurację, wizualizację i rejestrację danych pomiarowych urządzeń produkcji APAR wyposażonych w interfejs komunikacyjny RS232/485 oraz protokół MODBUS-RTU. Aktualny
Paradygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Rysunek 178. Programowanie monitorów KDS
9.3. GASTRO KDS Gastro KDS to wersja KDS przeznaczona do wyświetlania zamówień na urządzeniach z systemem Android. Do działania potrzebuje urządzenia z systemem Android w wersji co najmniej 4.0. Wykorzystuje
Java EE produkcja oprogramowania
Java EE produkcja oprogramowania PPJ PODSTAWY PROGRAMOWANIA W JAVIE PODSTAWY JĘZYKA JAVA 1 Warszawa, 2016Z 2 Ogólna charakterystyka języka Java 3 Java 1/2 Język programowania Java został opracowany przez
Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.
Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze
NETBEANS PROFILER TOMASZ ŁUKASZUK
NETBEANS PROFILER TOMASZ ŁUKASZUK STRESZCZENIE: Dokument zawiera podstawowe informacje dotyczące programu NetBeans Profiler. Stanowi uproszczoną instrukcję jego używania. Dotyczy NetBeans Profiler w wersji
A Study of Java`s Non-Java Memory. Remigiusz Mytyk
A Study of Java`s Non-Java Memory Remigiusz Mytyk Agenda 1. Wprowadzenie 2. Struktura pamięci 3. MARUSA 4. Micro-benchmarki 5. Macro-benchmarki 6. Modyfikacja JVM 7. Wnioski Wprowadzenie Wiele osób spotkało
Adam Kotynia, Łukasz Kowalczyk
Adam Kotynia, Łukasz Kowalczyk Dynamiczna alokacja pamięci Alokacja pamięci oraz dezalokacja pamięci jest to odpowiednio przydział i zwolnienie ciągłego obszaru pamięci. Po uruchomieniu, proces (program)
Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego
Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32
Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:
Zmiany funkcjonalne i lista obsłużonych zgłoszeń Comarch DMS , Comarch DMS i Comarch DMS
Zmiany funkcjonalne i lista obsłużonych zgłoszeń 2017.3.0, i 2017.3.2 1. Wstęp W niniejszym dokumencie zostały opisane modyfikacje wprowadzone w wersji 2017.3.0, i 2017.3.2. 2. Modyfikacje wprowadzone
Sieciowe Technologie Mobilne. Laboratorium 4
Sieciowe Technologie Mobilne Laboratorium 4 Tworzenie wieloplatformowych aplikacji mobilnych przy użyciu biblioteki PhoneGap. Łukasz Kamiński Laboratorium 4 Urozmaicone zostaną animacje potworów, aby odpowiadały
Programowanie Niskopoziomowe
Programowanie Niskopoziomowe Wykład 11: Procedury zaawansowane Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie Plan Wstęp Ramki stosu Rekurencja INVOKE, ADDR, PROC,
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Konfiguracja parametrów pozycjonowania GPS 09.05.2008 1/5
Konfiguracja parametrów pozycjonowania GPS 09.05.2008 1/5 Format złożonego polecenia konfigurującego system pozycjonowania GPS SPY-DOG SAT ProSafe-Flota -KGPS A a B b C c D d E e F f G g H h I i J j K
1 Moduł Lutron HomeWorks QS
1 Moduł Lutron HomeWorks QS Moduł Lutron HomeWorks QS daje użytkownikowi Systemu możliwość współpracy oprogramowania z urządzeniami firmy Lutron serii HomeWorks QS. System Vision może używać go do odbierania
JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Rysunek 1: Okno z lista
1 Urzadzenie RFID Urządzenie RFID, umożliwia użytkownikom systemu kontrolę dostępu do wydzielonych przez system stref, na podstawie odczytywanych TAG ów (identyfikatora przypisanego do użytkownika) z czytników
KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED
KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED Podręcznik użytkownika Katowice 2010 Producent programu: KAMSOFT S.A. ul. 1 Maja 133 40-235 Katowice Telefon: (0-32) 209-07-05 Fax:
Zamówienia algorytmiczne
Zamówienia algorytmiczne Strona 1 z 13 Spis treści 1. Działanie zamówień algorytmicznych... 3 2. Konfiguracja... 3 2.2 Włączenie zamówień algorytmicznych poprzez wybór typu zamówienia... 3 2.3 Włączenie
Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV
Piotr Jarosik, Kamil Jaworski, Dominik Olędzki, Anna Stępień Dokumentacja wstępna TIN Rozproszone repozytorium oparte o WebDAV 1. Wstęp Celem projektu jest zaimplementowanie rozproszonego repozytorium
Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.
Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,
Programowanie Obiektowe Ćwiczenie 4
Programowanie Obiektowe Ćwiczenie 4 1. Zakres ćwiczenia wyjątki kompozycja 2. Zagadnienia Założeniem, od którego nie należy odbiegać, jest by każdy napotkany problem (np. zatrzymanie wykonywanej metody)
SystimPlus. Dokumentacja (FAQ) dla wersji: v1.14.05.12
SystimPlus Dokumentacja (FAQ) dla wersji: v1.14.05.12 Spis treści 1.Co to jest SystimPlus?... 1 2.Instalacja i wymagania... 1 3.Jakie drukarki fiskalne obsługuje SystimPlus?... 3 4.Jak połączyć się z drukarką
Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula
Programowanie i struktury danych Wykład 4 Dr Piotr ybula Typ wska ź nikowy int* pointer; //wskaźnik do zmiennych typu int pozwala na dostęp do dowolnego miejsca pamięci (zmienne
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków mgr inż. Maciej Lasota Version 1.0, 13-05-2017 Spis treści Wyjątki....................................................................................
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki zaprojektowany jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych jest to język pozwalający na programowanie zarówno proceduralne
Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe
Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie
Konsorcjum FEN Sp. z o.o. ul. Dąbrowskiego 273A, 60-406 Poznań Mateusz Zapotoczny support [at] fen.pl www.fen.pl
Zoom wywoływany detekcją ruchu ACTi posiada w swojej ofercie kamery stacjonarne z zoomem optycznym. Kamery ty mają trochę inne zastosowanie niż tradycyjne kamery obrotowe, gdzie oprócz możliwości zmiany
Baza danych sql. 1. Wprowadzenie
Baza danych sql 1. Wprowadzenie Do tej pory operowaliście na listach. W tej instrukcji pokazane zostanie jak stworzyć bazę danych. W zadaniu skorzystamy z edytora graficznego struktury bazy danych, który
Instrukcja użytkownika ARSoft-WZ1
05-090 Raszyn, ul Gałczyńskiego 6 tel (+48) 22 101-27-31, 22 853-48-56 automatyka@apar.pl www.apar.pl Instrukcja użytkownika ARSoft-WZ1 wersja 3.x 1. Opis Aplikacja ARSOFT-WZ1 umożliwia konfigurację i
Struktury systemów operacyjnych
Struktury systemów operacyjnych Jan Tuziemski Część slajdów to zmodyfiowane slajdy ze strony os-booi.com copyright Silberschatz, Galvin and Gagne, 2013 Cele wykładu 1. Opis usług dostarczanych przez OS
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
TECHNOLOGIA OBSŁUGI KONTRAKTÓW INFORMACJA O AKTUALIZACJI SYSTEMU ISO 9001:2008 Dokument: Raport Numer: 10/2016 Wydanie: 2008-04-22 Waga: 90
SYSTEM INFORMATYCZNY KS-SOMED'2016 WERSJA Nr 2016.01.0.02 z dnia 2016-03-31 Raport Nr 10/2016 MODUŁ OPIS ZMIAN, MODYFIKACJI i AKTUALIZACJI M12 ZLECENIA 1. Ustawiono datę dla opcji Pozwól na rejestrowanie
Instrukcja dotycząca generowania klucza dostępowego do Sidoma v8
Szanowni Państwo! Instrukcja dotycząca generowania klucza dostępowego do Sidoma v8 Przekazujemy nową wersję systemu SidomaOnLine v8. W celu zalogowania się do systemu niezbędny jest nowy klucz dostępu
Rozwiązanie Compuware dynatrace
Rozwiązanie Compuware dynatrace COMPUWARE DYNATRACE... 3 2 COMPUWARE DYNATRACE Narzędzie Compuware dynatrace oparte jest o unikatową technologię agentową, która pozwala na dogłębną analizę stanu aplikacji
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
XML i nowoczesne technologie zarządzania treścią 2007/08
Zadanie 3 Poprawkowe XML i nowoczesne technologie zarządzania treścią 2007/08 Wprowadzenie Należy napisać program w Javie, który czytając w trybie SAX plik z listą operacji, wykonuje zadane operacje na
Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.
Języki C i C++ to bardzo uniwersalne platformy programistyczne o ogromnych możliwościach. Wykorzystywane są do tworzenia systemów operacyjnych i oprogramowania użytkowego. Dzięki niskiemu poziomowi abstrakcji
epuap Archiwizacja w Osobistym Składzie Dokumentów
epuap Archiwizacja w Osobistym Składzie Dokumentów Projekt współfinansowany ze środków Europejskiego Funduszu Rozwoju Regionalnego w ramach Programu Operacyjnego Innowacyjna Gospodarka SPIS TREŚCI SPIS
Rysunek 178. Programowanie monitorów KDS
9.3. KDSMOBILE KDSMobile to wersja KDS przeznaczona do wyświetlania zamówień na urządzeniach z systemem Android. Do działania potrzebuje urządzenia z systemem Android w wersji co najmniej 4.0. Wykorzystuje
Programowanie aplikacji na iphone. Wstęp do platformy ios. Łukasz Zieliński
Programowanie aplikacji na iphone. Wstęp do platformy ios. Łukasz Zieliński Plan Prezentacji. Programowanie ios. Jak zacząć? Co warto wiedzieć o programowaniu na platformę ios? Kilka słów na temat Obiective-C.
Stronicowanie w systemie pamięci wirtualnej
Pamięć wirtualna Stronicowanie w systemie pamięci wirtualnej Stronicowanie z wymianą stron pomiędzy pamięcią pierwszego i drugiego rzędu. Zalety w porównaniu z prostym stronicowaniem: rozszerzenie przestrzeni
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Instrukcja integratora - obsługa dużych plików w epuap2
Instrukcja integratora - obsługa dużych plików w epuap2 Wersja: 1.1 Strona 1 z 18 Spis treści SPIS TREŚCI... 2 WPROWADZENIE ORAZ INFORMACJE OGÓLNE... 3 1.1 WSTĘP... 3 1.2 WARUNKI KONIECZNE DO SPEŁNIENIA