Чи повинні розробники Java знати про алгоритми збору сміття? [зачинено]


11

Мене нещодавно в інтерв'ю запитали, чи знаю я про якісь алгоритми збору сміття.

Я знав, що таке сміття, але я ніколи не замислювався над тим, щоб дізнатися про алгоритми збору сміття, оскільки як розробник мені ніколи не доводилося переживати про це, і збирач сміття робить всю важку роботу для мене.

Ви думаєте, що розробники Java повинні знати алгоритми збору сміття? Якщо так, чи можете ви сказати мені, в кого я повинен заглянути?



1
Так, вони повинні. Інакше вони ризикують написати програмне забезпечення, яке зламається під великим навантаженням.
Quant_dev

Відповіді:


9

Я думаю, що знати алгоритми збору сміття зовсім не важливо, якщо ви розробляєте "стандартне програмне забезпечення", а не програмні платформи. Ви повинні мати базове розуміння того, як працює сміттєзбірник, і це стосується цього. Якщо ви не відчуваєте критичних затримок у вашому програмному забезпеченні, спричинених збиранням сміття, або вам потрібно оптимізувати використання пам'яті.

Якщо вас цікавлять ці алгоритми, будь ласка, ознайомтеся з цим моїм повідомленням: Які алгоритми стоять за GC з низькою паузою?


7

Збір сміття - цікава, нетривіальна проблема інформатики.

Знання та розуміння алгоритму - це ознака того, що ви досить глибоко зацікавлені та розумієте ці алгоритми. Навіть якщо ви не вивчали алгоритм GC Java на Java, це вразило б мене, якби хтось зміг би дати розумний опис того, які структури даних та алгоритми будуть використовуватися.

З точки зору як програміста Java, було б добре, якби розробник міг описати переваги та недоліки GC, які включали б трохи знань про те, як він реалізований. Це свідчить про зацікавленість у тому, як використовуються інструменти, а не просто пасивно їх використовувати. Знання витрат також допоможе програмувати таким чином, щоб мінімізувати витрати.

Я б не сказав, що це "необхідні знання", щоб заробити на життя як розробник Java, але плюс навик, який показує, що ви здатні та готові зайти трохи глибше, ніж те, що вам потрібно знати, щоб виконати сьогоднішню роботу.


2
Знаючи розуміння основ, я б погодився (розуміння речей робить вас кращим кодером). Проблема полягає в тому, що якщо ви знаєте складні деталі, а потім use that informationспроектувати свій код. Це може спричинити проблеми, коли GC вдосконалюється, а ваші припущення про те, як GC більше не утримується, і код стає неоптимальним (і в гіршому випадку може перешкоджати GC). Добре знати, але ви повинні розробити свій код, використовуючи кращі практики, не маючи на увазі конкретної реалізації; компілятори та GC завжди вдосконалюються, і макрооптимізація з часом просто не стане корисною.
Мартін Йорк

Я більше думав, що якщо ви знаєте щось про те, як Stringреалізовано, то ви не будете об'єднуватися в рядок, використовуючи +цикл.
JohnMcG

4

Я бачу дві причини, чому слід знати, як працює сміттєзбірник (або будь-який алгоритм / технологія). Ось вони:
1. Ви краще розумієте, що відбувається під кодом, який ви пишете. Це часто може допомогти вам написати більш ефективний код, що гарантуватиме кращу продуктивність. У деяких випадках це може бути життєво важливим. (У мене був неприємний досвід, коли GWT покладався на сміттєзбірник браузера, і ми мали величезну витік пам’яті за допомогою Chrome. Тому нам довелося побачити, що саме спричинило витік.)
2. Такі алгоритми завжди (або майже завжди, ні, завжди) довіряйте розумним, кваліфікованим, кваліфікованим та досвідченим розробникам. Тож вивчення їх підходу може бути дуже корисним.

Я бачу ще одну причину, чому вам задавали таке питання на співбесіді. Деякі розробники (особливо мій колишній колега) вважають, що розробник недостатньо розумний або працьовитий, якщо він / вона не знає таких речей. Я не згоден з цим твердженням. Але все одно, знати такі речі - це хороший спосіб справити враження на інтерв'ю.


1
Я погоджуюся з (2) і половиною (1) (допомагає в налагодженні). Але в (1) є небезпеки і спроектуйте свій код для роботи з конкретною реалізацією GC, оскільки він більше не буде оптимальним, коли або GC покращений, або ви переходите до реалізації з іншим типом GC.
Мартін Йорк

@Loki Astari, ви праві, що це небезпечно для конкретних реалізацій. Але, з іншого боку, є речі, які не змінюються (принаймні надовго), наприклад, принципи збору сміття .NET.
superM

@superM: Насправді, GC Mono суттєво відрізняється від Майкрософт, і він знаходиться в процесі заміни ще одним абсолютно іншим.
Йорг W Міттаг

@superM: Не схоже на те, що повільно розвивається Java для мене: en.wikipedia.org/wiki/Java_version_history (схоже, що раз на рік з’являється новий патч або оновлення). З новим випуском наступного року. Тепер це не означає, що GC оновлюється щоразу, але показує потенціал для цього.
Мартін Йорк

@Loki Астарі, саме так. Багато в розробці програмного забезпечення постійно змінюється, і наша робота - бути в курсі цього. Крім того, всі зміни базуються на тому, що вже є, тому я не очікував би кардинальних змін у межах 1 або 2 версій.
superM

4

Ви повинні знати про покоління збирання сміття та особливості збору сміття на Java (місця PermGen, Eden та Tenured). Ви також повинні бути добре знайомі зі збиранням сміття (наприклад, чому підрахунок посилань зазвичай є поганою ідеєю, і чому краще "розмітка" та "підмітка"). Я також рекомендую ознайомитися з деякими альтернативними реалізаціями (як, наприклад, "без пауз" GC в Azul JVM Zing і проект Metronome в реальному часі ).


3

Ви повинні мати деякі знання про те, як працює сміття для Java з двох причин:

По-перше, якщо ви не знаєте, як це працює, то ви можете випадково прийняти дизайнерські рішення, які призводять до найгірших результатів у вашому фактичному застосуванні. Це стає все менше і менш ймовірним, коли GC покращується, але якщо у вашому додатку є вибір алгоритмів, то знаючи щось про GC означає, що ви можете вибрати один із знанням того, що він буде робити, замість того, щоб дізнатися, що це викликає погана поведінка.

По-друге, якщо ви не знаєте, як це працює, ви не зможете налаштувати GC для заданої програми. Більшість програмістів Java ніколи не потребує налаштування GC, оскільки параметри за замовчуванням працюють досить добре більшу частину часу. Якщо ви робите щось, що виходить із цього «більшості часу», то, можливо, ви можете налаштувати параметри GC. Робити це без знання GC - це лише випадковим чином повороти ручки - ви можете отримати щось корисне з цього, але, швидше за все, ви все ще гірше викрутите.

Тож, хоч я і не очікував, що хороший програміст на Java знатиме все про НС про GC, я би сподівався, що програміст на якомусь рівні дізнається, як GC у JVM вони використовують функції та які компроміси для цього Алгоритм ГК.


1

Так, кожен розробник Java обов'язково повинен знати, що відбувається за лаштунками віртуальної машини, і що включає роботу зі збору сміття.

Рівень рівня знань - це ще одне питання. Я б не очікував, що звичайний розробник пояснить різницю фактичної реалізації (мені доведеться провести деякі дослідження цього), однак основним принципом того, що робить GC, і якими плюсами і мінусами проти управління пам’яттю повинен бути сам ясний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.