Главная » Java » Управление памятью способы для JAVA

0

Хотя Java не позволяет явно уничтожать ненужные объекты, вы можете непосредственно вызвать сборщик мусора, используя метод gc класса Runtime. Класс Runtime также содержит метод runFinalization для вызова ожидающих блоков завершения (finalizers). Класс Runtime содержит два метода для вывода информации о состоянии памяти:

public long freeMemory()

Возвращает примерное количество свободных байтов системной памяти. public long totalMemory()

Возвращает общее количество байтов системной памяти.

Класс System содержит статические методы gc и runFinalization, которые вызывают соответствующий  метод для текущего runtime-контекста.

Не исключено, что метод Runtime.gc не сможет освободить дополнительную память за счет избавления от “мусора” — его может и не быть, к тому же не все сборщики мусора могут находить ненужные объекты по требованию. Тем не менее перед созданием большого количества объектов (особенно в приложениях, критических по времени, на работе которых могут отрицательно сказаться накладные расходы по сборке мусора) все же стоит вызвать метод gc. Он приносит двойную пользу: вы начинаете работу с максимальным объемом свободной памяти и сокращаете вероятность вызова сборщика мусора во время выполнения программы. Следующий метод освобождает всю возможную память:

public static void fullGC() {

Runtime rt = Runtime.getRuntime();

long isFree = rt.freeMemory();

long wasFree;

do {

wasFree = isFree;

rt.gc();

isFree = rt.freeMemory();

} while (isFree >> wasFree);

rt.runFinalization();

}

Данный метод в цикле вызывает gc, при этом объем свободной памяти freeMemory увеличивается до определенного предела, после достижения которого дальнейшие вызовы gc, скорее всего, ни к чему не приведут. Затем мы обращаемся к runFinalization, чтобы немедленно выполнить все завершающие действия, не позволяя сборщику мусора отложить их на потом.

Обычно вам незачем использовать runFinalization, поскольку методы finalize вызываются сборщиком мусора асинхронно. Однако при некоторых обстоятельствах  (например, при нехватке ресурса, освобождаемого методом finalize) вынужденное исполнение всех возможных завершающих действий способно принести пользу. Конечно, нет никакой гарантии, что ожида-ющие завершения объекты используют данный ресурс, так что вызов run Finalization может оказаться бесполезным.

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии