2009-07-24 10 views
8

Przeczytałem gdzieś, że java może przydzielić pamięć dla obiektów w około 12 instrukcjach maszynowych. Jest to dla mnie imponujące. O ile rozumiem jedną z trików, których używa JVM, to wstępne przydzielanie pamięci w porcjach. Pomaga to zmniejszyć liczbę żądań do systemu operacyjnego, co jest dość kosztowne, jak sądzę. Ale nawet operacje CAS mogą kosztować do 150 cykli na nowoczesnych procesorach.Java nie blokuje alokacji pamięci

Czy ktoś mógłby wyjaśnić rzeczywisty koszt alokacji pamięci w java i jakie sztuczki JVM używa do przyspieszenia alokacji?

+0

Typowym JVM będzie używać tylko system operacyjny, aby dodać dodatkową pamięć na stercie. W większości przypadków wykorzystuje to, co już zostało. –

Odpowiedz

17

JVM wstępnie przydziela obszar pamięci dla każdego wątku (TLA lub nici Local Area). Gdy wątek potrzebuje alokować pamięć, użyje "Bump the alokacja alokacji" w tym obszarze. (Jeśli "wolny wskaźnik" wskazuje na adres 10, a obiektem, który ma zostać przydzielony, jest rozmiar 50, to po prostu wciskamy wolny wskaźnik do 60 i mówimy wątkowi, że może użyć pamięci między 10 a 59 dla obiektu) .

+0

Wielkie dzięki. To rzeczy, których szukam, ale nie wiedziałem, jak o to zapytać google. :) Ale interesująca rzecz ... Jedyne wzmianki na temat TLA, które znalazłem w Oracle JRock JVM (flag -XXtlaSize). Czy ta funkcja jest dostępna w Sun JVM? –

+1

Terminologia Sun to bufor lokalnego alokacji wątków. Standardy TLA dla bufora Translation Look-Aside (winien IBM) i odnoszą się do map pamięci podręcznej sprzętu. –

+1

Masz rację, znalazłem informacje. Dzięki. Btw, przypuszczam, że translacja bufora Lookaside skraca się jak TLB :) http://pl.wikipedia.org/wiki/Translation_lookaside_buffer –

2

Najlepsza sztuczka to generujący śmieci kolekcjoner. Powoduje to, że sterty są niefragmentowane, więc przydzielanie pamięci zwiększa wskaźnik do wolnego miejsca i zwraca starą wartość. Jeśli skończy się pamięć, obiekt zbierający śmieci kopiuje obiekty i tworzy w ten sposób nową, niepodzieloną stertę.

Ponieważ różne wątki muszą zsynchronizować wskaźnik myszy z wolną pamięcią, jeśli ją zwiększą, będą one wstępnie przydzielać porcje. Tak więc wątek może przydzielić nową pamięć bez blokady.

Wszystko to jest wyjaśnione bardziej szczegółowo tutaj: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

1

Nie ma jednego przydziału pamięci dla JVM. IIRC poprawnie obsługuje JVM firmy Sun i inną zarządzaną pamięć IBM. Jednak ogólnie sposób działania JVM polega na tym, że początkowo przydzieli on jedną część pamięci, segment ten będzie na tyle mały, że będzie mógł mieszkać w pamięci podręcznej procesorów, dzięki czemu dostęp do tego będzie niezwykle szybki.

Podczas gdy wewnątrz aplikacji tworzone są obiekty, obiekty będą pobierać pamięć z tego segmentu. Przyporządkowanie obiektu w obrębie segmentu jest po prostu arytmetyczną wskazówką.

Początkowo adres przesunięcia w segmencie świeżo wybijanym będzie wynosił zero. Pierwszy przydzielony obiekt będzie miał "adres" (właściwie przesunięcie w segmencie) równe zero. Po przydzieleniu obiektu menedżer pamięci będzie wiedział, jak duży jest obiekt, alokować tyle miejsca w segmencie (powiedzmy 16 bajtów), a następnie zwiększyć jego "adres przesunięcia" o tę wielkość, co oznacza, że ​​przydzielanie pamięci jest oślepiająco szybkie, to tylko wskaźnik arytmetyka.

Sun posiada whitepaper tutaj http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf i IBM używane mieć kilka rzeczy na ibm.com/developerworks

Powiązane problemy