Ini adalah pertanyaan yang sangat menyusahkan, dan saya merasa berkontribusi pada banyak orang yang menentang Jawa meskipun betapa berharganya suatu bahasa.
Fakta bahwa Anda tidak dapat mempercayai "System.gc" untuk melakukan apa pun adalah hal yang sangat menakutkan dan dapat dengan mudah memanggil "Ketakutan, Ketidakpastian, Keraguan" terasa dalam bahasa tersebut.
Dalam banyak kasus, senang menangani lonjakan memori yang Anda sebabkan dengan sengaja sebelum peristiwa penting terjadi, yang akan menyebabkan pengguna menganggap program Anda dirancang / tidak responsif.
Memiliki kemampuan untuk mengendalikan pengumpulan sampah akan menjadi alat pendidikan yang hebat, pada gilirannya meningkatkan pemahaman masyarakat tentang cara pengumpulan sampah dan bagaimana membuat program mengeksploitasi perilaku defaultnya serta perilaku terkontrol.
Biarkan saya meninjau argumen utas ini.
- Itu tidak efisien:
Seringkali, program mungkin tidak melakukan apa-apa dan Anda tahu itu tidak melakukan apa-apa karena cara itu dirancang. Misalnya, itu mungkin melakukan semacam penantian panjang dengan kotak pesan tunggu yang besar, dan pada akhirnya mungkin juga menambah panggilan untuk mengumpulkan sampah karena waktu untuk menjalankannya akan mengambil sebagian kecil dari waktu lama menunggu tetapi akan menghindari gc dari bertingkah di tengah operasi yang lebih penting.
- Itu selalu merupakan praktik yang buruk dan menunjukkan kode yang rusak.
Saya tidak setuju, tidak masalah apa pun yang Anda miliki. Tugasnya adalah melacak sampah dan membersihkannya.
Dengan memanggil gc pada saat penggunaannya kurang kritis, Anda mengurangi peluangnya berjalan ketika hidup Anda bergantung pada kode tertentu yang sedang dijalankan tetapi sebaliknya ia memutuskan untuk mengumpulkan sampah.
Tentu, itu mungkin tidak berperilaku seperti yang Anda inginkan atau harapkan, tetapi ketika Anda ingin menyebutnya, Anda tahu tidak ada yang terjadi, dan pengguna bersedia mentolerir kelambatan / downtime. Jika System.gc berfungsi, bagus! Jika tidak, setidaknya Anda sudah mencoba. Tidak ada sisi negatifnya kecuali pengumpul sampah memiliki efek samping yang melekat yang melakukan sesuatu yang sangat tidak terduga terhadap bagaimana seorang pengumpul sampah seharusnya berperilaku jika diminta secara manual, dan ini dengan sendirinya menyebabkan ketidakpercayaan.
- Ini bukan kasus penggunaan umum:
Ini adalah use case yang tidak dapat dicapai dengan andal, tetapi bisa jadi jika sistem dirancang seperti itu. Ini seperti membuat lampu lalu lintas dan membuatnya sehingga beberapa / semua tombol lampu lalu lintas tidak melakukan apa-apa, itu membuat Anda mempertanyakan mengapa tombol itu ada untuk memulai, javascript tidak memiliki fungsi pengumpulan sampah sehingga kami tidak akan meneliti sebanyak itu untuk itu.
- Spesifikasi mengatakan bahwa System.gc () adalah petunjuk bahwa GC harus dijalankan dan VM bebas untuk mengabaikannya.
apa itu "petunjuk"? apa itu "abaikan"? komputer tidak bisa sekadar mengambil petunjuk atau mengabaikan sesuatu, ada jalur perilaku ketat yang diperlukan yang mungkin dinamis yang dipandu oleh maksud sistem. Jawaban yang tepat akan mencakup apa yang sebenarnya dilakukan oleh pemulung, pada tingkat implementasi, yang menyebabkannya tidak melakukan pengumpulan ketika Anda memintanya. Apakah fitur ini hanya sebuah kegagalan? Adakah kondisi yang harus saya penuhi? Apa saja kondisi ini?
Seperti namanya, Java GC sering tampak seperti monster yang tidak Anda percayai. Anda tidak tahu kapan itu akan datang atau pergi, Anda tidak tahu apa yang akan dilakukan, bagaimana itu akan dilakukan. Saya dapat membayangkan beberapa ahli memiliki gagasan yang lebih baik tentang bagaimana Koleksi Sampah mereka bekerja berdasarkan per-instruksi, tetapi sebagian besar hanya berharap itu "hanya bekerja", dan harus mempercayai algoritma yang tampaknya buram untuk melakukan pekerjaan untuk Anda membuat frustrasi.
Ada kesenjangan besar antara membaca tentang sesuatu atau diajarkan sesuatu, dan benar-benar melihat implementasinya, perbedaan antar sistem, dan mampu bermain dengannya tanpa harus melihat kode sumber. Ini menciptakan kepercayaan diri dan perasaan penguasaan / pemahaman / kontrol.
Untuk meringkas, ada masalah yang melekat dengan jawaban "fitur ini mungkin tidak melakukan apa-apa, dan saya tidak akan menjelaskan bagaimana cara mengetahui kapan ia melakukan sesuatu dan kapan tidak dan mengapa itu tidak atau akan, sering menyiratkan bahwa itu bertentangan dengan filosofi untuk mencoba melakukannya, bahkan jika maksud di baliknya masuk akal ".
Mungkin baik bagi Java GC untuk berperilaku seperti itu, atau mungkin tidak, tetapi untuk memahaminya, sulit untuk benar-benar mengikuti arah mana yang harus ditempuh untuk mendapatkan gambaran komprehensif tentang apa yang dapat Anda percayai untuk dilakukan oleh GC dan tidak melakukannya, jadi terlalu mudah untuk tidak mempercayai bahasa, karena tujuan dari suatu bahasa adalah untuk mengendalikan perilaku hingga batas filosofis (mudah bagi seorang programmer, terutama pemula untuk masuk ke dalam krisis eksistensial dari perilaku sistem / bahasa tertentu) Anda mampu mentolerir (dan jika Anda tidak bisa, Anda tidak akan menggunakan bahasa sampai Anda harus), dan lebih banyak hal yang Anda tidak bisa kendalikan tanpa alasan yang diketahui mengapa Anda tidak bisa mengendalikannya secara inheren berbahaya.