Haruskah pengembang java tahu tentang algoritma pengumpulan sampah? [Tutup]

11

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?

Kutu buku
sumber
1
Ya, mereka seharusnya. Kalau tidak, mereka berisiko menulis perangkat lunak yang rusak karena beban berat.
quant_dev

Jawaban:

9

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?

Elang
sumber
7

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.

JohnMcG
sumber
2
Mengetahui pemahaman dasar-dasar yang akan saya setujui (memahami hal-hal membuat Anda menjadi pembuat kode yang lebih baik). Masalahnya adalah jika Anda mengetahui detail rumit dan kemudian use that informationmerancang 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.
Martin York
Saya berpikir lebih dalam garis bahwa jika Anda tahu sesuatu tentang bagaimana Stringdiimplementasikan, maka Anda tidak akan menyambung ke string menggunakan +dalam satu lingkaran.
JohnMcG
4

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.

superM
sumber
1
Saya setuju dengan (2) dan setengah dari (1) (membantu dalam debugging). Tetapi ada bahaya dalam (1) dan rancang kode Anda untuk bekerja dengan implementasi tertentu dari GC di mana itu tidak akan lagi optimal ketika GC ditingkatkan atau Anda pindah ke implementasi dengan jenis GC yang berbeda.
Martin York
@Loki Astari, Anda benar tentang hal itu berbahaya untuk implementasi tertentu. Tapi, di sisi lain, ada hal-hal yang tidak berubah (untuk waktu yang lama, setidaknya), prinsip pengumpulan sampah .NET misalnya.
superM
@superM: Sebenarnya, Mono GC sangat berbeda dari Microsoft, dan sedang dalam proses diganti dengan yang lain sama sekali berbeda.
Jörg W Mittag
@superM: Tidak terlihat bahwa lambatnya evolusi Java bagi saya: en.wikipedia.org/wiki/Java_version_history (sepertinya setahun sekali ada tambalan baru atau pembaruan). Dengan rilis baru tahun depan. Sekarang bukan berarti GC diperbarui setiap kali tetapi menunjukkan potensi untuk itu.
Martin York
@Loki Astari, itu benar. Banyak perkembangan perangkat lunak yang terus berubah dengan cepat, dan tugas kita adalah mengikutinya. Selain itu, semua perubahan didasarkan pada apa yang sudah ada, jadi saya tidak akan mengharapkan perubahan radikal dalam 1 atau 2 versi.
superM
4

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

TMN
sumber
3

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.

Michael Kohne
sumber
1

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.

perdian
sumber