Rumah  >  Artikel  >  Java  >  Apakah heap and stack dalam Java

Apakah heap and stack dalam Java

PHPz
PHPzke hadapan
2023-05-16 21:32:271017semak imbas

Cara program Java dijalankan

Atur cara Java dijalankan dalam Java Virtual Machine (JVM) JVM menyediakan pengurus untuk sebarang sumber yang diperlukan oleh aplikasi Java semasa ia dijalankan. Ini bermakna aplikasi yang ditulis atau dicipta oleh pembangun tidak mempunyai keupayaan untuk mendapatkan sumber sistem secara langsung (sama ada perkakasan atau perisian) melainkan JVM boleh menyediakan sumber ini. Jadi dalam Java, urutan berjalan program adalah seperti berikut:

Apakah heap and stack dalam Java

Lapisan JVM membolehkan platform Java berjalan secara bebas, seperti C/C++, jangan gunakan apa-apa yang serupa dengan lapisan JVM , jadi ia bukan bahasa merentas platform, walaupun ia adalah bahasa mudah alih. Ia kelihatan seperti gambar di bawah:

Apakah heap and stack dalam Java

Kedua-dua bentuk mempunyai kelebihan dan kekurangan, dan Java sudah mempunyai ekosistemnya sendiri. Pada masa yang sama, bahasa pengaturcaraan seperti C/C++ mempunyai akses terus kepada sumber sistem, yang lebih kondusif untuk mengoptimumkan penggunaan unit teras, menghasilkan program yang sangat pantas dan cekap. Tetapi kedua-duanya mempunyai kegunaannya dalam dunia pembangunan perisian.

Semua bahasa pengaturcaraan mempunyai banyak persamaan dalam proses penyusunan dan pelaksanaannya. Perkara yang paling penting ialah pengurusan memori Tidak kira bahasa yang digunakan, pengurusan memori mempunyai kesan penting ke atas kecekapan keseluruhan program, kerana hanya dengan menguruskan sumber memori dengan baik prestasi aplikasi dapat diurus dengan baik.

Menjalankan Memori dalam Java

Platform asas menyediakan memori yang diperlukan oleh aplikasi, yang merupakan situasi biasa di kalangan aplikasi, membolehkan setiap aplikasi beroperasi secara optimum. Di Java, sistem pengendalian memerlukan kebenaran untuk menggunakan sumber memori yang disediakan oleh JVM. Di Java, memori JVM dibahagikan kepada 5 bahagian utama, termasuk kawasan kaedah, timbunan, timbunan, daftar PC dan timbunan kaedah tempatan.

Artikel ini tertumpu terutamanya pada timbunan dan tindanan. Memori bukan sekeping kertas kosong Pengaturcara tidak boleh menulis data sesuka hati Ia mesti distrukturkan sebelum digunakan. Tindanan dan timbunan ialah struktur data yang diikuti apabila menggunakan memori Semasa pelaksanaan atur cara, data yang disimpan digunakan untuk pelbagai tujuan, bergantung pada tujuan program.

JVM menentukan kawasan data masa jalan yang digunakan semasa pelaksanaan program. Sesetengah kawasan data bergantung kepada JVM, bermakna ia dicipta apabila JVM bermula dan berterusan sepanjang kitaran hayat JVM. Walau bagaimanapun, setiap urutan mencipta dan memusnahkan kawasan data lain. JVM boleh melaksanakan beberapa utas pelaksanaan pada masa yang sama, yang bermaksud bahawa setiap utas mempunyai pc sendiri (Kaunter Program, pembilang program) untuk mengekalkan kedudukan arahan semasa yang sedang dilaksanakan, dan bingkai tindanan untuk menyimpan peruntukan memori statik.

Timbunan

Timbunan ialah struktur dalam ingatan di mana pembangun menyimpan elemen dengan cara yang membolehkan data diambil hanya dari bahagian atas timbunan - selalunya dirujuk sebagai masuk pertama, keluar terakhir (FILO) atau LIFO). Setiap thread mempunyai tindanan JVM peribadi yang menyimpan pembolehubah yang berkaitan dengan peruntukan memori statik. Malah, dalam kaedah yang diisytiharkan dan digunakan dalam kod kami, pembolehubah primitif tertentu disimpan dalam kawasan tindanan. Selain itu, rujukan kepada objek yang sebenarnya disimpan dalam memori timbunan juga disimpan dalam kawasan tindanan. Oleh itu, sebarang memori yang diperuntukkan secara tempatan disimpan pada timbunan.

