Java geliştiricileri çöp toplama algoritmalarını bilmeli mi? [kapalı]


11

Yakın zamanda bir röportajda bana çöp toplama algoritmaları hakkında bilgi sahibi olup olmadığım soruldu.

Çöp toplamanın ne olduğunu biliyordum ama çöp toplama algoritmaları hakkında bir şeyler öğrenmeyi hiç düşünmemiştim çünkü bir geliştirici olarak bu konuda hiç endişe etmemeliydim ve Çöp toplayıcı benim için tüm zor işleri yapıyor.

Java geliştiricilerinin çöp toplayıcı algoritmaları hakkında bilgi sahibi olması gerektiğini düşünüyor musunuz? Cevabınız evet ise, hangilerine bakmam gerektiğini söyleyebilir misiniz?



1
Evet yapmalılar. Aksi takdirde ağır yük altında kırılan yazılım yazma riskini taşırlar.
quant_dev

Yanıtlar:


9

Yazılım platformları değil, "standart yazılım" geliştirirseniz çöp toplama algoritmalarını bilmenin hiç de önemli olmadığını düşünüyorum. Bir çöp toplayıcının nasıl çalıştığını ve bununla ilgili temel bir anlayışa sahip olmalısınız. Çöp toplamanın neden olduğu yazılımlarda kritik gecikmeler yaşamanız ya da bellek kullanımını optimize etmeniz gerekmediği sürece.

Bu algoritmalarla ilgileniyorsanız, lütfen bu yazıma bakın: Düşük duraklatma GC'nin arkasındaki algoritmalar nelerdir?


7

Çöp toplama ilginç, önemsiz olmayan bir bilgisayar bilimi problemidir.

Bunun için bir algoritmayı bilmek ve anlamak, bu algoritmalara oldukça derin ilgi duyduğunuzu ve anladığınızı gösterir. Java'nın GC algoritmasını incelememiş olsanız bile, birisinin hangi veri yapılarının ve algoritmalarının kullanılacağına dair makul bir açıklama yapabilmesi beni etkileyecektir.

Bir Java programcısı olarak, bir geliştiricinin GC'nin nasıl uygulandığına dair biraz bilgi içerecek olan avantajlarını ve dezavantajlarını tanımlayabilmesi iyi olurdu. Bu, kullandığınız araçların pasif olarak kullanmaktan ziyade nasıl çalıştığına ilgi duyduğunu gösterir. Maliyetleri bilmek, maliyetleri en aza indirecek şekilde programlamanıza da yardımcı olacaktır.

Bunun bir Java geliştiricisi olarak geçimini sağlamak için "gerekli bilgi" olduğunu söylemezdim, ama bugünün işini yapmak için bilmeniz gerekenden biraz daha derine inebildiğinizi ve istekli olduğunuzu gösteren artı bir beceri.


2
Kabul ettiğim temelleri anlamayı bilmek (bir şeyleri anlamak sizi daha iyi bir kodlayıcı yapar). Sorun, karmaşık ayrıntıları biliyorsanız ve daha sonra use that informationkodunuzu tasarlamanızdır. GC iyileştirildikçe ve GC'nin artık tutmadığı ve kodun optimal olmadığı (ve en kötü durumda GC'yi engelleyebileceği) hakkındaki varsayımlarınız bu sorunlara neden olabilir. Bilmenizde fayda var, ancak kodunuzu belirli bir uygulamayı göz önünde bulundurmadan en iyi uygulamaları kullanarak tasarlamalısınız; derleyiciler ve GC her zaman gelişiyor ve makro optimizasyonlar sonuçta yararlı olamayacak.
Martin York

Ben nasıl Stringuygulanır hakkında bir şey biliyorsanız , o zaman +bir döngü kullanarak bir dizeye bitiştirmek değil hatları boyunca daha düşünüyordum .
JohnMcG

4

Çöp toplayıcının (veya herhangi bir algoritmanın / teknolojinin) nasıl çalıştığını bilmesi için iki neden görüyorum. İşte bunlar:
1. Yazdığınız kodun altında neler olup bittiğini daha iyi anlarsınız. Bu genellikle daha verimli bir kod yazmanıza yardımcı olabilir, bu da daha iyi performansı garanti eder. Bazı durumlarda bu hayati olabilir. (GWT, tarayıcının çöp toplayıcısına güvenirken hoş olmayan bir deneyim yaşadım ve Chrome ile büyük bir bellek sızıntısı yaşadık. Bu nedenle, sızıntıya tam olarak neyin neden olduğunu görmek zorunda kaldık.)
2. Bu tür algoritmalar her zaman (veya neredeyse her zaman, hayır, her zaman) akıllı, yetenekli, nitelikli ve deneyimli geliştiricilere güvenir. Bu yüzden yaklaşımlarını incelemek çok faydalı olabilir.

Görüşme sırasında böyle bir soru sorulmasının başka bir nedenini görüyorum. Bazı geliştiriciler (özellikle eski meslektaşım), bir geliştiricinin bu tür şeyleri bilmiyorsa yeterince akıllı veya çalışkan olmadığını düşünüyor. Bu ifadeye katılmıyorum. Ama her neyse, böyle şeyleri bilmek, görüşmecinizi etkilemek için iyi bir yoldur.


1
(2) ve (1) 'in yarısına katılıyorum (hata ayıklamaya yardımcı olur). Ancak (1) 'de tehlikeler vardır ve kodunuzu bir GC'nin belirli bir uygulamasında çalışacak şekilde tasarlayın, çünkü GC geliştirildiğinde veya farklı türde bir GC ile bir uygulamaya geçtiğinizde artık en uygun olmayacaktır.
Martin York

@Loki Astari, belirli uygulamalar için tehlikeli olduğu konusunda haklısınız. Ancak öte yandan, örneğin .NET'in çöp toplama ilkeleri gibi (en azından uzun bir süre) değişmeyen şeyler var.
superM

@superM: Aslında, Mono'nun GC'si Microsoft'tan önemli ölçüde farklıdır ve tamamen farklı bir tane ile değiştirilme sürecindedir.
Jörg W Mittag

@superM: Bana Java evriminin o kadar yavaş gözükmüyor: en.wikipedia.org/wiki/Java_version_history (yılda bir kez yeni bir yama veya güncelleme var gibi görünüyor). Gelecek yıl yeni bir sürümle. Bu, GC'nin her seferinde güncellendiği anlamına gelmez, ancak potansiyelini gösterir.
Martin York

@Loki Astari, doğru. Yazılım geliştirmede çok şey hızla değişmeye devam ediyor ve işimiz buna ayak uydurmak. Ayrıca, tüm değişiklikler zaten mevcut olana dayanmaktadır, bu yüzden 1 veya 2 versiyonda radikal değişiklikler beklemezdim.
superM

4

Nesil çöp toplama ve Java çöp toplama (PermGen, Eden ve Tenured uzayları) hakkında bilgi sahibi olmalısınız. Ayrıca genel olarak çöp toplama hakkında bilgi sahibi olmalısınız (referans sayımının neden genellikle kötü bir fikir olduğu ve işaretleme ve süpürmenin neden daha iyi olduğu gibi). Ayrıca bazı alternatif uygulamaları (Azul Zing JVM ve IBM'in gerçek zamanlı Metronom projesindeki "pauseless" GC gibi) okumanızı da tavsiye ederim .


3

Java için çöp toplamanın iki nedenden dolayı nasıl çalıştığı hakkında BAZI bilgiye sahip olmalısınız:

İlk olarak, nasıl çalıştığını bilmiyorsanız, yanlışlıkla gerçek uygulamanızda en kötü performansa yol açan tasarım kararları verebilirsiniz. Bu, GC geliştikçe daha az olası hale gelir, ancak uygulamanızda bir dizi algoritma varsa, GC hakkında bir şey bilmek, bunun nedenini bulmak yerine ne yapacağına dair bilgi sahibi olan birini seçebileceğiniz anlamına gelir. kötü davranış.

İkincisi, nasıl çalıştığını bilmiyorsanız, belirli bir uygulama için GC'yi ayarlayamazsınız. Çoğu Java programcısının GC'yi ayarlaması gerekmez, çünkü varsayılan parametreler çoğu zaman yeterince iyi çalışır. Eğer 'çoğu zaman' olan bir şey yaparsanız, GC parametrelerini ayarlarken kendinizi bulabilirsiniz. GC bilgisi olmadan bunu yapmak sadece rastgele düğmeleri döndürür - bundan yararlı bir şey alabilirsiniz, ancak daha büyük olasılıkla işleri daha da kötüleştireceksiniz.

Bu nedenle, iyi bir Java programcısının güneşin altında GC hakkında her şeyi bilmesini beklemiyor olsam da, o programcıdan JVM'deki GC'nin işlevleri nasıl kullandığını ve bunun için ne denli iyi olduğunu bilmesini beklerdim. GC algoritması.


1

Evet, her Java geliştiricisi, sanal makinenin perde arkasında neler olduğunu ve çöp toplama işini içerenleri kesinlikle bilmelidir.

Bilgi nasıl yapılır seviyesi başka bir sorudur. Normal bir geliştiricinin gerçek bir uygulamanın farkını açıklamasını beklemem (kendim hakkında biraz araştırma yapmalıyım), ancak bir GC'nin ne yaptığı ve hafızayı kendiniz yönetmeye karşı artıları ve eksileri ne olmalıdır temel prensibi açık.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.