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

Рейтинг: 3Ответов: 1Опубликовано: 26.11.2014

Здравствуйте.

Насколько и где уместно использовать 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;
  }

Ответы

▲ 3Принят

System.gc() уместно использовать только некоторых случаях. К примеру, если дальше идет участок кода, который сильно требовательный к памяти. И поэтому делают подготовку. Но все это лишняя работа. Уборщик мусора достаточно грамотный, чтобы сам делать уборку, когда нужно.

При начале работы, программа потребляет где-то 8-10 мб, чуть после количество потребляемой памяти вырастает до 100, 200-250 мб, после чего освобождается.

Нормальное дело для типичного приложения.

Просто присвоение уже не нужному объекту null не меняет картину происходящего

а GC не следит за каждым чихом.

поэтому и пользуюсь System.gc(), чтобы не пугать пользователей.

Учитывая аппетиты браузеров, пользователей не испугать 100-200 мегабайтами памяти. Но Вы сделали ошибку, выбрав Java и беспокоясь о памяти. Выбирайте что-то одно - либо Java, либо тревога о памяти.

Я бы на Вашем месте понаблюдал картину в более длинной динамике. Скажем так, 10-20 дней работы. Если память не будет подыматься выше какого-то предела, то причин к тревоге нет. А если она постоянно растет - вот тут нужно тревожиться.

И как получились эти цифры - 200Мб? С диспетчера задач? Диспетчер задач не является профайлером и цифры, которые там указаны, достаточно специфичны. Их ещё нужно правильно трактовать.

Многие программы на java (да и не только) выделяют немного памяти про запас, чтобы потом более быстро работать. Вызывая принудительную уборку мусора, Вы заставляете комп больше работать.