Apa yang bisa dan tidak bisa dilakukan oleh Pengumpul Sampah?

8

Apakah GC akan menangani semua masalah manajemen memori (kebocoran memori)?

Apakah ada kasus di mana Anda tidak ingin GC mengendalikan sebagian kode Anda?

invarian
sumber
Itu tidak bisa mengumpulkan dirinya sendiri, meskipun seharusnya.
rightfold

Jawaban:

10

Ini akan menangani masalah manajemen memori klasik (memori yang dialokasikan tidak mengalami deacllocated ketika tidak lagi digunakan), meskipun masih mungkin untuk memiliki kebocoran memori dengan sistem GC - ini akan lebih halus dan akan terjadi ketika benda masih memegang referensi ke objek lain, bahkan ketika mereka tidak perlu lagi.

Lihat pertanyaan. Mengapa NET tidak memiliki kebocoran memori? dan jawabannya di StackOverflow.

Mungkin ada x. situasi ketika Anda ingin kontrol penuh atas alokasi memori, tetapi terus terang, manfaat sistem GC sedemikian rupa sehingga Anda biasanya tidak perlu melakukannya.

Oded
sumber
1
Satu-satunya situasi yang dapat saya pikirkan di mana hukumannya terlalu tinggi adalah dalam sistem yang memindahkan sejumlah besar data dengan sangat cepat melalui memori terbatas seperti grafis kelas atas atau sistem dengan memori sangat terbatas di tempat pertama, seperti pengontrol tertanam.
Insinyur Dunia
@WorldEngineer - Benar, itulah sebabnya .NET telah menyematkan objek, memungkinkan Anda lebih mengontrol bagian memori.
Oded
Komputasi Kinerja Tinggi, sistem perdagangan latensi rendah, dll. Semuanya akan menyukai kontrol atas GC mereka :-)
Martijn Verburg
Oh, mereka bisa menyetelnya dengan baik. Bahkan ada seluruh kelas dari GC kelas atas yang didedikasikan untuk membuat jeda kecil dan membatasi berapa banyak waktu masuk ke dalam GC (GC bertahap dan berbarengan), dengan canidate yang siap produksi. Tetapi ternyata bahkan itu tidak cukup untuk beberapa dari mereka (saya tidak tahu apakah itu masuk akal). Jadi mereka meninggalkannya, bersama dengan kompilasi JIT.
@SamSaffron memposting tautan ini di twitter ke sebuah artikel di mana perilaku eksplisit GC (ab) digunakan untuk mendapatkan keuntungan marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip
2

Ada banyak masalah memori (menggantung pointer, buffer overruns dan sejenisnya) dan masalah sumber daya (kebocoran memori, kebocoran sumber daya lainnya). Pengumpul sampah mengurus:

  • petunjuk menggantung
  • kebanyakan kebocoran memori
  • sebagian kebocoran sumber daya lainnya

Bahasa yang tidak mengizinkan aritmatika pointer menangani:

  • buffer overruns dan kasus lain dari pointer tidak valid

Tidak ada yang dapat menyelesaikan kasus lain dari masalah sumber daya di mana Anda lupa menghapus referensi ke memori / sumber daya dari suatu tempat, sehingga Anda masih dapat memiliki kebocoran memori dengan GC (objek Pengecualian sangat penting untuk merujuk banyak hal yang tidak Anda sadari).

Sementara GC dapat membantu Anda dengan melepaskan sumber daya selain memori dengan menggunakan finalizers (destructors), ia akan melepaskan sumber daya tersebut dengan penundaan non-deterministik, yang seringkali tidak sesuai untuk sumber daya seperti file atau soket jaringan. Untuk menangani masalah sumber daya semacam ini, Anda memerlukan beberapa konstruksi bahasa untuk sumber daya yang dicakup, seperti menggunakan pernyataan dalam C #, idiom RAII dalam C ++ atau ekstensi terbaru untuk mencoba sintaksis di Java 7 dan itu masih hanya membantu, karena Anda perlu menggunakannya dalam kode .

Diperlukan aritmatika penunjuk dan pembuatan alamat dari angka diperlukan untuk dapat menjalankan pemulung yang tepat. Beberapa optimasi bermanfaat seperti pemadatan hanya dapat diimplementasikan dalam kolektor yang tepat (Anda hanya dapat memindahkan objek jika Anda dapat mengetahui dengan pasti apa itu referensi, sehingga Anda dapat memperbaruinya; Anda tidak dapat melakukannya di C / C ++).

Jan Hudec
sumber
1

Pengumpulan sampah berfungsi dengan baik untuk memori. Jika Anda memiliki banyak memori, mengapa harus membersihkan setiap byte seperti yang dilakukan? GC biasanya merespons "tekanan memori" dan membersihkan bila diperlukan. Ini adalah hal yang baik untuk diingat. Namun, jika Anda memiliki objek yang menyimpan sumber daya non-memori (pegangan file, koneksi database, kunci) menunggu sampai tekanan memori memicu GC umumnya berarti menahan sumber daya terlalu lama. Anda memerlukan pendekatan lain untuk sumber daya tersebut. Itu mungkin berarti referensi penghitungan sumber daya bersama, dengan rilis deterministik ketika jumlah referensi mencapai nol, atau menggunakan / Buang pendekatan .NET.

Kate Gregory
sumber
0

Sistem GC adalah perangkat lunak yang berupaya mengoptimalkan penggunaan memori untuk program yang sedang berjalan.

Sistem GS adalah tanggung jawab dan merupakan komponen kerangka kerja (JVM / .NET).

Ini dapat membebaskan memori untuk beberapa objek yang diprediksi tidak diperlukan oleh aplikasi setelah titik tertentu dalam pemrosesan.

Dalam. NET hanya dapat membebaskan memori untuk beberapa objek .NET asli dan bukan untuk objek MS COM.

Objek MS COM yang digunakan dalam .NET harus dibebaskan secara eksplisit.

Referensi:

MSDN: Pengumpulan Sampah

Wikipedia: Koleksi Gabage

Tidak ada kesempatan
sumber
Mengapa diturunkan - Umpan balik Anda dihargai?
NoChance