Saiz lalai memori tindanan boleh ditukar menggunakan parameter JVM -Xss. Kadangkala timbunan boleh melimpah jika terlalu banyak pembolehubah diperuntukkan atau jika kaedah memanggil dirinya secara rekursif. Ralat biasa yang diketahui oleh semua pengaturcara Java ialah Java.lang.stackoverflowerror, yang digesa apabila memori tindanan tidak mencukupi. Setiap panggilan kaedah dalam Java memperuntukkan sekeping memori pada tindanan Oleh itu, panggilan kaedah rekursif yang direka bentuk dengan mudah boleh menduduki semua memori tindanan dan menyebabkan ralat limpahan memori.

Timbunan

Timbunan ialah kawasan memori yang dicipta apabila JVM dimulakan Ia akan wujud sehingga JVM dimusnahkan. Tidak seperti timbunan, yang merupakan sifat bagi satu utas (kerana setiap utas mempunyai timbunan sendiri), timbunan itu sebenarnya adalah memori global yang diuruskan oleh JVM itu sendiri, dan memori ini digunakan untuk memperuntukkan memori untuk objek semasa runtime. Oleh itu, instantiasi objek boleh menjadi kelas yang ditentukan pengguna, JDK atau kelas perpustakaan lain. Ringkasnya, sebarang objek yang dibuat menggunakan kata kunci new disimpan dalam memori timbunan. Objek dalam memori timbunan boleh diakses oleh semua benang yang menjalankan JVM. Pengurusan capaian adalah sangat kompleks dan menggunakan algoritma yang sangat kompleks, dan di sinilah pemungut sampah JVM berperanan.

Saiz lalai timbunan boleh ditukar menggunakan parameter JVM -Xms dan -Xmx. Apabila objek dicipta dan dimusnahkan, saiz timbunan bertambah atau berkurang, dan jika had memori maksimum dicapai dan peruntukan memori selanjutnya dicuba, java.lang.OutOfMemoryError dilemparkan.

Kelas

String Pool (StringPool)

Java.lang.String dalam heap ialah kelas yang paling biasa digunakan di Java, jadi perhatian khusus harus diberikan kepada kecekapannya. Berbanding dengan jenis data asas, kecekapan operasi rentetan sentiasa sangat perlahan Oleh itu, beberapa cara mesti digunakan untuk membuat kecekapan dan kemudahan operasi objek rentetan serupa atau hampir dengan jenis data asas timbunan Kawasan memori khas (StringPool) diperuntukkan dalam JVM, dan sebarang objek rentetan yang dicipta disimpan dalam StringPool oleh JVM. Ini meningkatkan prestasi berbanding objek lain yang dicipta dalam timbunan.

Timbunan dan tindanan dijelaskan daripada contoh kod

Untuk menerangkan dengan lebih baik penggunaan ingatan timbunan dan tindanan dalam Java, marilah kita menulis atur cara mudah dan memutuskan peruntukan mana yang pergi ke memori mana —— Timbunan atau tindanan:

public class HeapAndStackTest {
    public static void main(String[] args) {
        int x=10;
        int y=20;
        String greet = "Hello";
        Date d = new Date();
        diff(x, y);
    }

    public static int diff(int x1, int x2) {
        return x2-x1;
    }
}

Kod ini berjalan seperti berikut:

  • Atur cara bermula dan JVM memuatkan kelas Java Runtime Environment (JRE) ke dalam timbunan tengah.

  • akan mencipta bingkai tindanan apabila menemui kaedah main().

  • Pembolehubah setempat x dan y disimpan pada tindanan.

  • Rentetan greet diperuntukkan dalam kawasan StringPool timbunan. Objek

  • Date diperuntukkan dalam kawasan timbunan dan rujukannya d disimpan dalam tindanan.

Apakah heap and stack dalam Java

Atas ialah kandungan terperinci Apakah heap and stack dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam