Gruja82 Ответов: 3

Заставить сборщик мусора вручную


Насколько я знаю, неизвестно, когда GC срабатывает, поэтому мой вопрос таков: разумно ли поместить элемент управления таймером в приложение и установить интервал, на котором GC будет срабатывать, чтобы освободить память?

Что я уже пробовал:

private void timer1_Tick(object sender, EventArgs e)
        {
            GC.Collect();
        }

3 Ответов

Рейтинг:
19

Thomas Daniels

Финализаторы - Руководство По Программированию На C# | Microsoft Docs[^] государственный:

Цитата:
Можно принудительно выполнить сборку мусора, вызвав команду Collect, но в большинстве случаев этого следует избегать, поскольку это может создать проблемы с производительностью.

Если только у вас нет хороший повод позвонить в ГК.Собирать[^], вам лучше просто позволить GC делать свою автоматическую работу.


Gruja82

Теперь я понимаю, но тогда, возможно, я смогу создать какой-то метод, который определяет объем выделенной памяти, а затем запускает GC.

Thomas Daniels

Но зачем тебе это делать?

Gruja82

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

Thomas Daniels

Что ж, если у вас есть веские основания полагать, что автоматический запуск GC недостаточен для вашего приложения, то вы можете это сделать. Но, как сказал Фил.О, это требует глубокого понимания ГК.

Richard MacCutchan

Если ваше приложение выделяет слишком много памяти (сколько это слишком много?), запуск GC ничего не улучшит.

Gruja82

Спасибо.

Рейтинг:
1

OriginalGriff

Цитата:
Теперь я понимаю, но тогда, возможно, я смогу создать какой-то метод, который определяет объем выделенной памяти, а затем запускает GC.

Не.
Как уже говорили другие, это пустая трата времени.

Ваша оценка "выделенной памяти" и ее необходимости в сборе мусора всегда будет значительно ниже, чем просто позволить системе сделать это, когда это действительно необходимо. Многие. многие приложения запускаются без включения GC: если вы чувствуете, что некоторые из ваших объектов нуждаются в "правильном удалении", то реализуйте IDisposable интерфейс для класса и либо утилизируйте их, когда это необходимо, либо создайте их в пределах класса. using блокируйте, чтобы система избавлялась от них автоматически.

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


Gruja82

Я просто хотел знать, можно ли оптимизировать приложение с помощью GC вручную. Я всегда склонен использовать IDisposable и, в конечном счете, деструкторы в своем коде. Спасибо за ответ.

OriginalGriff

Почти наверняка, вы бы деоптимизировали приложение, если бы попытались!

Рейтинг:
0

phil.o

Я бы не стал этого делать, так как это может резко снизить производительность вашего приложения, запустив GC, когда это не нужно. Или же у вас есть совершенно особый случай, который требует от вас этого; но тогда вы должны иметь полное представление об управлении памятью GC и .NET, и это должно быть широко обосновано и документировано. Преждевременная оптимизация ГК никогда не бывает хорошей идеей, имхо.

Но вы также можете попробовать и решить для себя :)