Це дуже набридливе питання, і я думаю, що сприяє тому, що багато хто виступає проти Java, незважаючи на те, наскільки корисною є мова.
Те, що ви не можете довіряти "System.gc" робити що-небудь, неймовірно нелегко і може легко викликати почуття мови "Страх, невпевненість, сумніви".
У багатьох випадках приємно мати справу з шипами пам’яті, які ви завдаєте навмисно до того, як відбудеться важлива подія, яка змусить користувачів вважати, що ваша програма погано розроблена / не відповідає.
Вміння контролювати збирання сміття було б дуже чудовим інструментом освіти, що, в свою чергу, покращило розуміння людьми того, як працює сміття та як змусити програми використовувати його поведінку за замовчуванням, а також керовану поведінку.
Дозвольте переглянути аргументи цієї теми.
- Це неефективно:
Часто програма може нічого не робити, і ви знаєте, що нічого не роблять через те, як вона була розроблена. Наприклад, це може робити якесь довге очікування з великим полем очікування повідомлення, і наприкінці він може також додати дзвінок для збору сміття, оскільки час його запуску займе дійсно невелику частину часу довго чекати, але уникнути дії gc в середині більш важливої операції.
- Це завжди погана практика і вказує на зламаний код.
Я не згоден, не має значення, який у вас смітник. Його робота - відстежувати сміття та прибирати його.
Викликаючи gc під час, коли використання менш критичне, ви зменшуєте шанси на його виконання, коли ваше життя покладається на певний код, який виконується, але натомість він вирішує збирати сміття.
Звичайно, це може поводитись не так, як ви хочете чи очікуєте, але коли ви хочете зателефонувати, ви знаєте, що нічого не відбувається, і користувач готовий терпіти повільність / простої. Якщо System.gc працює, чудово! Якщо не виходить, принаймні ви спробували. Тут просто немає сторони, якщо у сміттєзбірника немає притаманних побічних ефектів, які роблять щось жахливо несподіване для того, як збирач сміття повинен вести себе, якщо викликати його вручну, і це саме по собі викликає недовіру.
- Це не звичайний випадок використання:
Це випадок використання, який неможливо досягти надійно, але це може бути, якби система була спроектована таким чином. Це як зробити світлофор і зробити так, що деякі / всі кнопки світлофорів нічого не роблять, це змушує вас запитати, чому ця кнопка починається з того, що у JavaScript немає функції збору сміття, тому ми не Не вивчайте його настільки, наскільки це.
- Спеціалізація говорить, що System.gc () - це натяк на те, що GC має працювати, і VM може ігнорувати це.
що таке "підказка"? що таке "ігнорування"? комп'ютер не може просто приймати підказки або щось ігнорувати, існують суворі шляхи поведінки, які можуть бути динамічними, керуючись намірами системи. Правильна відповідь містила б те, що насправді робить сміттєзбірник на рівні впровадження, що призводить до того, що він не виконує збір, коли ви його запитуєте. Чи є функція просто nop? Чи є якісь умови, які мені повинні відповідати? Які ці умови?
Як відомо, GC Java часто здається монстром, якому ви просто не довіряєте. Ви не знаєте, коли це прийде чи піде, ви не знаєте, що це буде робити, як це робити. Я можу собі уявити, що деякі фахівці мають краще уявлення про те, як працює їх сміттєзбірник за інструкцією, але переважна більшість просто сподівається, що це "просто працює", і довіряти непрозорому алгоритму, який може працювати для вас, неприємно.
Існує великий розрив між читанням про щось або навчанням чогось, і власне баченням його реалізації, відмінностями між системами та можливістю грати з ним, не дивлячись на вихідний код. Це створює впевненість і відчуття майстерності / розуміння / контролю.
Підводячи підсумок, існує відповідна проблема з відповідями: "Ця функція може нічого не робити, і я не буду вникати в деталі, як сказати, коли вона щось робить, а коли - ні, і чому це не буде чи буде, часто маючи на увазі, що намагатися зробити це просто проти філософії, навіть якщо наміри за нею є розумними ".
Для Java GC може бути добре поводитись так, як це робиться, а може і ні, але зрозуміти це, важко по-справжньому слідувати, в якому напрямку рухатися, щоб отримати всебічний огляд того, що можна довіряти GC та робити не робити цього, тому занадто просто просто недовіряти мові, адже мета мови - це керувати поведінкою до філософської міри (програмісту, особливо новачкам, впасти в екзистенційну кризу з певної поведінки системи / мови) ви здатні терпіти (і якщо ви не можете, ви просто не будете користуватися мовою, поки не доведеться), і більше речей, якими ви не можете керувати, з невідомих причин, чому ви не можете керувати ними, за своєю суттю шкідливо.