Baru-baru ini saya ditanyai dalam sebuah wawancara apakah saya tahu tentang algoritma pengumpulan sampah.
Saya tahu apa itu pengumpulan sampah, tetapi saya tidak pernah benar-benar berpikir untuk belajar tentang algoritma pengumpulan sampah karena sebagai pengembang saya tidak pernah perlu khawatir tentang hal itu dan pengumpul sampah melakukan semua kerja keras untuk saya.
Apakah Anda pikir pengembang Java harus tahu tentang algoritma pengumpul sampah? Jika ya, bisakah Anda memberi tahu saya mana yang harus saya perhatikan?
java
interview
garbage-collection
Kutu buku
sumber
sumber
Jawaban:
Saya pikir mengetahui algoritma pengumpulan sampah tidak penting sama sekali jika Anda mengembangkan "perangkat lunak standar" dan bukan platform perangkat lunak. Anda harus memiliki pemahaman dasar tentang cara kerja seorang pemulung dan hanya itu saja. Kecuali Anda mengalami keterlambatan kritis dalam perangkat lunak Anda yang disebabkan oleh pengumpulan sampah atau Anda perlu mengoptimalkan penggunaan memori.
Jika Anda tertarik dengan algoritme tersebut, silakan lihat posting saya ini: Apa saja algoritma di balik GC jeda rendah?
sumber
Pengumpulan sampah adalah masalah ilmu komputer yang menarik dan tidak sepele.
Mengetahui dan memahami suatu algoritma untuk itu adalah indikasi bahwa Anda memiliki minat dan pemahaman yang cukup mendalam tentang algoritma ini. Bahkan jika Anda belum mempelajari algoritma GC Java, akan mengesankan saya jika seseorang dapat memberikan deskripsi yang masuk akal tentang struktur data dan algoritma apa yang akan digunakan.
Dalam hal sebagai programmer Java, akan baik jika pengembang bisa menggambarkan kelebihan dan kekurangan GC, yang akan mencakup sedikit pengetahuan tentang bagaimana itu diterapkan. Ini akan menunjukkan memiliki minat pada bagaimana alat yang Anda gunakan bekerja daripada hanya menggunakannya secara pasif. Mengetahui biaya juga akan membantu Anda memprogram dengan cara yang meminimalkan biaya.
Saya tidak akan mengatakan ini adalah "pengetahuan yang diperlukan" untuk mencari nafkah sebagai pengembang Java, tetapi keterampilan plus yang menunjukkan Anda mampu dan mau melangkah sedikit lebih dalam dari apa yang perlu Anda ketahui untuk menyelesaikan pekerjaan hari ini.
sumber
use that information
merancang kode Anda. Ini dapat menyebabkan masalah karena GC ditingkatkan dan asumsi Anda tentang bagaimana GC tidak lagi berlaku dan kode menjadi tidak optimal (dan dalam kasus terburuk dapat menghambat GC). Baik untuk diketahui, tetapi Anda harus merancang kode Anda menggunakan praktik terbaik bukan dengan implementasi khusus; kompiler dan GC selalu membaik dan optimisasi makro pada akhirnya tidak akan berguna.String
diimplementasikan, maka Anda tidak akan menyambung ke string menggunakan+
dalam satu lingkaran.Saya melihat dua alasan mengapa orang harus tahu cara kerja pemulung (atau algoritma / teknologi apa pun). Inilah mereka:
1. Anda mendapatkan pengetahuan yang lebih baik tentang apa yang terjadi di bawah kode yang Anda tulis. Ini sering dapat membantu Anda menulis kode yang lebih efisien, yang akan menjamin kinerja yang lebih baik. Dalam beberapa kasus ini sangat penting. (Saya memiliki pengalaman yang tidak menyenangkan ketika GWT mengandalkan pengumpul sampah browser, dan kami mengalami kebocoran memori yang sangat besar dengan Chrome. Jadi kami harus melihat apa yang menyebabkan kebocoran itu terjadi.)
2. Algoritme seperti itu selalu (atau hampir selalu, tidak, selalu) dipercaya oleh pengembang yang cerdas, terampil, berkualitas, dan berpengalaman. Jadi mempelajari pendekatan mereka bisa sangat berguna.
Saya melihat alasan lain mengapa Anda ditanyai pertanyaan itu saat wawancara. Beberapa pengembang (khususnya mantan kolega saya) berpikir bahwa pengembang tidak cukup pintar atau bekerja keras, jika dia tidak tahu hal-hal seperti itu. Saya tidak setuju dengan pernyataan ini. Tapi bagaimanapun, mengetahui hal-hal seperti itu adalah cara yang bagus untuk mengesankan pewawancara Anda.
sumber
Anda harus tahu tentang pengumpulan sampah generasi, dan rincian tentang pengumpulan sampah Jawa (ruang PermGen, Eden dan Bertahan). Anda juga harus terbiasa dengan pengumpulan sampah secara umum (seperti mengapa penghitungan referensi biasanya merupakan ide yang buruk, dan mengapa mark-and-sweep lebih baik). Saya juga merekomendasikan membaca beberapa implementasi alternatif (seperti GC "tanpa jeda" dalam Azing's Zing JVM dan proyek Metronome real-time IBM ).
sumber
Anda harus memiliki BEBERAPA pengetahuan tentang bagaimana pengumpulan sampah untuk Java bekerja karena dua alasan:
Pertama, jika Anda tidak tahu cara kerjanya, maka Anda mungkin secara tidak sengaja membuat keputusan desain yang mengarah pada kinerja terburuk dalam aplikasi Anda yang sebenarnya. Ini menjadi semakin kecil kemungkinannya seiring peningkatan GC, tetapi jika Anda memiliki pilihan algoritma di aplikasi Anda, maka mengetahui sesuatu tentang GC berarti Anda dapat memilih satu dengan pengetahuan tentang apa yang akan dilakukan, alih-alih mencari tahu apa yang menyebabkannya. perilaku buruk.
Kedua, jika Anda tidak tahu cara kerjanya, Anda tidak mungkin menyetel GC untuk aplikasi yang diberikan. Kebanyakan programmer Java tidak perlu menyetel GC, karena parameter default berfungsi cukup baik hampir sepanjang waktu. Jika Anda melakukan sesuatu yang keluar dari 'sebagian besar waktu' itu, maka Anda mungkin menemukan diri Anda menyetel parameter GC. Melakukannya tanpa sepengetahuan GC hanya secara acak memutar tombol - Anda mungkin mendapatkan sesuatu yang berguna darinya, tetapi lebih besar kemungkinan Anda akan mengacaukan segalanya dengan lebih buruk.
Jadi, sementara saya tidak akan mengharapkan programmer Java yang baik untuk mengetahui segala sesuatu di bawah sinar matahari tentang GC, saya berharap programmer itu tahu pada tingkat tertentu bagaimana GC dalam JVM mereka menggunakan fungsi, dan apa kompromi untuk itu Algoritma GC.
sumber
Ya, setiap pengembang Java pasti harus tahu apa yang terjadi di balik layar mesin virtual dan itu termasuk pekerjaan pengumpulan sampah.
Tingkat pengetahuan howver adalah pertanyaan lain. Saya tidak akan mengharapkan pengembang normal untuk menjelaskan perbedaan implementasi yang sebenarnya (saya harus melakukan riset sendiri), namun prinsip dasar dari apa yang dilakukan oleh seorang GC dan apa pro dan kontra terhadap pengelolaan memori sendiri seharusnya bersih.
sumber