Главная » Java » Взаимодействие со сборщиком мусора Java

0

  

  Хотя язык как таковой не предоставляет средств избавления от нежелательных объектов, существует возможность явного вызова процесса сборки мусора.  Класс Runtime совместно с некоторыми удобными методами класса System позволяет активизировать сборщик мусора, провоцировать выполнение процедур  finalize и запрашивать данные о текущем состоянии памяти, public void gc()

Обращается к виртуальной машине с требованием предпринять попытки утилизации неиспользуемых объектов, чтобы занимаемая ими память могла быть использована заново.

public void  runFinalizationO

Обращается к виртуальной машине с требованием предпринять попытки активизировать методы fi nal i ze недостижимых объектов, для которых раньше этот процесс не выполнялся.

public long freeMemoryO

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

public long totalMemoryO

Возвращает значение общего объема системной памяти в байтах.

  Чтобы получить возможность обращения к этим методам, следует затребовать ссылку на текущий объект класса Runtime посредством статического метода Runti me . getRunti me. Класс System поддерживает статические методы gc и runFi nal i zati on, из которых вызываются соответствующие методы текущего объекта Runtime, т.е. выражение System. gc() равнозначно Runtime.getRuntime.gc().

  При вызове Runti me. gc сборщик мусора иногда просто неспособен восстановить какое бы то ни было свободное пространство памяти. Мусора может не быть вовсе, а некоторые программы сборки мусора не в состоянии отыскивать подлежащие удалению объекты по требованию. Поэтому вызов сборщика мусора, возможно, действия не возымеет. Впрочем, перед тем как приступить к созданию большого количества объектов — особенно в приложениях, критичных к быстродействию, на производительности которых процесс сборки мусора может сказаться негативно, — по нашему мнению, все-таки следует обращаться к методу gc. Такой подход обеспечивает, по меньшей мере, два преимущества: вы приступите к работе, имея в распоряжении настолько большой объем свободной памяти, насколько это возможно, и снизите вероятность активизации сборщика мусора в период решения серьезной прикладной задачи. Ниже приведен пример метода, который в агрессивной манере осуществляет освобождение всей памяти, какую удастся получить в данный момент.

 

public static void fullGC()   {

  Runtime  rt = Runtime.getRuntime();

 long is Free = rt.freeMemoryO ;

 

long wasFree;

do {

     wasFree = isFree;

     rt. runFi nalizationO ;

     rt.gcO;

    isFree = rt.freeMemoryO ;

 } while  (isFree > wasFree);

}

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

   Обычно в непосредственном обращении к runFi nal izati on необходимости нет, поскольку методы finalize вызываются сборщиком мусора асинхронно. При определенных условиях, связанных, например, с опасностью исчерпания некоторого ресурса, восполнить который призваны методы finalize, полезно спровоцировать выполнение возможно большего числа таких методов. Но поскольку не известно, есть ли среди объектов, ожидающих осуществления finalize, те, которые действительно обладают нужными ресурсами, обращение к runFi nal i zation может оказаться тщетным.

   Метод fullGC, рассмотренный выше, на самом деле чрезмерно "агрессивен", причем по нескольким причинам. В тех необычных обстоятельствах, когда приходится явным образом обращаться к сборщику мусора, единственного вызова System.gc, как правило, бывает достаточно для отыскания и утилизации большей части — если не всего имеющегося в данный момент — мусора. Повторные обращения к System.gc становятся все менее плодотворными, а на многих системах они попросту не приносят результатов.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

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