Správa paměti v Java
Co je Stack Memory?
Stack v Javě je část paměti, která obsahuje metody, lokální proměnné a referenční proměnné. Paměť zásobníku je vždy odkazována v pořadí Last-In-First-Out. Lokální proměnné se vytvářejí v zásobníku.
Co je Heap Memory?
Halda je část paměti, která obsahuje objekty a může také obsahovat referenční proměnné. Proměnné instance jsou vytvořeny v haldě.
Alokace paměti v Java
Alokace paměti v Java je proces, ve kterém jsou sekce virtuální paměti vyčleněny v programu pro ukládání proměnných a instancí struktur a tříd. Paměť však není při deklaraci přidělena objektu, ale je vytvořena pouze reference. Pro alokaci paměti objektu se používá metoda new(), takže objektu je vždy přidělena paměť na hromadě.
Jedno Java Alokace paměti je rozdělena do následujících sekcí:
- halda
- Stoh
- Kód
- statický
Toto rozdělení paměti je nutné pro její efektivní správu.
- Jedno kód sekce obsahuje vaše byte kód.
- Jedno Stoh část paměti obsahuje metody, lokální proměnné a referenční proměnné.
- Jedno halda sekce obsahuje Objekty (může také obsahovat referenční proměnné).
- Jedno statický sekce obsahuje Statická data/metody.
Rozdíl mezi místní a instanční proměnnou
Proměnná instance je deklarována uvnitř třídy, ale ne uvnitř metody
class Student{
int num; // num is instance variable
public void showData{}
Lokální proměnná jsou prohlášeny uvnitř a metoda včetně metoda argumenty.
public void sum(int a){
int x = int a + 3;
// a , x are local variables;
}
Rozdíl mezi zásobníkem a haldou
klikněte zde pokud video není přístupné
Vezměme si příklad, abychom to lépe pochopili. Zvažte, že vaše hlavní metoda volá metodu m1
public void m1{
int x=20
}
V stack java se vytvoří rámec z metody m1.
Proměnná X v m1 se také vytvoří v rámci pro m1 v zásobníku. (Viz obrázek níže).
Metoda m1 volá metodu m2. V stack java se vytvoří nový rámec pro m2 nad rámem m1.
Proměnné b a c budou také vytvořeny v rámci m2 v zásobníku.
public void m2(int b){
boolean c;
}
Stejná metoda m2 je volání metody m3. V horní části stohu se opět vytvoří rám m3 (viz obrázek níže).
Nyní řekněme, že naše metoda m3 vytváří objekt pro třídu „Account“, která má dva instance proměnná int p a int q.
Account {
Int p;
Int q;
}
Zde je kód pro metodu m3
public void m3(){
Account ref = new Account();
// more code
}
Výpis new Account() vytvoří objekt účtu v haldě.
Referenční proměnná „ref“ bude vytvořena v zásobníku java.
Operátor přiřazení „=“ vytvoří referenční proměnnou, která bude ukazovat na objekt v haldě.
Jakmile metoda dokončí své provedení. Tok řízení se vrátí zpět k metodě volání. Což je v tomto případě metoda m2.
Zásobník z metody m3 bude vypláchnut.
Vzhledem k tomu, že referenční proměnná již nebude ukazovat na objekt v haldě, bude vhodná pro úklid.
Jakmile metoda m2 dokončí své provedení. Vyskočí ze zásobníku a veškerá jeho proměnná bude vyprázdněna a již nebude k dispozici pro použití.
Stejně tak pro metodu m1.
Nakonec se tok řízení vrátí do počátečního bodu programu. Což je obvykle „hlavní“ metoda.
Co když má Object jako svou proměnnou instance odkaz?
public static void main(String args[]) {
A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
V tomto případě bude referenční proměnná „child“ vytvořena v haldě , která bude zase ukazovat na svůj objekt, něco jako diagram uvedený níže.
V čem je Odvoz odpadu Java?
Sběr odpadu v Java je proces, při kterém programy automaticky provádějí správu paměti. Garbage Collector (GC) najde nepoužívané objekty a odstraní je, aby získal zpět paměť. V JavaDynamické přidělování paměti objektům je dosaženo pomocí operátoru new, který používá určitou paměť a paměť zůstává alokována, dokud neexistují reference pro použití objektu.
Pokud neexistují žádné odkazy na objekt, předpokládá se, že již není potřeba, a paměť obsazená objektem lze získat zpět. Neexistuje žádná výslovná potřeba zničit objekt jako Java zpracovává dealokaci automaticky.
Technika, která toho dosahuje, je známá jako Sbírka odpadků. Programy, které nedealokují paměť, mohou nakonec selhat, když v systému nezbývá žádná paměť, kterou by bylo možné alokovat. Tyto programy prý mají úniky paměti. Svoz odpadu v Java se děje automaticky během životnosti programu, čímž se eliminuje potřeba zrušit alokaci paměti a tím se zabrání únikům paměti.
V jazyce C je odpovědností programátora, aby dynamicky alokoval paměť pomocí funkce free(). Toto je místo Java správa paměti vede.
Poznámka: Všechny objekty jsou vytvořeny v části paměti haldy. Více o tom v pozdějším tutoriálu.
Příklad: Naučit se mechanismus sběrače odpadků v Java
Krok 1) Zkopírujte následující kód do editoru.
class Student{
int a;
int b;
public void setData(int c,int d){
a=c;
b=d;
}
public void showData(){
System.out.println("Value of a = "+a);
System.out.println("Value of b = "+b);
}
public static void main(String args[]){
Student s1 = new Student();
Student s2 = new Student();
s1.setData(1,2);
s2.setData(3,4);
s1.showData();
s2.showData();
//Student s3;
//s3=s2;
//s3.showData();
//s2=null;
//s3.showData();
//s3=null;
//s3.showData();
}
}
Krok 2) Uložte, zkompilujte a spusťte kód. Jak je znázorněno na diagramu, jsou vytvořeny dva objekty a dvě referenční proměnné.
Krok 3) Odkomentovat řádek č. 20,21,22. Uložte, zkompilujte a spusťte kód.
Krok 4) Jak je znázorněno na obrázku níže, dvě referenční proměnné ukazují na stejný objekt.
Krok 5) Odkomentujte řádek č. 23 a 24. Zkompilujte, uložte a spusťte kód
Krok 6) Jak je znázorněno na obrázku níže, s2 se stane nulovým, ale s3 stále ukazuje na objekt a není způsobilé pro sběr odpadu Java.
Krok 7) Odkomentujte řádek č. 25 a 26. Uložte, zkompilujte a spusťte kód
Krok 8) V tomto okamžiku neexistují žádné odkazy směřující na objekt a stává se způsobilým pro sběr odpadu. Bude odstraněn z paměti a neexistuje způsob, jak jej získat zpět.
Jak odstranit objekt v Java?
1) Pokud chcete, aby byl váš objekt vhodný pro shromažďování odpadků, přiřaďte jeho referenční proměnnou hodnotu null.
2) Primitivní typy nejsou objekty. Nelze jim přiřadit hodnotu null.
Shrnutí:
- Když je zavolána metoda, vytvoří se rámec v horní části zásobníku.
- Jakmile metoda dokončí provádění, tok řízení se vrátí k volající metodě a její odpovídající rámec zásobníku je vyprázdněn.
- Lokální proměnné se vytvářejí v zásobníku
- Proměnné instance se vytvářejí v haldě a jsou součástí objektu, ke kterému patří.
- Referenční proměnné se vytvářejí v zásobníku.



















