ผู้พัฒนาจาวาควรรู้เกี่ยวกับอัลกอริทึมการรวบรวมขยะหรือไม่? [ปิด]


11

ฉันถูกถามเมื่อเร็ว ๆ นี้ในการสัมภาษณ์ถ้าฉันรู้เกี่ยวกับอัลกอริทึมการเก็บขยะใด ๆ

ฉันรู้ว่าการเก็บขยะคืออะไร แต่ฉันไม่เคยคิดถึงการเรียนรู้เกี่ยวกับอัลกอริทึมการรวบรวมขยะเพราะในฐานะนักพัฒนาฉันไม่ต้องกังวลเกี่ยวกับมันและตัวรวบรวมขยะทำงานหนักสำหรับฉัน

พวกคุณคิดว่าผู้พัฒนา Java ควรรู้เกี่ยวกับอัลกอริทึมตัวรวบรวมขยะหรือไม่? ถ้าใช่คุณบอกฉันได้ไหม



1
ใช่พวกเขาควร มิฉะนั้นพวกเขาจะเสี่ยงต่อการเขียนซอฟต์แวร์ที่แบ่งตามภาระหนัก
quant_dev

คำตอบ:


9

ฉันคิดว่าการรู้ถึงอัลกอริธึมการเก็บขยะไม่ใช่เรื่องสำคัญหากคุณพัฒนา "ซอฟต์แวร์มาตรฐาน" และไม่ใช่แพลตฟอร์มซอฟต์แวร์ คุณควรมีความเข้าใจพื้นฐานเกี่ยวกับการทำงานของตัวเก็บขยะและสิ่งที่เกี่ยวกับมัน หากคุณไม่ได้สัมผัสกับความล่าช้าที่สำคัญในซอฟต์แวร์ของคุณที่เกิดจากการรวบรวมขยะหรือคุณต้องการเพิ่มประสิทธิภาพการใช้หน่วยความจำ

หากคุณสนใจอัลกอริธึมเหล่านี้โปรดดูโพสต์ของฉัน: อัลกอริทึมที่อยู่เบื้องหลังการหยุด GC ชั่วคราวมีอะไรบ้าง


7

การรวบรวมขยะเป็นปัญหาทางวิทยาศาสตร์คอมพิวเตอร์ที่น่าสนใจและไม่สำคัญ

การรู้จักและเข้าใจอัลกอริธึมเป็นสิ่งบ่งชี้ว่าคุณมีความสนใจและเข้าใจอัลกอริธึมลึกมาก แม้ว่าคุณจะไม่ได้ศึกษาอัลกอริทึม GC ของ Java แต่ก็จะทำให้ฉันประทับใจถ้ามีคนสามารถให้คำอธิบายที่สมเหตุสมผลเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึมที่จะใช้

ในแง่ของการเป็นโปรแกรมเมอร์ Java มันจะดีถ้านักพัฒนาสามารถอธิบายข้อดีและข้อเสียของ GC ซึ่งจะรวมถึงความรู้เล็กน้อยเกี่ยวกับวิธีการใช้งาน สิ่งนี้จะบ่งบอกว่าคุณมีความสนใจในวิธีที่เครื่องมือที่คุณใช้ทำงานแทนที่จะใช้เฉยๆ การรู้ต้นทุนจะช่วยให้คุณเขียนโปรแกรมด้วยวิธีที่ลดต้นทุนให้ต่ำที่สุด

ฉันจะไม่พูดว่านี่คือ "ความรู้ที่จำเป็น" เพื่อให้มีชีวิตในฐานะนักพัฒนา Java แต่ทักษะบวกที่แสดงให้เห็นว่าคุณสามารถและเต็มใจที่จะไปให้ลึกกว่าสิ่งที่คุณต้องรู้เพื่อให้งานของวันนี้สำเร็จ


2
รู้การทำความเข้าใจพื้นฐานฉันจะเห็นด้วยกับ (เข้าใจสิ่งที่ทำให้คุณเป็น coder ที่ดีกว่า) ปัญหาคือว่าถ้าคุณรู้รายละเอียดที่ซับซ้อนและจากนั้นuse that informationในการออกแบบรหัสของคุณ สิ่งนี้อาจทำให้เกิดปัญหาได้เนื่องจาก GC ได้รับการปรับปรุงและข้อสมมติฐานของคุณเกี่ยวกับวิธีที่ GC ไม่เก็บรักษาไว้และรหัสไม่เหมาะสม (และในกรณีที่เลวร้ายที่สุดอาจขัดขวาง GC) เป็นการดีที่ควรทราบ แต่คุณควรออกแบบรหัสของคุณโดยใช้แนวปฏิบัติที่ดีที่สุดโดยไม่คำนึงถึงการใช้งานเฉพาะ คอมไพเลอร์และ GC นั้นปรับปรุงอยู่เสมอและการปรับแต่งมาโครในที่สุดก็จะล้มเหลวในการเป็นประโยชน์
Martin York

