Apa itu pengumpul sampah di Jawa?

103

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.

Subhransu Mishra
sumber
2
kemungkinan duplikat Pengumpulan Sampah
Ian Ringrose
10
Terkadang lebih baik membaca bab dalam buku yang bagus berharap memahami subjek yang kompleks dari jawaban satu pertanyaan.
Ian Ringrose
4
@Ian Ini pertanyaan yang mirip, tapi bukan duplikat. Dan pertanyaan itu berbau pekerjaan rumah.
NullUserException

Jawaban:

119

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 Strings dan Files, 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 ssedang dibuat pada setiap iterasi forloop. Ini berarti bahwa dalam setiap iterasi, sedikit memori dialokasikan untuk membuat Stringobjek.

Kembali ke kode, kita dapat melihat bahwa setelah satu iterasi dijalankan, di iterasi berikutnya, Stringobjek 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 mallocdanfree . 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.

burung coobird
sumber
Apakah benar mengatakan aplikasi java berjalan di komputer kemudian memiliki dua fungsi pengumpulan sampah. Satu dengan mesin virtual Java. Dan kemudian salah satu mesin sebenarnya yang menjalankan windows? (Atau OS lainnya)
Lealo
Tidak, biasanya aplikasi Java hanya berjalan jika JRE ada. Jadi, hanya fungsionalitas pengumpulan sampah JVM yang diperlukan! @Lealo
AmIHelpful
18

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 Objectdibuat 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)

NullUserException
sumber
1
AFAIK System.gc()tidak memaksa GC untuk berjalan.
Itay Karo
1
1 untuk contoh kode yang baik. Perhatikan bahwa GC benar-benar valid untuk dihancurkan myObjsebelum panggilan otherMethoddilakukan, karena myObjtidak lagi dapat diakses pada saat itu.
Billy ONeal
@ Italia Saya percaya bahwa penerapannya spesifik.
NullUserException
2
Saya percaya seseorang tidak boleh menelepon System.gc(), inti dari memiliki GC adalah tidak harus melakukan itu.
Pascal Thivent
dengan escape analysis ( en.wikipedia.org/wiki/Escape_analysis ), ada kemungkinan JVM bahkan tidak mengalokasikan objek di tempat pertama dalam contoh ini. Seluruh pembuatan objek dapat (dalam teori) dioptimalkan. Implementasi tergantung tentu saja.
mikera
15

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 Heapdan Heapdibagi 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.

Java Heap Space 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.

Generasi Tumpukan untuk Pengumpulan Sampah

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().

Di java.lang.System

public static void gc() {
    Runtime.getRuntime().gc();  
}

Di java.lang.Runtime

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:

  1. Tandai fase
  2. Fase sapuan

baca di sini untuk lebih jelasnya - Mark and Sweep Algorithm

roottraveller.dll
sumber
6

pengumpul sampah menyiratkan bahwa objek yang tidak lagi dibutuhkan oleh program adalah "sampah" dan dapat dibuang.

Nik
sumber
6

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.

Itay Karo
sumber
@quantumSoup apakah Anda yakin tentang ini? Saya yakin beberapa jenis pengumpulan sampah (yang lebih mahal) hanya terjadi saat timbunan terisi.
Pablo Fernandez
2
@quantumSoup - itu bergantung pada implementasi GC JRE. Dalam banyak kasus, GC tidak berjalan terus-menerus. Sebaliknya, ini berjalan ketika aplikasi Anda tidak dapat mengalokasikan objek karena heap sudah penuh. HotSpot JVM terbaru memang menyertakan GC paralel, tetapi tidak diaktifkan secara default.
Stephen C
Jawaban ini terlalu berkonsentrasi pada mekanismenya. Pertanyaannya adalah "Apa itu pemulung", bukan "Bagaimana cara kerja pemulung"
Billy ONeal
@quantum: menetralkan -1 Anda, karena: Belajar, untuk apa halaman ini, bukan? Untuk belajar, Anda perlu melakukan kesalahan. Menghukum kesalahan membuat orang tidak belajar. Harapan, Anda bisa setuju dalam hal itu. Dan mungkin Anda melakukan kesalahan di sini.
erikbwork
1
@erikb: Dengan logika itu, tidak akan pernah ada suara negatif. Dan suara negatif diperlukan untuk menyingkirkan jawaban yang relatif buruk. OP jelas-jelas seorang pemula, dan cara kerja GC yang spesifik tidak penting untuk pertanyaan yang diajukan. Karena jawaban ini tidak menjawab pertanyaan yang diajukan (menjawab pertanyaan yang berbeda), suara negatif dapat dibenarkan dengan sempurna.
Billy ONeal
3

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.

Billy ONeal
sumber
Sebenarnya ada pertanyaan di SO tentang perbedaan antara java dan GC C #: stackoverflow.com/questions/492703/c-vs-java-garbage-collector
NullUserException
3

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

VdeX
sumber
1

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.

Robert Wm Ruedisueli
sumber
0

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.

Al Dass
sumber
0

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

bala sreekanth
sumber
1
Penghitungan referensi adalah salah satu cara yang buruk untuk menerapkan GC. Saya rasa tidak ada implementasi JVM besar yang menggunakan ini.
NullUserException
0

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.

Pulipati Prasadarao
sumber
0

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

Shashank Shankaranand
sumber
0

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.

Aamir M Meman
sumber
1
Jangan gunakan format kutipan untuk teks yang tidak dikutip, dan jika dikutip Anda perlu mengutip sumbernya.
Marquis dari Lorne
0

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.

Yan Khonski
sumber
0

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.

Amarildo
sumber
-2

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.

Lopes_CP_2579
sumber