Является ли вызов System.gc () хорошим способом управления памятью в приложении Java? - PullRequest
5 голосов
/ 23 августа 2010

У меня есть Java-приложение, которое хочет вызвать system.gc ().Это разумный способ освободить память?или любой другой совет?Действительно ценю!

Ответы [ 8 ]

12 голосов
/ 23 августа 2010

Просто прекратите ссылаться на переменную. Вам не нужно вызывать System#gc() самостоятельно. Если JVM находится на грани OutOfMemoryError, она будет , безусловно, будет запускать GC.

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

5 голосов
/ 23 августа 2010

В Java нет необходимости явно вызывать сборку мусора. Это делается автоматически виртуальной машиной.

4 голосов
/ 23 августа 2010

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

Одним из самых больших преимуществ платформы Java является успешный автоматический сбор мусора.Используйте это.

3 голосов
/ 23 августа 2010

Только при очень специфических обстоятельствах и после тщательного профилирования было бы неплохо явно вызвать gc().Это никогда не должно иметь функционального значения, но оно может иметь воспринимаемое повышение производительности при очень определенных сценариях.

Например, скажем, вы делали видеоигру с Java и каждые несколько минут приходитена разрыв между уровнями.Это может оказаться хорошим местом для явного вызова сборщика мусора, если он уменьшает вероятность того, что цикл GC произойдет, пока играет на следующем уровне (что может помешать игровому процессу).

Короче говоря, он должен быть зарезервирован для случаев, когда вы знаете лучше, чем время выполнения, когда GC наиболее желателен, и, опять же, его следует использовать только после тщательного профилирования, оправдывающего его включение.

1 голос
/ 23 августа 2010

System.gc () запустит полную коллекцию, что особенно плохо, если вы беспокоитесь о времени паузы и используете параллельные или коллекторы G1.

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

1 голос
/ 23 августа 2010

книга Head First Java говорит, что каждая переменная (экземпляр или локальные переменные) имеет область видимости, когда область видимости теряется, тогда переменная больше не существует, когда речь идет об объектах, она говорит, что объект является гибким для сборщика мусора.когда исчезнет его последнее живое упоминание.

0 голосов
/ 23 августа 2010

Мягкие и слабые ссылки - это отличный способ хранить данные, которые вы хотели бы иметь в памяти, но можете обойтись без них, если память переполнена.

Нормальные ссылки сильны, то есть объект недоработать или собрать мусор, пока кто-то твердо на него ссылается.Если вы удерживаете SoftReference для объекта, объект, скорее всего, останется в памяти до ситуации OutOfMemory, когда он будет автоматически очищен.Слабая ссылка, вероятно, будет очищена в любое время, но она все еще может быть полезна в тех случаях, когда удержание объекта экономит некоторые дисковые издержки.

Благодаря этим характеристикам ссылки отлично подходят для кэширования данных, не беспокоясь о необходимости сбрасывать данныеесли память начинает заполняться.

Самый простой способ создать ссылку - это:

Reference<MyClass> r = new SoftReference<MyClass>(new MyClass())

Теперь вы передаете ссылку вокруг.Когда вы хотите получить объект, вы вызываете Reference.get ()

MyClass myClass = r.get();
if (myClass != null) {
  // do something
}
else {
  // Oh dear class isn't there, go to plan b
}
0 голосов
/ 23 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...