Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Насколько и где уместно использовать System.gc()?

#java #memory

                    
Здравствуйте.
Насколько и где уместно использовать System.gc()? 
При начале работы программа потребляет где-то 8-10 мб, чуть после количество потребляемой
памяти вырастает до 100, 200-250 мб, после чего освобождается. 
По таймеру провожу System.gc() при росте объема памяти до 100+ мб, после чего объем
потребления сокращается опять до 8-10 мб. Нормально-ли так делать или все-таки лучше
заняться внутренней оптимизацией (правда, есть сомнения, что это сильно сократит объем)?
Просто присвоение уже не нужному объекту null не меняет картину происходящего и вроде,
и так программа уже слегка оптимизирована, конечно, не до идеала, но все же, поэтому
и пользуюсь System.gc(), чтобы не пугать пользователей.
UPD
Таким образом получаю объем потребления, может быть, это не самый лучший способ.
  private Long getMemoryTotal(){
    long allocatedMemory = (Runtime.getRuntime().totalMemory()-  Runtime.getRuntime().freeMemory());
    long resultkb = allocatedMemory / 1024;
    long resultmb = resultkb / 1024;
    return resultmb;
  }
    


Ответы

Ответ 1



System.gc() уместно использовать только некоторых случаях. К примеру, если дальше идет участок кода, который сильно требовательный к памяти. И поэтому делают подготовку. Но все это лишняя работа. Уборщик мусора достаточно грамотный, чтобы сам делать уборку, когда нужно. При начале работы, программа потребляет где-то 8-10 мб, чуть после количество потребляемой памяти вырастает до 100, 200-250 мб, после чего освобождается. Нормальное дело для типичного приложения. Просто присвоение уже не нужному объекту null не меняет картину происходящего а GC не следит за каждым чихом. поэтому и пользуюсь System.gc(), чтобы не пугать пользователей. Учитывая аппетиты браузеров, пользователей не испугать 100-200 мегабайтами памяти. Но Вы сделали ошибку, выбрав Java и беспокоясь о памяти. Выбирайте что-то одно - либо Java, либо тревога о памяти. Я бы на Вашем месте понаблюдал картину в более длинной динамике. Скажем так, 10-20 дней работы. Если память не будет подыматься выше какого-то предела, то причин к тревоге нет. А если она постоянно растет - вот тут нужно тревожиться. И как получились эти цифры - 200Мб? С диспетчера задач? Диспетчер задач не является профайлером и цифры, которые там указаны, достаточно специфичны. Их ещё нужно правильно трактовать. Многие программы на java (да и не только) выделяют немного памяти про запас, чтобы потом более быстро работать. Вызывая принудительную уборку мусора, Вы заставляете комп больше работать.

Ответ 2



я не эксперт в java, но на 99% уверен, что его использование неуместно практически всегда (за очень редкими исключениями). Современные сборщики мусроа достаточно умны и сами прекрапсно знают, когда, как и в каких количествах освобождать память. Подсказки со стороны программиста чаще всего будут "не в тему". Кроме того, присваивание ненужному объекту значения null - вещь вообще бесполезная. Сборщик мусора руководствуется другими принципами при решении об удалении объектов

Комментариев нет:

Отправить комментарий