ฉันกำลังคิดตามบรรทัดที่ว่าถ้าคุณรู้บางอย่างเกี่ยวกับวิธีStringการนำไปใช้คุณจะไม่ต่อกันกับสตริงที่ใช้+ในการวนซ้ำ
JohnMcG

4

ฉันเห็นสองเหตุผลว่าทำไมคนเราควรรู้ว่าตัวรวบรวมขยะ (หรืออัลกอริทึม / เทคโนโลยี) ทำงานอย่างไร ที่นี่พวกเขาคือ:
1 คุณจะได้รับความรู้ที่ดีขึ้นของสิ่งที่เกิดขึ้นภายใต้รหัสที่คุณเขียน วิธีนี้มักจะช่วยให้คุณเขียนโค้ดที่มีประสิทธิภาพมากขึ้นซึ่งจะรับประกันประสิทธิภาพที่ดีขึ้น ในบางกรณีอาจมีความสำคัญ (ฉันเคยมีประสบการณ์ที่ไม่พึงประสงค์เมื่อ GWT พึ่งพาตัวรวบรวมขยะของเบราว์เซอร์และเรามีหน่วยความจำรั่วขนาดใหญ่ด้วย Chrome ดังนั้นเราต้องดูว่าอะไรทำให้เกิดการรั่วไหลอย่างแน่นอน)
2. อัลกอริธึมดังกล่าวมักจะเสมอ ไม่เสมอ) เชื่อถือได้กับนักพัฒนาที่ฉลาดมีทักษะมีคุณสมบัติและมีประสบการณ์ ดังนั้นการเรียนรู้วิธีการของพวกเขาจึงมีประโยชน์มาก

ฉันเห็นอีกเหตุผลว่าทำไมคุณถึงถูกถามคำถามเช่นนี้ในการสัมภาษณ์ นักพัฒนาบางคน (โดยเฉพาะเพื่อนร่วมงานของฉันโดยเฉพาะ) คิดว่านักพัฒนาซอฟต์แวร์ไม่ฉลาดหรือทำงานหนักพอหากเขา / เธอไม่รู้จักสิ่งนั้น ฉันไม่เห็นด้วยกับคำสั่งนี้ แต่อย่างไรก็ตามการรู้สิ่งต่าง ๆ เป็นวิธีที่ดีในการสร้างความประทับใจให้ผู้สัมภาษณ์ของคุณ


1
ฉันเห็นด้วยกับ (2) และครึ่งหนึ่งของ (1) (ช่วยในการดีบัก) แต่มีอันตรายใน (1) และออกแบบรหัสของคุณให้ทำงานกับการติดตั้ง GC โดยเฉพาะซึ่งจะไม่เหมาะสมเมื่อ GC นั้นได้รับการปรับปรุงหรือคุณย้ายไปใช้กับ GC ชนิดอื่น
Martin York

@ Loki Astari คุณพูดถูกมันอันตรายสำหรับการใช้งานเฉพาะ แต่ในทางกลับกันมีบางสิ่งที่ไม่เปลี่ยนแปลง (อย่างน้อยก็นาน) หลักการการเก็บขยะของ. NET เป็นตัวอย่าง
superM

@superM: ที่จริงแล้ว GC ของ Mono นั้นแตกต่างจาก Microsoft อย่างมากและอยู่ในขั้นตอนของการถูกแทนที่ด้วยอันที่ต่างออกไปโดยสิ้นเชิง
Jörg W Mittag

@superM: อย่ามองว่าการวิวัฒนาการของจาวาช้าสำหรับฉัน: en.wikipedia.org/wiki/Java_version_history (ดูเหมือนปีละครั้งจะมีแพทช์หรืออัปเดตใหม่) พร้อมเปิดตัวใหม่ในปีหน้า ตอนนี้ไม่ได้หมายความว่า GC จะอัปเดตทุกครั้ง แต่จะแสดงศักยภาพ
Martin York

