Saya baru mengenal Java dan bingung dengan pengumpul sampah di Jawa. Apa yang sebenarnya dilakukannya dan kapan hal itu mulai berlaku. Jelaskan beberapa properti pengumpul sampah di Jawa.
Saya baru mengenal Java dan bingung dengan pengumpul sampah di Jawa. Apa yang sebenarnya dilakukannya dan kapan hal itu mulai berlaku. Jelaskan beberapa properti pengumpul sampah di Jawa.
Jawaban:
The kolektor sampah adalah program yang berjalan pada Java Virtual Machine yang menghilangkan objek yang tidak digunakan oleh aplikasi Java lagi. Ini adalah bentuk manajemen memori otomatis .
Saat menjalankan aplikasi Java yang khas, ia membuat objek baru, seperti String
s dan File
s, tetapi setelah waktu tertentu, objek tersebut tidak digunakan lagi. Misalnya, lihat kode berikut:
for (File f : files) {
String s = f.getName();
}
Dalam kode di atas, String s
sedang dibuat pada setiap iterasi for
loop. Ini berarti bahwa dalam setiap iterasi, sedikit memori dialokasikan untuk membuat String
objek.
Kembali ke kode, kita dapat melihat bahwa setelah satu iterasi dijalankan, di iterasi berikutnya, String
objek yang dibuat di iterasi sebelumnya tidak digunakan lagi - objek itu sekarang dianggap "sampah".
Akhirnya, kita akan mulai mendapatkan banyak sampah, dan memori akan digunakan untuk objek yang sudah tidak digunakan lagi. Jika ini terus berlanjut, akhirnya Mesin Virtual Java akan kehabisan ruang untuk membuat objek baru.
Di situlah pengumpul sampah masuk.
Pengumpul sampah akan mencari objek yang tidak digunakan lagi, dan membuangnya, membebaskan memori sehingga objek baru lainnya dapat menggunakan bagian memori tersebut.
Di Java, manajemen memori diurus oleh pengumpul sampah, tetapi dalam bahasa lain seperti C, seseorang perlu melakukan manajemen memori sendiri menggunakan fungsi seperti malloc
danfree
. Manajemen memori adalah salah satu hal yang mudah membuat kesalahan, yang dapat menyebabkan apa yang disebut kebocoran memori - tempat di mana memori tidak diambil kembali saat tidak digunakan lagi.
Skema manajemen memori otomatis seperti pengumpulan sampah membuatnya jadi programmer tidak perlu terlalu khawatir tentang masalah manajemen memori, sehingga dia dapat lebih fokus pada pengembangan aplikasi yang mereka butuhkan untuk dikembangkan.
Ini membebaskan memori yang dialokasikan ke objek yang tidak lagi digunakan oleh program - karena itu disebut "sampah". Sebagai contoh:
public static Object otherMethod(Object obj) {
return new Object();
}
public static void main(String[] args) {
Object myObj = new Object();
myObj = otherMethod(myObj);
// ... more code ...
}
Saya tahu ini sangat dibuat-buat, tetapi di sini setelah Anda memanggil otherMethod()
yang asli Object
dibuat dibuat tidak dapat dijangkau - dan itulah "sampah" yang mengumpulkan sampah.
Di Java, GC berjalan secara otomatis, tetapi Anda juga dapat memanggilnya secara eksplisit dengan System.gc()
dan mencoba memaksa pengumpulan sampah utama. Seperti yang ditunjukkan Pascal Thivent, Anda seharusnya tidak perlu melakukan ini dan itu mungkin lebih berbahaya daripada kebaikan (lihat pertanyaan ini ).
Untuk lebih lanjut, lihat entri wikipedia tentang pengumpulan Sampah dan Tuning Sampah Koleksi (dari Oracle)
System.gc()
tidak memaksa GC untuk berjalan.
myObj
sebelum panggilan otherMethod
dilakukan, karena myObj
tidak lagi dapat diakses pada saat itu.
System.gc()
, inti dari memiliki GC adalah tidak harus melakukan itu.
Sebuah objek memenuhi syarat untuk pengumpulan Sampah atau GC jika tidak dapat dijangkau dari utas langsung atau oleh referensi statis apa pun.
Dengan kata lain, Anda dapat mengatakan bahwa suatu objek memenuhi syarat untuk pengumpulan sampah jika semua referensinya adalah null. Dependensi siklik tidak dihitung sebagai referensi, jadi jika objek A memiliki referensi ke objek B dan objek B memiliki referensi ke Objek A dan tidak memiliki referensi langsung lainnya, maka Objek A dan B akan memenuhi syarat untuk pengumpulan Sampah.
Generasi Tumpukan untuk Pengumpulan Sampah -
Objek Java dibuat Heap
dan Heap
dibagi menjadi tiga bagian atau generasi untuk kepentingan pengumpulan sampah di Jawa, ini disebut sebagai Generasi Muda (Baru), Generasi Bertahan (Lama), dan Area Perm dari timbunan.
Generasi Baru selanjutnya dibagi menjadi tiga bagian yang dikenal sebagai ruang Eden, ruang Survivor 1 dan ruang Survivor 2. Saat sebuah objek pertama kali dibuat di heap, objek tersebut dibuat dalam generasi baru di dalam ruang Eden dan setelah pengumpulan sampah kecil berikutnya jika sebuah objek bertahan, objek tersebut akan dipindahkan ke survivor 1 dan kemudian survivor 2 sebelum pengumpulan sampah besar memindahkan objek tersebut ke generasi lama atau tetap .
Ruang Perm pada Java Heap adalah tempat JVM menyimpan Metadata tentang kelas dan metode, kumpulan String, dan detail tingkat Kelas.
Lihat di sini untuk informasi lebih lanjut: Pengumpulan Sampah
Anda tidak dapat memaksa JVM untuk menjalankan Pengumpulan Sampah meskipun Anda dapat membuat permintaan menggunakan metode System.gc()
atau Runtime.gc()
.
public static void gc() {
Runtime.getRuntime().gc();
}
public native void gc(); // note native method
Mark and Sweep Algorithm -
Ini adalah salah satu algoritma paling populer yang digunakan oleh pengumpulan Sampah. Algoritme pengumpulan sampah apa pun harus melakukan 2 operasi dasar. Pertama, harus dapat mendeteksi semua objek yang tidak dapat dijangkau dan kedua, harus merebut kembali ruang heap yang digunakan oleh objek sampah dan membuat ruang tersedia lagi untuk program.
Operasi di atas dilakukan oleh Mark dan Sapu Algoritma dalam dua tahap:
baca di sini untuk lebih jelasnya - Mark and Sweep Algorithm
Garbage Collector merupakan bagian dari JRE yang memastikan bahwa objek yang tidak direferensikan akan dibebaskan dari memori.
Ini biasanya berjalan saat aplikasi Anda kehabisan memori. AFAIK ini memegang grafik yang merepresentasikan hubungan antara objek dan objek yang terisolasi dapat dibebaskan.
Untuk menghemat kinerja, objek saat ini dikelompokkan ke dalam beberapa generasi, setiap kali GC memindai objek dan menemukan bahwa itu masih direferensikan, jumlah pembangkitannya bertambah 1 (ke beberapa nilai maksimum maksimum, 3 atau 4 menurut saya), dan generasi baru dipindai terlebih dahulu (semakin pendek objek dalam memori, semakin besar kemungkinan objek tersebut tidak lagi diperlukan) sehingga tidak semua objek dipindai setiap kali GC berjalan.
baca ini untuk informasi lebih lanjut.
Pengumpul sampah memungkinkan komputer Anda untuk mensimulasikan komputer dengan memori tak terbatas. Selebihnya hanyalah mekanisme.
Ini dilakukan dengan mendeteksi saat potongan memori tidak lagi dapat diakses dari kode Anda, dan mengembalikan potongan tersebut ke penyimpanan gratis.
EDIT: Ya, tautannya untuk C #, tetapi C # dan Java identik dalam hal ini.
Banyak orang mengira pengumpulan sampah mengumpulkan dan membuang benda mati.
Kenyataannya, pengumpulan sampah Java melakukan hal yang sebaliknya! Benda-benda hidup dilacak dan semua sampah lainnya ditetapkan.
Saat sebuah objek tidak lagi digunakan, pengumpul sampah mengambil kembali memori yang mendasarinya dan menggunakannya kembali untuk alokasi objek di masa mendatang. Ini berarti tidak ada penghapusan eksplisit dan tidak ada memori yang diberikan kembali ke sistem operasi. Untuk menentukan objek mana yang tidak lagi digunakan, JVM sesekali menjalankan apa yang sangat tepat disebut algoritma mark-and-sweep.
Periksa ini untuk informasi lebih detail: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx
Untuk membuatnya dalam istilah yang paling sederhana yang bahkan non-programmer dapat mengerti, ketika sebuah program memproses data itu menciptakan data perantara dan ruang penyimpanan (variabel, array, metadata objek tertentu, dll.) Untuk data itu.
Saat objek ini diakses lintas fungsi atau melebihi ukuran tertentu, mereka dialokasikan dari heap pusat. Kemudian ketika tidak dibutuhkan lagi, mereka perlu dibersihkan.
Ada beberapa artikel online yang sangat bagus tentang cara kerjanya, jadi saya hanya akan membahas definisi yang paling dasar.
GC pada dasarnya adalah fungsi yang melakukan pembersihan ini. Untuk melakukan ini adalah membersihkan entri tabel yang tidak direferensikan oleh objek aktif apa pun, secara efektif menghapus objek, daripada menyalin dan memadatkan memori. Ini sedikit lebih rumit dari ini, tetapi Anda mengerti.
Masalah besarnya adalah beberapa bagian dari proses ini sering kali mengharuskan seluruh Java VM harus dihentikan sementara agar dapat berlangsung, serta seluruh proses ini sangat intensif menggunakan bandwidth prosesor dan memori. Berbagai opsi sebagai GC dan opsi penyetelan untuk masing-masing dirancang untuk menyeimbangkan berbagai masalah ini dengan keseluruhan proses GC.
Pengumpulan Sampah di Java (dan bahasa / platform lain juga) adalah cara Java run-time environment (JRE) untuk menggunakan kembali memori dari objek java yang tidak lagi diperlukan. Sederhananya, saat JRE pertama kali dijalankan, JRE akan menanyakan Sistem Operasi (O / S) untuk sejumlah memori. Saat JRE menjalankan aplikasi Anda, JRE menggunakan memori itu. Ketika aplikasi Anda selesai menggunakan memori itu, "Garbage Collector" dari JRE datang dan mengambil kembali memori itu untuk digunakan oleh bagian berbeda dari aplikasi Anda yang ada. "Pengumpul Sampah" JRE adalah tugas latar belakang yang selalu berjalan dan mencoba memilih waktu saat sistem menganggur untuk menjalankan proses pembuangan sampahnya.
Sebuah analogi dunia nyata adalah tukang sampah yang datang ke rumah Anda dan mengambil sampah Anda yang dapat didaur ulang ... akhirnya, digunakan kembali dengan cara lain oleh Anda dan / atau orang lain.
Pengumpul sampah dapat dipandang sebagai pengelola penghitungan referensi. jika sebuah objek dibuat dan referensinya disimpan dalam sebuah variabel, jumlah referensinya bertambah satu. selama eksekusi jika variabel itu ditugaskan dengan NULL. jumlah referensi untuk objek itu berkurang. jadi jumlah referensi saat ini untuk objek adalah 0. Sekarang ketika Pengumpul sampah dijalankan, Ia memeriksa objek dengan jumlah referensi 0. dan membebaskan sumber daya yang dialokasikan untuknya.
Permintaan pemungut sampah dikendalikan oleh kebijakan pengumpulan sampah.
Anda bisa mendapatkan beberapa data di sini. http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Pengumpul sampah merupakan salah satu komponen dari jvm.
Ini digunakan untuk mengumpulkan sampah setiap kali cpu mendapatkan gratis.
Di sini sampah berarti objek yang tidak digunakan yang dijalankan di Latar Belakang program utama
untuk memantau status program utama.
Pengumpulan sampah otomatis adalah proses melihat memori heap, mengidentifikasi objek mana yang sedang digunakan dan mana yang tidak, dan menghapus objek yang tidak digunakan. Objek yang sedang digunakan, atau objek yang direferensikan, berarti bahwa beberapa bagian dari program Anda masih mempertahankan penunjuk ke objek tersebut. Objek yang tidak digunakan, atau objek yang tidak direferensikan, tidak lagi direferensikan oleh bagian mana pun dari program Anda. Jadi memori yang digunakan oleh objek yang tidak direferensikan dapat diperoleh kembali.
Dalam bahasa pemrograman seperti C, mengalokasikan dan membatalkan alokasi memori adalah proses manual. Di Java, proses pelepasan alokasi memori ditangani secara otomatis oleh pengumpul sampah. Silakan periksa tautan untuk pemahaman yang lebih baik. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
Pengumpulan sampah mengacu pada proses mengosongkan memori secara otomatis di heap dengan menghapus objek yang tidak lagi dapat dijangkau dalam program Anda. Heap adalah memori yang disebut sebagai penyimpanan gratis, mewakili kumpulan besar memori tak terpakai yang dialokasikan ke aplikasi Java Anda.
Prinsip dasar pengumpulan sampah adalah untuk menemukan objek data dalam program yang tidak dapat diakses di masa mendatang, dan untuk mendapatkan kembali sumber daya yang digunakan oleh objek tersebut. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29
Keuntungan
1) Menyimpan dari bug, yang terjadi saat sepotong memori dibebaskan sementara masih ada petunjuk ke sana, dan salah satu petunjuk itu dereferensi. https://en.wikipedia.org/wiki/Dangling_pointer
2) Double free bugs, yang terjadi saat program mencoba membebaskan wilayah memori yang telah dibebaskan, dan mungkin sudah dialokasikan lagi.
3) Mencegah kebocoran memori jenis tertentu, di mana program gagal membebaskan memori yang ditempati oleh objek yang menjadi tidak terjangkau, yang dapat menyebabkan kehabisan memori.
Kekurangan
1) Mengkonsumsi sumber daya tambahan, dampak kinerja, kemungkinan terhenti dalam pelaksanaan program, dan ketidakcocokan dengan pengelolaan sumber daya manual. Pengumpulan sampah menghabiskan sumber daya komputasi dalam memutuskan memori mana yang akan dikosongkan, meskipun pemrogram mungkin sudah mengetahui informasi ini.
2) Momen saat sampah benar-benar terkumpul tidak dapat diprediksi, mengakibatkan warung (jeda untuk menggeser / mengosongkan memori) berserakan sepanjang sesi. Kios yang tidak dapat diprediksi mungkin tidak dapat diterima dalam lingkungan waktu nyata, dalam pemrosesan transaksi, atau dalam program interaktif.
Tutorial Oracle http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
Pengumpulan sampah adalah proses mengidentifikasi objek mana yang digunakan dan mana yang tidak, serta menghapus objek yang tidak digunakan.
Dalam bahasa pemrograman seperti C, C ++, mengalokasikan dan membebaskan memori adalah proses manual.
int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory
Langkah pertama dalam proses ini disebut menandai. Di sinilah pengumpul sampah mengidentifikasi bagian mana dari memori yang digunakan dan mana yang tidak.
Langkah 2a. Penghapusan normal menghapus objek yang tidak direferensikan meninggalkan objek referensi dan pointer ke ruang kosong.
Untuk meningkatkan kinerja, kami ingin menghapus objek yang tidak direferensikan dan juga memadatkan objek referensi lainnya. Kami ingin menyimpan objek yang direferensikan bersama, sehingga akan lebih cepat untuk mengalokasikan memori baru.
Seperti yang dinyatakan sebelumnya, harus menandai dan memadatkan semua objek di JVM tidak efisien. Karena semakin banyak objek yang dialokasikan, daftar objek bertambah dan bertambah yang mengarah ke waktu pengumpulan sampah yang semakin lama.
Lanjutkan membaca tutorial ini, dan Anda akan tahu bagaimana GC mengambil tantangan ini.
Singkatnya, ada tiga wilayah heap, YoungGeneration untuk objek umur pendek, OldGeneration untuk objek periode panjang, dan PermanentGeneration untuk objek yang hidup selama masa pakai aplikasi, misalnya kelas, perpustakaan.
Karena objek dialokasikan secara dinamis oleh operator baru , Anda bisa bertanya bagaimana objek ini dihancurkan dan bagaimana memori sibuk dibebaskan. Dalam bahasa lain seperti C ++, Anda perlu membebaskan objek yang dialokasikan secara manual secara dinamis oleh operator delete. Java memiliki pendekatan yang berbeda; secara otomatis menangani deallocation. Teknik tersebut dikenal sebagai Pengumpulan Sampah .
Cara kerjanya seperti ini: ketika tidak ada referensi ke suatu objek, diasumsikan bahwa objek ini tidak lagi diperlukan dan Anda dapat mengambil kembali memori yang ditempati oleh objek tersebut. Tidak perlu secara eksplisit menghancurkan objek seperti di C ++. Pengumpulan sampah terjadi secara sporadis selama pelaksanaan program; Ini tidak terjadi begitu saja karena ada satu atau lebih objek yang tidak lagi digunakan. Selain itu, beberapa implementasi runtime Java memiliki pendekatan berbeda untuk pengumpulan sampah, tetapi kebanyakan programmer tidak perlu mengkhawatirkan hal ini saat menulis program.
Pengumpulan sampah otomatis adalah proses di mana JVM menghilangkan atau menyimpan titik data tertentu dalam memori untuk membebaskan ruang untuk program yang sedang berjalan. Memori pertama kali dikirim ke memori heap, di situlah pengumpul sampah (GC) melakukan tugasnya, kemudian diputuskan untuk dihentikan atau disimpan. Java berasumsi bahwa programmer tidak selalu dapat dipercaya, jadi ia menghentikan item yang dianggap tidak diperlukannya.