Tumpukan dan tumpukan java di java membagi memori menjadi dua jenis: satu adalah stack memori dan yang lainnya adalah tumpukan memori.
Beberapa jenis dasar variabel yang didefinisikan dalam fungsi dan variabel referensi objek dialokasikan dalam memori tumpukan fungsi. Ketika suatu variabel didefinisikan dalam blok kode, Java mengalokasikan ruang memori untuk variabel dalam tumpukan. Ketika ruang lingkup variabel melebihi ruang lingkup variabel, Java akan secara otomatis melepaskan ruang memori yang dialokasikan untuk variabel, dan ruang memori dapat digunakan secara terpisah segera.
Heap Memory digunakan untuk menyimpan objek dan array yang dibuat oleh baru. Memori yang dialokasikan dalam tumpukan dikelola oleh Java Virtual Machine Automatic sampah Collector. Setelah array atau objek dihasilkan dalam tumpukan, variabel khusus dapat didefinisikan dalam tumpukan. Nilai variabel ini sama dengan alamat pertama array atau objek dalam memori heap. Variabel khusus ini dalam tumpukan menjadi variabel referensi untuk array atau objek. Di masa depan, Anda dapat menggunakan variabel referensi dalam memori tumpukan dalam program untuk mengakses array atau objek di heap. Variabel referensi setara dengan alias atau nama kode untuk array atau objek.
Variabel referensi adalah variabel biasa. Ketika didefinisikan, memori dialokasikan pada tumpukan. Variabel referensi dirilis di luar ruang lingkup saat program berjalan. Array & objek itu sendiri dialokasikan di tumpukan. Bahkan jika program berjalan di luar blok kode di mana pernyataan yang menggunakan baru untuk menghasilkan array dan objek berada, memori tumpukan yang ditempati oleh array dan objek itu sendiri tidak akan dilepaskan. Array dan objek hanya menjadi sampah ketika tidak ada variabel referensi yang menunjuk ke sana, dan tidak dapat lagi digunakan, tetapi masih menempati memori dan dilepaskan oleh pengumpul sampah pada waktu yang tidak pasti. Ini juga merupakan alasan utama mengapa Java mengambil lebih banyak memori. Bahkan, variabel dalam titik tumpukan ke variabel dalam memori heap, yang merupakan pointer di java!
Tumpukan dan tumpukan di java
Java membagi memori menjadi dua jenis: satu adalah stack memori dan yang lainnya adalah heap memori.
1. Stack dan Heap adalah keduanya tempat yang digunakan oleh Java untuk menyimpan data dalam RAM. Tidak seperti C ++, Java secara otomatis mengelola tumpukan dan tumpukan, dan pemrogram tidak dapat mengatur tumpukan atau tumpukan secara langsung.
2. Keuntungan dari tumpukan adalah bahwa kecepatan akses lebih cepat dari tumpukan, kedua setelah register yang terletak langsung di CPU. Tetapi kerugiannya adalah bahwa ukuran data dan masa pakai dalam tumpukan harus deterministik dan tidak memiliki fleksibilitas. Selain itu, data tumpukan dapat dibagikan. Keuntungan dari tumpukan adalah bahwa ia secara dinamis dapat mengalokasikan ukuran memori, dan masa pakai tidak harus diberitahu kepada kompiler terlebih dahulu. Pengumpul sampah Java akan secara otomatis mengumpulkan data yang tidak lagi digunakan. Tetapi kerugiannya adalah bahwa memori harus dialokasikan secara dinamis saat runtime, kecepatan akses lebih lambat.
3. Ada dua jenis data di Java.
Salah satunya adalah tipe dasar (tipe primitif), ada 8 jenis, yaitu int, pendek, panjang, byte, float, double, boolean, char (note,
Tidak ada jenis string dasar). Jenis definisi ini didefinisikan oleh bentuk seperti int a = 3; long b = 255L; dan disebut variabel otomatis. Perlu dicatat bahwa variabel otomatis berisi nilai -nilai literal, bukan contoh kelas, yaitu, bukan referensi ke kelas, dan tidak ada kelas di sini. Misalnya, int a = 3; di sini A adalah referensi yang menunjuk ke tipe int,
Tunjuk pada nilai literal 3. Karena ukuran nilai -nilai literal ini, masa pakai nilai -nilai literal ini dapat diketahui (nilai -nilai literal ini ditentukan secara lekat dalam blok program, dan setelah blok program keluar, nilai lapangan menghilang).
Demi mengejar kecepatan, itu ada di tumpukan.
Selain itu, fitur khusus yang sangat penting dari tumpukan adalah bahwa data dalam tumpukan dapat dibagikan. Misalkan kita mendefinisikan pada saat yang sama:
int a = 3;
int b = 3;
Kompiler pertama proses int a = 3; Pertama akan membuat referensi ke variabel A di tumpukan, dan kemudian cari tahu apakah ada alamat dengan nilai literal 3. Jika tidak ditemukan, itu akan membuka alamat dengan nilai literal 3, dan kemudian titik A ke alamat 3. Kemudian proses int B = 3; Setelah membuat variabel referensi B, karena sudah ada nilai literal 3 di tumpukan, B secara langsung menunjuk ke alamat 3. Dengan cara ini, A dan B keduanya menunjuk ke 3 pada saat yang sama.
Sangat penting untuk dicatat bahwa referensi literal ini berbeda dari objek kelas. Dengan asumsi bahwa referensi dua objek kelas menunjuk ke suatu objek pada saat yang sama, jika satu variabel referensi objek mengubah keadaan internal objek, variabel referensi objek lainnya segera mencerminkan perubahan ini. Sebaliknya, memodifikasi nilainya melalui referensi literal tidak akan menyebabkan nilai lain diubah sesuai. Seperti dalam contoh di atas, setelah kita mendefinisikan nilai -nilai a dan b, biarkan a = 4; Kemudian, B tidak akan sama dengan 4, atau sama dengan 3. Di dalam kompiler, ketika a = 4 ditemui, itu akan mencari kembali apakah ada nilai literal 4 di tumpukan. Jika tidak, buka kembali alamat untuk menyimpan nilai 4; Jika sudah ada, langsung tunjuk A ke alamat ini. Oleh karena itu, perubahan nilai A tidak akan mempengaruhi nilai b.
Jenis lain adalah data pengemasan data, seperti integer, string, double, dll. Yang membungkus tipe data dasar yang sesuai. Semua data kelas ini ada di tumpukan. Java menggunakan pernyataan baru () untuk menampilkan kompiler dan hanya menciptakan secara dinamis sesuai kebutuhan saat runtime, sehingga lebih fleksibel, tetapi kerugiannya adalah memakan waktu lebih banyak.
Di Java, ada enam tempat berbeda di mana data dapat disimpan:
1. Daftar. Ini adalah area penyimpanan tercepat karena terletak di tempat yang berbeda dari area penyimpanan lainnya - prosesor. Namun, jumlah register sangat terbatas, sehingga register dialokasikan oleh kompiler sesuai dengan persyaratan. Anda tidak dapat secara langsung mengendalikannya, Anda juga tidak dapat merasakan tanda -tanda keberadaan register dalam program.
2. Tumpukan. Terletak secara umum RAM, tetapi dengan "Stack Pointer" Anda bisa mendapatkan dukungan dari prosesor. Jika penunjuk tumpukan bergerak ke bawah, memori baru dialokasikan; Jika bergerak ke atas, ingatan itu dibebaskan. Ini adalah cara yang cepat dan efisien untuk mengalokasikan penyimpanan, kedua setelah register. Saat membuat program, kompiler Java harus mengetahui ukuran dan siklus hidup yang tepat dari semua data yang disimpan dalam tumpukan, karena harus menghasilkan kode yang sesuai untuk memindahkan penunjuk tumpukan ke atas dan ke bawah. Kendala ini membatasi fleksibilitas program, jadi meskipun beberapa data JA VA disimpan di tumpukan - terutama referensi objek, objek Java tidak disimpan di dalamnya.
3. Tumpukan. Kumpulan memori universal (juga ada dalam RAM) untuk menyimpan apa yang disebut benda Java. Keuntungan dari tumpukan adalah bahwa kompiler tidak perlu tahu berapa banyak area penyimpanan untuk dialokasikan dari tumpukan, juga tidak perlu mengetahui berapa lama data yang disimpan akan bertahan di tumpukan. Oleh karena itu, ada fleksibilitas besar dalam mengalokasikan penyimpanan di tumpukan. Ketika Anda perlu membuat objek, Anda hanya perlu menulis baris kode sederhana di New. Saat menjalankan baris kode ini, itu akan secara otomatis menyimpan dan mengalokasikan di tumpukan. Tentu saja, kode yang sesuai harus dibayar untuk fleksibilitas ini. Dibutuhkan lebih banyak waktu untuk mengalokasikan penyimpanan dengan tumpukan daripada menyimpannya dengan tumpukan.
4. Penyimpanan statis. "Statis" di sini berarti "dalam posisi tetap". Static Storage menyimpan data yang selalu ada saat program berjalan. Anda dapat menggunakan kata kunci statis untuk mengidentifikasi bahwa elemen tertentu dari suatu objek adalah statis, tetapi objek Java itu sendiri tidak pernah disimpan dalam ruang penyimpanan statis.
5. Penyimpanan Konstan. Nilai konstan biasanya disimpan langsung di dalam kode program, dan aman untuk melakukannya karena mereka tidak akan pernah diubah. Kadang -kadang, dalam sistem tertanam, konstanta itu sendiri dipisahkan dari bagian lain, jadi dalam hal ini, itu opsional untuk memasukkannya ke dalam ROM.
6. Penyimpanan Non-Ram. Jika data bertahan sepenuhnya di luar program, itu dapat dibiarkan tanpa kendali program dan dapat ada ketika program tidak berjalan.
Dalam hal kecepatan, ada hubungan sebagai berikut:
Daftarkan <stack <heap <lainnya
"Bagian di atas diekstraksi dari" Thinking in Java ""
Pertanyaan 1:
String str1 = "ABC"; String str2 = "ABC"; System.out.println (str1 == str2); //BENAR
Pertanyaan 2:
String str1 = string baru ("ABC"); String str2 = string baru ("ABC"); System.out.println (str1 == str2); // PALSU Pertanyaan 3:
String s1 = "ja"; String s2 = "va"; String s3 = "java"; String S4 = S1 + S2; System.out.println (s3 == S4); // false system.out.println (s3.equals (s4)); // true
Beberapa tipe dasar variabel yang didefinisikan dalam fungsi dan variabel referensi objek semuanya dialokasikan dalam memori tumpukan fungsi.
Ketika variabel didefinisikan dalam blok kode, Java mengalokasikan ruang memori untuk variabel ini di tumpukan. Ketika ruang lingkup variabel melebihi variabel, Java akan secara otomatis melepaskan ruang memori yang dialokasikan untuk variabel, dan ruang memori dapat digunakan secara terpisah segera.
Heap Memory digunakan untuk menyimpan objek dan array yang dibuat oleh baru.
Memori yang dialokasikan dalam tumpukan dikelola oleh pengumpul sampah otomatis mesin virtual Java.
Setelah array atau objek dihasilkan dalam heap, variabel khusus dapat didefinisikan dalam tumpukan, sehingga nilai variabel ini dalam tumpukan sama dengan alamat pertama array atau objek dalam memori heap, dan variabel dalam tumpukan menjadi variabel referensi untuk array atau objek.
Variabel referensi setara dengan nama yang diberikan ke array atau objek. Anda dapat menggunakan variabel referensi di tumpukan dalam program untuk mengakses array atau objek di heap.
Khususnya: Tumpukan dan tumpukan adalah keduanya tempat yang digunakan oleh Java untuk menyimpan data dalam RAM. Tidak seperti C ++, Java secara otomatis mengelola tumpukan dan tumpukan, dan pemrogram tidak dapat mengatur tumpukan atau tumpukan secara langsung.
Java Heap adalah area data runtime, dari mana objek mengalokasikan ruang. Objek -objek ini dibuat melalui instruksi seperti New, NewArray, Anewarray dan Multianewarray. Mereka tidak memerlukan kode program untuk dirilis secara eksplisit. Tumpukan bertanggung jawab untuk pengumpulan sampah. Keuntungan dari tumpukan adalah bahwa ia dapat secara dinamis mengalokasikan ukuran memori, dan masa pakai tidak harus diberitahu kepada kompiler terlebih dahulu, karena secara dinamis mengalokasikan memori saat runtime. Pengumpul sampah Java akan secara otomatis mengumpulkan data yang tidak lagi digunakan. Tetapi kerugiannya adalah karena perlu mengalokasikan memori secara dinamis saat runtime, kecepatan akses lebih lambat.
Keuntungan dari tumpukan adalah bahwa kecepatan akses lebih cepat dari tumpukan, kedua setelah register, dan data tumpukan dapat dibagikan. Tetapi kerugiannya adalah bahwa ukuran data dan masa pakai dalam tumpukan harus deterministik dan tidak memiliki fleksibilitas. Tumpukan terutama menyimpan beberapa jenis variabel dasar (, int, pendek, panjang, byte, float, double, boolean, char) dan pegangan objek.
Fitur khusus yang sangat penting dari tumpukan adalah bahwa data yang ada di tumpukan dapat dibagikan. Misalkan kita mendefinisikan pada saat yang sama:
int a = 3;
int b = 3;
Kompiler pertama proses int a = 3; Pertama akan membuat referensi di tumpukan dengan variabel A, dan kemudian cari tahu apakah ada nilai 3 di tumpukan. Jika tidak ditemukan, itu akan menyimpan 3 dan kemudian titik A ke 3. Kemudian proses int b = 3; Setelah membuat variabel referensi B, karena sudah ada nilai 3 di tumpukan, B secara langsung menunjuk ke 3. Dengan cara ini, A dan B keduanya menunjuk ke 3 pada saat yang sama. Pada saat ini, jika a = 4 diatur lagi; maka kompiler akan mencari lagi apakah ada nilai 4 di tumpukan. Jika tidak, simpan 4 dan point A ke 4; Jika sudah ada, poin A ke alamat ini secara langsung. Oleh karena itu, perubahan nilai A tidak akan mempengaruhi nilai b. Perlu dicatat bahwa berbagi data ini berbeda dari berbagi referensi dari dua objek yang menunjuk ke satu objek pada saat yang sama, karena dalam hal ini modifikasi A tidak akan mempengaruhi B, itu dilakukan oleh kompiler, yang kondusif untuk menghemat ruang. Variabel referensi objek memodifikasi keadaan internal objek ini dan akan memengaruhi variabel referensi objek lain.
String adalah data pengemasan khusus. Dapat digunakan:
String str = string baru ("ABC"); String str = "ABC"; Ada dua bentuk untuk dibuat. Yang pertama adalah menggunakan baru () untuk membuat objek baru, yang akan disimpan di tumpukan. Objek baru dibuat setiap kali dipanggil.
Tipe kedua adalah untuk membuat STR variabel terlebih dahulu ke objek kelas string di tumpukan, dan kemudian mencari tahu apakah ada "ABC" yang disimpan di tumpukan. Jika tidak, simpan "ABC" di tumpukan dan biarkan STR menunjuk ke "ABC". Jika sudah ada "ABC", langsung biarkan STR ke "ABC".
Saat membandingkan apakah nilai -nilai di kelas sama, gunakan metode Equals (); Saat menguji apakah referensi dari dua kelas pembungkus menunjuk ke objek yang sama, gunakan ==, dan gunakan contoh di bawah ini untuk menggambarkan teori di atas.
String str1 = "ABC"; String str2 = "ABC"; System.out.println (str1 == str2); //BENAR
Dapat dilihat bahwa STR1 dan STR2 menunjuk ke objek yang sama.
String str1 = string baru ("ABC"); String str2 = string baru ("ABC"); System.out.println (str1 == str2); // PALSU Metode baru adalah menghasilkan objek yang berbeda. Menghasilkan satu per satu.
Oleh karena itu, dengan cara kedua, beberapa string "ABC" dibuat, dan hanya ada satu objek dalam memori. Metode penulisan ini bermanfaat dan menghemat ruang memori. Pada saat yang sama, dapat meningkatkan kecepatan berjalan program sampai batas tertentu, karena JVM akan secara otomatis memutuskan apakah perlu membuat objek baru berdasarkan situasi aktual data dalam tumpukan. Untuk kode string str = string baru ("ABC");, objek baru dibuat dalam tumpukan terlepas dari apakah nilai string mereka sama atau tidak, apakah perlu membuat objek baru, sehingga meningkatkan beban pada program.
Di sisi lain, perhatikan: ketika kami mendefinisikan kelas menggunakan format seperti string str = "ABC";, kami selalu menerima begitu saja bahwa kami membuat objek STR dari kelas string. (Tidak harus, karena jika tidak ada sebelumnya, itu akan dibuat. Ini adalah pembuatan objek. Jika sudah ada, maka arahkan ke objek asli)! Objek mungkin belum dibuat! Dan mungkin hanya menunjuk ke objek yang telah dibuat sebelumnya. Hanya melalui metode baru () kita dapat memastikan bahwa objek baru dibuat setiap saat. Karena sifat abadi dari kelas string, ketika variabel string perlu sering mengubah nilainya, Anda harus mempertimbangkan menggunakan kelas StringBuffer untuk meningkatkan efisiensi program.