Rumah  >  Artikel  >  Java  >  Heap vs Stack: Cara Java Mengurus Perkara yang Perlu Diingati atau Dilupakan

Heap vs Stack: Cara Java Mengurus Perkara yang Perlu Diingati atau Dilupakan

PHPz
PHPzasal
2024-09-08 16:32:02318semak imbas

Apabila kami menjalankan program, sistem pengendalian memperuntukkan memori supaya aplikasi ini boleh menyimpan data dan mendapatkannya selama yang diperlukan. Tidak seperti C atau C++, di mana pengaturcara mempunyai kebebasan untuk memperuntukkan memori dan mengurus penunjuk "dengan tangan", dalam Java JVM (Java Virtual Machine) menguruskan storan yang tidak menentu, mengabstraksikan kerumitan ini untuk kita dalam dua sistem peruntukan, Heap dan Timbunan.

Perbezaan antara mereka terletak pada tujuan penyimpanan dan keperluan (atau tidak) untuk berkongsi data tersebut dengan pelbagai proses.

JVM menggunakan Timbunan untuk data jangka pendek dan mengikut struktur LIFO (Masuk Dahulu Terakhir). Stack ialah kawasan memori yang digunakan untuk mengurus pelaksanaan kaedah, menyimpan pembolehubah tempatan dan panggilan kaedah dengan cara yang teratur dalam bingkai. Setiap thread dalam JVM mempunyai timbunan sendiri.

The Heap ialah kawasan memori global dikongsi antara semua urutan, di mana objek dan pembolehubah diperuntukkan yang perlu mempunyai hayat berguna di luar skop kaedah yang menciptanya.

Memori on the Heap diuruskan oleh Garbage Collector, yang mengalih keluar objek yang tidak dirujuk untuk mengosongkan ruang, digunakan untuk data jangka panjang.

Mari kita gunakan contoh praktikal.

Apabila pembolehubah primitif dicipta dalam skop kaedah, ia mesti tersedia untuk digunakan semasa kaedah tersebut dilaksanakan. Dengan cara ini, Stacklah yang akan menyimpan pembolehubah ini, kerana ia bertanggungjawab untuk kitaran hayat data yang mempunyai kegunaan unik dan khusus dalam program.

Walau bagaimanapun, apabila kaedah mencipta tika, objek ini boleh digunakan di bahagian lain program, dan bukan hanya di tempat ia diisytiharkan. Ini jelas berlaku apabila kita mencipta objek yang mewakili rekod dalam pangkalan data. Dalam program kami, contoh yang sama ini boleh dirujuk, diedit dan dialih keluar sepanjang pelaksanaan. Dengan cara ini, Heap akan menjaga penyimpanan objek.

Untuk menggambarkan perkara ini, saya akan menggunakan contoh mudah yang diterangkan oleh pengarang Hanumant Deshmukh dalam panduannya "OCP Java SE 17/21 Programmer Exam Fundamentals". Buku ini, dengan cara, sangat bagus, kerana ia berjaya menjadi sangat didaktik dalam menerangkan proses yang agak kompleks. Saya amat mengesyorkannya jika anda, seperti saya, sedang mencari pensijilan Oracle Certified Professional (OCP). Pengarang menggunakan contoh String untuk tujuan pengajaran, tetapi saya akan menggunakan objek tersuai di sini hanya untuk mengelakkan risiko melanggar hak cipta (:S)

public class Main {
    public static void main(String[] args) {
        HeapObj heapObject = newObject();
        int counter = 0;

        while (counter++ < 10){
            print(heapObject.getName());
        }
    }

    public static HeapObj newObject(){
        return new HeapObj("Happy instance");
    }

    public static void print(String text){
        System.out.println(text);
    }
}

Dalam contoh, kelas Utama memanggil tiga kaedah: kaedah utama, satu yang mencipta tika objek HeapObj dan satu lagi yang hanya mencetak teks.

Jika kami mengambil foto apabila semua kaedah telah dipanggil, Stack dan Heap akan kelihatan seperti ini:

Heap vs Stack: como o Java gerencia o que deve ser lembrado ou esquecido

Dalam erti kata lain:

1. Pada permulaan:

Timbunan: bingkai utama (mengandungi args, heapObject, counter).
Timbunan: Kosong.

2. Selepas newObject:

Timbunan: bingkai utama (mengandungi args, rujukan heapObject, pembilang).
Heap: Objek HeapObj dengan rentetan "Happy instance".

3. Semasa Gelung:

Timbunan: bingkai utama (mengandungi args, rujukan heapObject, pembilang), berbilang bingkai cetakan yang disusun dan tidak disusun.
Heap: Objek HeapObj yang sama dan rentetan "Happy instance".

4. Selepas gelung:

Timbunan: bingkai utama (mengandungi args, rujukan heapObject).
Heap: Objek HeapObj yang sama dan rentetan "Happy instance".

5. Pada akhir program:

Timbunan: kosong.
Timbunan: kosong.

Atas ialah kandungan terperinci Heap vs Stack: Cara Java Mengurus Perkara yang Perlu Diingati atau Dilupakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn