/ / Чи можемо ми викликати сміттєзбірника? [дублікат] - java, сміття

Чи можемо ми точно називати смітника? [дублікат] - java, сміття-збірка

У моїй програмі багато ітерацій. До цього часу я не стикався з будь-якими проблемами пам’яті. Але з рівня коду я можу підозрювати, що місця є мало, що спричиняє витік пам’яті та проблеми з пам’яттю. Я думаю зателефонувати в сміттєзбірник вручну. Це хороша практика викликати збирач сміття вручну?

Відповіді:

26 за відповідь № 1

Ви можете зателефонувати зі збирачем сміття за допомогою:

System.gc();

Але це не означає, що це "буде виконано негайно. JVM вирішує, коли його виконати. Загалом, якщо JVM збирається кинути OutOfMemoryError, зателефонувавши System.gc() нічого не запобіжить. Краще вивчіть, чому ви просочуєте стільки пам’яті та прибираєте її по дорозі.

JavaDoc:

Виклик методу gc говорить про те, що JavaВитрати на віртуальну машину зусилля по переробці невикористаних об'єктів, щоб зробити пам'ять На даний момент вони доступні для швидкого використання. Коли управління повертається з виклику методу, віртуальна машина Java доклала максимум зусиль повернути простір з усіх викинутих предметів


8 для відповіді № 2

Чи є гарною практикою виклик сміттєзбірника вручну?

Ні, це точно не є хорошою практикою.

Ви можете використовувати System.gc(). Зауважте, що це не гарантовано, щоб викликати сміттєзбірника - це лише дає натяк системі, що це може бути хорошою ідеєю робити збирання сміття.

Колектор для сміття в JVM Oracle містить безліч складних логік, щоб визначити, коли і що почистити. Налаштування вимагає знань про деталі того, як це працює. System.gc() десь у вашій програмі, швидше за все, це не дуже допоможе, а насправді це може навіть погіршити.

Побачити Налаштування сміття для віртуальної машини Java SE 6 HotSpot для детальної інформації про налаштування збору сміття за допомогою Java SE 6.


6 за відповідь № 3

Ви можете викликати Garbage Collector явно, але JVM вирішує, обробляти виклик чи ні. В ідеалі, ніколи не слід писати код залежно від дзвінка до сміттєзбірника.

JVM внутрішньо використовує деякий алгоритм, щоб вирішити, коли робити цей виклик. Під час здійснення дзвінка за допомогою System.gc (), це просто запит до JVM і JVM може будь-коли вирішити ігнорувати його.


5 за відповідь № 4

Так, ви можете явно викликати сміттєзбірник за допомогою

System.gc();

Але те, що трапляється, це те, що ви не можете «замовити JVM негайно робити сміття. JVM самостійно вирішує, коли збирати сміття. Отже, це не дуже гарна ідея викликати його вручну.

Більше того OutOfMemoryException робити ручне збирання сміття не допоможезапобігти винятку, оскільки JVM викидає цей виняток після повернення всієї пам'яті, яку він може. У ньому є кілька дуже складних алгоритмів, щоб визначити, коли і як робити виконання сміття. Тож, що я пропоную, це якщо ви отримуєте OutOfMemoryException потім перевірте свою програму, щоб зробити її більш ефективною або збільшити купу місця.


3 для відповіді № 5

Незалежно від того, ви можете чи не можете вручну спрацьовувати сміттєзбірник (та різні рівні збору) та який вплив це має на продуктивність (що насправді є тема, яку варто обговорити), це не завадить OutOfMemoryErrors, оскількиколи у JVM майже не вистачить пам’яті, він все одно робить найбільш ретельний збір. Тільки якщо після цієї колекції буде недостатньо пам'яті, вона помилиться. Навіть якщо ви самі запускаєте колекцію раніше, результат (кількість відновленої пам'яті) однаковий.

Витоки пам'яті неможливо виправити, запускаючи сміття частіше.

Вони повинні бути зафіксовані у вашій програмі (зупинкапосилання на речі, які вам більше не потрібні раніше), або (що найгірше, якщо це "справжня" протікання) в самій бібліотеці JVM або в режимі виконання (але справжні помилки управління пам’яттю більше не повинні існувати після стількох років служби).


2 для відповіді № 6

Виклик System.gc () не гарантує жодного GC. Сміття збирають, якщо є реальна потреба в пам’яті.
Тут ви можете ознайомитися з різними збирачами сміття.
http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

Ви можете включити будь-який із цих ГК у параметри командного рядка відповідно до ваших потреб.