Middle+
როგორ არის მოწყობილი მეხსიერება JVM-ში?
sobes.tech AI
პასუხი AI-სგან
JVM-ის მეხსიერება ნაწილდება შემდეგი მონაცემთა სფეროებად:
- Heap (კუნძული): მეხსიერების სფერო, სადაც ინახება კლასების ობიექტები და მასივები. საერთოა ყველა ნაკადისთვის. მართავს გარბეჯის კრეკერი. შედგება თაობებისგან (Young, Old, Permanent/Metaspace).
- Stack (სტეკი): მეხსიერების სფერო თითოეული JVM ნაკადისათვის. ინახავს ლოკალურ ცვლადებს, მეთოდების პარამეტრებს და სტეკის ფრეიმის ინფორმაციას თითოეული მეთოდის გამოძახებისთვის. მეთოდის დასრულებისას მისი ფრეიმი ამოიღება სტეკიდან.
- Method Area (მეთოდების ტერიტორია): ინახავს კლასების მეტადატას, ბაიტკოდებს, კონსტანტების პულს, სტატიკურ ცვლადებს. ძველ ვერსიებში სახელდებოდა Permanent Generation, ახალი (Java 8+) - Metaspace-ით შეიცვალა.
- PC Registers (კომანდების გამოთვლელები): თითოეული ნაკადისათვის. ინახავს შემდეგი ინსტრუქციის მისამართს, რომელიც უნდა შესრულდეს.
- Native Method Stacks (ნატივი მეთოდების სტეკები): ინახავს ნატივი (Java-ს არა) მეთოდების გამოძახებებს. იყენებს იმ ნატივი ბიბლიოთეკებს, რომლებიც აპლიკაცია იძახის.
მეხსიერების განაწილება Heap-ში პასუხისმგებელია გარბეჯის კრეკერი. ის ავტომატურად ანთავისუფლებს მეხსიერებას იმ ობიექტებიდან, რომლებსაც აქტიური რჩევები არ აქვთ.
მაგალითი Heap და Stack-ის მუშაობის:
// ობიექტი 'obj' შექმნილია Heap-ში.
Object obj = new Object();
// ადგილობრივი ცვლადი 'i' ინახება Stack-ში.
int i = 10;
public void myMethod(int param) { // პარამეტრი param - ამ მეთოდის ფრეიმის Stack-ში.
// ადგილობრივი ცვლადი 'local' - ამ მეთოდის ფრეიმის Stack-ში.
String local = "hello";
// ახალი ობიექტი შექმნილია Heap-ში. მისამართი - ამ მეთოდის ფრეიმის Stack-ში.
MyClass myObj = new MyClass();
}
Heap და Stack-ის შორის განსხვავება:
- Heap: საერთო ყველა ნაკადისთვის, ინახავს ობიექტებს, მართავს GC.
- Stack: ინდივიდუალური ნაკადისათვის, ინახავს პრიმიტივებს და ობიექტების რჩევებს, მართავს მეთოდის ფრეიმები.
მეხსიერების მართვა:
- განაწილება (Allocation) - ობიექტების შექმნისას.
- დეალოკაცია (Deallocation) - არასაჭირო ობიექტების მეხსიერების გათავისუფლება (გარბიჯის კრეკერი).
- მეხსიერების ოპტიმიზაცია.