@ Loki Astari ถูกต้องแล้ว การพัฒนาซอฟต์แวร์จำนวนมากมีการเปลี่ยนแปลงอย่างรวดเร็วและงานของเราคือติดตามให้ทัน นอกจากนี้การเปลี่ยนแปลงทั้งหมดขึ้นอยู่กับสิ่งที่มีอยู่แล้วดังนั้นฉันจะไม่คาดหวังการเปลี่ยนแปลงที่รุนแรงใด ๆ ภายใน 1 หรือ 2 เวอร์ชัน
superM

4

คุณควรรู้เกี่ยวกับการรวบรวมขยะทั่วไปและข้อมูลเฉพาะเกี่ยวกับการรวบรวมขยะ Java (พื้นที่ PermGen, Eden และ Tenured) คุณควรทำความคุ้นเคยกับการรวบรวมขยะโดยทั่วไป (เช่นทำไมการนับการอ้างอิงมักเป็นความคิดที่ไม่ดีและทำไมการทำเครื่องหมายและการกวาดจึงดีกว่า) ฉันขอแนะนำให้อ่านการใช้งานทางเลือกบางอย่าง (เช่น "หยุดชั่วคราว" GC ใน Zing JVM ของ Azul และโครงการ Metronomeเรียลไทม์ของ IBM )


3

คุณควรมีความรู้เกี่ยวกับการเก็บขยะสำหรับ Java ด้วยเหตุผลสองประการ:

ขั้นแรกถ้าคุณไม่รู้วิธีการทำงานคุณอาจตัดสินใจเลือกการออกแบบโดยไม่ตั้งใจซึ่งนำไปสู่การทำงานที่เลวร้ายที่สุดในแอปพลิเคชันจริงของคุณ สิ่งนี้จะมีโอกาสน้อยลงเมื่อ GC พัฒนาขึ้น แต่ถ้าคุณมีตัวเลือกของอัลกอริทึมในแอปของคุณการรู้อะไรบางอย่างเกี่ยวกับ GC หมายความว่าคุณสามารถเลือกสิ่งที่มีความรู้เกี่ยวกับสิ่งที่มันกำลังทำอยู่แทนที่จะค้นหาว่ามันเป็นสาเหตุ พฤติกรรมที่ไม่ดี

ประการที่สองหากคุณไม่ทราบวิธีการทำงานคุณอาจไม่สามารถปรับ GC สำหรับแอปพลิเคชันที่กำหนด โปรแกรมเมอร์ Java ส่วนใหญ่ไม่จำเป็นต้องปรับแต่ง GC เนื่องจากพารามิเตอร์เริ่มต้นทำงานได้ดีพอเกือบตลอดเวลา หากคุณทำบางสิ่งที่ทำให้เกิด 'เวลาส่วนใหญ่' คุณอาจพบว่าตัวเองปรับพารามิเตอร์ GC การทำเช่นนั้นโดยปราศจากความรู้เรื่อง GC เป็นเพียงการเปลี่ยนลูกบิดแบบสุ่ม - คุณอาจได้รับสิ่งที่มีประโยชน์จากมัน

ดังนั้นในขณะที่ฉันไม่คาดหวังว่าโปรแกรมเมอร์ Java ที่ดีจะรู้ทุกอย่างภายใต้ดวงอาทิตย์เกี่ยวกับ GC ฉันคาดหวังว่าโปรแกรมเมอร์จะรู้ในระดับหนึ่งว่า GC ใน JVM ที่พวกเขาใช้ฟังก์ชั่นเป็นอย่างไรและการแลกเปลี่ยนอะไรสำหรับเรื่องนั้น อัลกอริทึม GC


1

ใช่นักพัฒนา Java ทุกคนควรรู้ว่าเกิดอะไรขึ้นเบื้องหลังของเครื่องเสมือนและรวมถึงงานของการรวบรวมขยะ

ระดับของความรู้ howver เป็นคำถามอื่น ฉันไม่คาดหวังว่าผู้พัฒนาปกติจะอธิบายความแตกต่างของการใช้งานจริง (ฉันจะต้องทำวิจัยบางอย่างด้วยตัวเอง) อย่างไรก็ตามหลักการพื้นฐานของสิ่งที่ GC ทำและข้อดีข้อเสียของการจัดการหน่วยความจำด้วยตัวคุณเอง ชัดเจน.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.