Страницы

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

пятница, 5 июля 2019 г.

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

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


Ответ

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

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

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