Подтвердить что ты не робот

Удаление неиспользуемой переменной памяти в java

Я знаю, что Java имеет собственную сборку мусора, но иногда я хочу удалить мусор вручную. Есть ли способ сделать такую ​​работу? И учитывая, что у меня длинный или очень длинный function, который объявляет множество переменных, является ли хорошей идеей удалить неиспользуемую память сразу после использования вместо автоматической коллекции в конце функции? Если я удаляю мусор вручную, это влияет на скорость моего приложения? Спасибо за помощь!

4b9b3361

Ответ 1

Нет прямого и немедленного способа освобождения памяти в java. Вы можете попытаться убедить сборщика мусора отнять какой-либо объект, используя хорошо известный:

Object obj = new Object();
// use obj
obj = null;
System.gc();

но нет гарантии, что это фактически освободит память немедленно.

В то время как это относится к памяти кучи, стеки выделенные элементы могут быть освобождены только после возвращения функции.

Ответ 2

Почему вы хотите удалить мусор "вручную"? Если это из-за нехватки памяти, вспомните, что Java собирается запускать сборку мусора, прежде чем бросать OutOfMemoryError. И если вы действительно не в памяти, тогда нет мусора даже для удаления вручную.

Объявление переменной не выделяет память в куче. Создание объекта с помощью new делает. JVM могут анализировать escape даже для ссылок на объекты GC, которые не вышли из области действия, но больше не используются до конца метода.

Если вы имеете в виду, что вы активно хотите освободить память в определенный момент, когда системные ресурсы не являются критическими, используйте более эффективную настройку JVM, например, используя алгоритмы параллельного GC.

"Вручную" сбор мусора, устанавливая вещи на null, вероятно, замедляет работу, хотя бы потому, что вы платите стоимость обнуления ссылок бессмысленно или, вызывая GC больше времени, чем это необходимо.

Ответ 3

Вы можете вызвать System.gc();, который может привести к сборщику мусора для очистки. Но обязательно это повлияет на производительность вашего приложения. В общем, нет смысла пытаться "оптимизировать" что-либо здесь.

Ответ 4

Это не стоит делать это вручную, так как сборщик мусора обычно делает лучшую работу, и сделать это самостоятельно вряд ли будет иметь заметную разницу в вашем приложении.

Если вам нужно, вы можете установить ссылки на переменные равными null и вызвать System.gc(), и это вызовет сборщик мусора вручную.

Ответ 5

Вы можете присвоить значение null переменным, проверить, нет ли каких-либо ссылок на эти объекты и вызывать System.gc(), но это всего лишь предложение JVM вызвать GC, но нет гарантии. Сбор мусора замедляет ваше приложение до момента замораживания (GC-Stop-the-world).

Ответ 6

Очень распространенное предположение - использовать System.gc() который, который JVM может игнорировать. Вы также можете использовать область обзора, например:

import java.io.*;
public class AutoVariableTest
{
    public static void main(String[] args) throws Exception
    {
        String fileName = "test.txt";
        {// This is local block just to keep auto variable in check
            File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection
            BufferedReader br = null;

            try{
                br = new BufferedReader(new FileReader(file));
                // ...
            }finally{
                if(br != null)
                    br.close();
            }
        }// local block end
    }
}

Ответ 7

Java не подходит, если вы пытаетесь управлять памятью! Или вы пишете свой собственный механизм сбора мусора в JVM, если у вас есть много времени

Ответ 8

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