Перевага збору сміття полягає в тому, що він імітує машину з нескінченною кількістю пам'яті. Механізм або реалізація цієї абстракції має бути повністю прозорим для вас як програміста. Всі ми знаємо, що механізм відновлює пам'ять, яка більше не використовується програмою, але це фактично не гарантується. Якщо ви запускаєте програму на машині з більшою кількістю оперативної пам’яті, ніж програма ніколи фактично використовує, то збирання сміття може ніколи не відбутися. Знову ж таки, неважливо, адже ви можете просто написати програму, не зважаючи на те, як вона використовує пам'ять. Менеджер пам'яті просто виділить більше оперативної пам’яті, коли програма цього вимагає, і ви можете припускати, що такі розподіли завжди матимуть успіх. Java - мова, зібрана сміттям, а C ++ - ні. 1
Недоліком збору сміття є те, що, як і всі абстракції , воно, як правило, є герметичним. Це не завжди ідеально працює весь час, особливо в крайніх випадках, і ви, швидше за все, натрапите на помилки. Люди, які написали алгоритм вивезення сміття (той, який повинен бути прозорим для вас як програміста), оптимізовані для найпоширеніших випадків, і проблема з типовими випадками полягає в тому, що вони ніколи не є такими поширеними. Взагалі , ви не можете зробити нічого кращого, ніж сміттєзбірник в управлінні пам’яттю. Але в конкретних обставинах (і з урахуванням достатньої кількості часу, енергії та розуміння) це можливо. C ++ надає вам цю гнучкість; Java не робить.
З урахуванням всього цього, я думаю, що тут застосовуються стандартні поради щодо вибору мови, можливо, навіть більше, ніж у цьому випадку, враховуючи обмеження. Виберіть мову, найбільш відому первинним розробникам проекту. Окрім очевидних причин (наприклад, ви зможете розвивати додаток швидше та ефективніше), це особливоВажливо у випадку, який ви описуєте, оскільки програмування C ++, як ви програмуєте Java, призведе до надзвичайно неефективних практик управління пам'яттю, а отже, витоків та збоїв. Аналогічно, програмування на Java, як ви програмуєте на C ++, не принесе багато користі, і може в кінцевому підсумку створити програму, що не є оптимізованою, враховуючи, що алгоритми збору сміття налаштовані та налаштовані на найбільш поширені випадки .
Програмісти, які звикли працювати на зібраних сміттях мовах, вчаться довіряти сміттєзбірнику, а не боротися з ним. Якщо ви працюєте мовою, зібраною зі сміттям, це програмісти, які вам потрібні у вашому проекті. Програмістів, яких немаєзвикли працювати мовою, зібраною зі сміттям, по своїй суті скептично ставляться до такої абстракції "нескінченної пам'яті" і часто з великою кількістю вагомих причин. Добре, як це можуть бути ці програмісти, це не ті, з ким ви хочете працювати на зібраному сміттям мові, тому що вони будуть боротися проти GC на кожному кроці, постійно вдруге здогадуючись про це і часто створюючи повільніші, менш ефективні пам'яті код, ніж інший тип програміста. У кращому випадку вони просто витратять багато часу на винахід колеса, що коштуватиме вам чималих грошей та ще більше витрат на довгострокове обслуговування.
І тоді також потрібно запитати себе, чи це насправді має значення. Існує більше, ніж натяк на істину до коментаря Bode sdode: пам’ять зараз така дешева, навряд чи варто занадто сильно затискати руки. Навіть якщо вам потрібні великі суми, ці суми зараз не такі вже й великі, як 10 років тому. Програмісти та розробка додатків коштують набагато дорожче, ніж просто покупка оперативної пам'яті та процесорної потужності. Це не означає, що вам слід уникнути економії, де це можливо, але це означає, що ви також не повинні витрачати занадто багато часу на це.
1 Звичайно, це припущення вказує на глибший недолік у питанні. Як виявляється, "Java або C ++" - це трохи червона оселедець. Стандартна реалізація Java передбачає збирання сміття, а C ++ не відповідає мовному стандарту, але немає абсолютно ніяких причин, щоб ви не могли використовувати сторонній смітник для C ++. Багато компаній заробляли на життя, продаючи ці речі, а деякі, напевно, заробляли на життя, даруючи їх безкоштовно.