Model pamieci w Javie

0

Chciałbym wiedzieć jak Model Pamięci w Javie, ma się do modelu pamieć np w C albo pamieć wirtualnej. Rozumiem że dla każdego procesu przez system tworzona jest przestrzeń, adresowa aby każdy proces mógł mieć wrażenie że pracuje w jednym dużym obszarze pamieć operacyjnej, podczas gdy fizycznie może być pofragmentowana. Rozumiem że JVM działa jako proces w systemie a uruchomiona klasa napisana w Javie jest procesem uruchomionym na JVM. Chciałbym wiedzieć jak jest to mapowane do pamieć fizycznej. Jeśli pytanie nie jest do końca skonkretyzowane to przepraszam, dopiero zaczynam poznawać ten obszar wiedzy.

5

@Virus_:

O ile używasz mniej-więcej właściwych słów na poziomie systemu operacyjnego, to nieco zszedłeś w krzaki w koncepcji "pamiec w języku", nawet myśląc tutaj C.
Jak wszędzie w informatyce, mowa o warstwach, oprogramowanie napisane (nawet w C) dostaje od systemu operacyjnego alokowaną SYSTEMOWO pamięć, i tu w ogóle nie mówimy o bebechach, jak ciągła przestrzeń adresowa *) widziana przez oprogramowanie się na to rzeczywistej pamięci (kostek RAM), adresowanych w pewnych punktach fizycznej przestrzeni adresowej
Nie ma mowy, nawet nie ma wiedzy (bez użycia specjalnego API - wtedy mógłby się dowiedzieć) czy to jest wirtualna, to nie ten poziom, to poziomy systemu operacyjnego / hardware CPU

BTW nie mam kategorycznego wymogu CIĄGŁEJ pamięci adresowej, owszem zwykle na architekturach obecnie najbardziej popularnych jest ona (zwykle) ciągła, ale tak być nie musi, i bywa, że nie jest. Natomiast w każdym przypadku należy używać bloku/bloków pamięci w obrębie granic (limitów). Na współczesnych systemach z ochroną próba wyjścia poza limity spowoduje wyjątek/zabicie procesu, na starszych / prostszych (DOS, arduino) też spowoduje szkody, choć nie zawsze reakcja będzie wyrazista (błędy będą ukrywane)
Etapem pośrednim był procesor 286, który nie silił się na prezentowanie oprogramowaniu ciągłej przestrzeni (była segmentowana), ale już dawał ochronę (bił po łapach za naruszanie granic).
Tak ze przeceniasz rolę ciągłości. Manager pamięci języka (w bibliotece standardowej C, albo w jego maszynie wirtualnej JVM) da się zrealizować, czy jest ciągłość, czy jej nie ma.

Więc nie umiem ci wytłumaczyć w poście "pamięć w Java" , bo masz nie w pełni prawidłowe wyobrażenia jak się wydaje w C.

Co do samego modelu pamięci w JVM, jest wiele Yutubów. Alokowanie, Garbage Collector (GC), kilak jego wykonana z inną optymalizacją. Jest to dobrze udokumentowane, tylko trzeba zakumać podstawy

2

Odpowiedź brzmi - normalnie. Maszyna wirtualna Javy rezerwuje sobie ileś tam pamięci jak każda inna aplikacja i następnie rozdziela je według potrzeb.
Tutaj dochodzimy oczywiście do kwestii, o której wspomniał @ZrobieDobrze - wszelkiego rodzaju tablice nie mają gwarancji, że będą niepofragmentowane. Tj. jeśli robisz coś takiego:

int[] a = new int[2];

to nie masz gwarancji, że jeśli a[0] siedzi pod komórką nr. 420 to a[1] będzie siedzieć pod komórką nr. 421. Zazwyczaj tak jest, natomiast takiej gwarancji nie masz.

Czasami jednak zaistnieje potrzeba stworzenia ciągłego bloku w pamięci - wtedy Rozwiązaniem tego są direct buffer, czyli bloki pamięci przez JVM nie zarządzane. Wtedy wyżej wymienioną gwarancję masz, i właśnie tego typu bufory mają zastosowanie w wielu niskopoziomowych rozwiązaniach (np. Flink, Kafka Streams).

5

Wszyskie materiały zakładają orientację w fundamentach

Ten porusza temat pamięci off-heap . czyli bez fundamentów toniemy

0

Dzięki za materiały i odpowiedzi, będę miał co robić

1 użytkowników online, w tym zalogowanych: 0, gości: 1