16 / 16 / 4
Регистрация: 08.05.2013
Сообщений: 37
1
.NET 4.x

Почему не очищается память после очистки List а?

05.09.2013, 11:34. Показов 3485. Ответов 8
Метки нет (Все метки)

Привет.
Есть такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        static void Main(string[] args)
        {
            Console.ReadKey();
            Test();
            Console.ReadKey();
        }
 
        static void Test()
        {
            var list = new List<string>();
            for(int i=0; i< 10000000;i++)
            {
                list.Add(i.ToString());
            }
            list.Clear();
        }
    }
Что происходит: запускаю программу, она ждет ввод символа. В данный момент программа занимает около 4 МВ памяти. Нажимаю энтер, запускается метод Test. Как видно, этот метод заполняет большой лист строк, затем его очищает. В ходе работы этого метода потребление памяти растет, и рост заканчивается около 350 МВ. Далее, программа снова ждет ввод символа...и, как я ожидал, объем занятой памяти должен был заметно снизиться, ведь метод Test завершил работу, и я очистил лист перед выходом из метода. Кроме того, я не вижу больше никаких ссылок на лист, и он должен был попасть в сборку мусора.
Однако, по-прежнему занято 350 МВ. памяти. Почему так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2013, 11:34
Ответы с готовыми решениями:

Почему программа занимает большой объем памяти после очистки таблицы StringGrid?
простейшая программа открытия csv-файлов.. сначала в диспетчере задач программа весит около 1...

Правильно ли очищается память?
сть программа которая работает с динамическим массивом. работает она так: int** a = new int*; ...

Правильно ли очищается память?
имеется структура typedef struct { LPCWSTR letter; } structura; объявляю из функции саму...

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

8
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,330
Записей в блоге: 3
05.09.2013, 11:47 2
для сборки мусора можно принудительно его вызвать:
C#
1
GC.Collect();
А у меня такой вопрос: Как посмотреть, сколько программа занимает места в памяти?
Никогда этим не заморачивался, но теперь интересно стало...
1
Эксперт .NET
15462 / 11722 / 3079
Регистрация: 17.09.2011
Сообщений: 19,610
05.09.2013, 12:05 3
Цитата Сообщение от Charoplet Посмотреть сообщение
Почему так?
Метод Clear всего лишь очищает массив, который используется для хранения данных в классе List. Сам массив при этом никуда не девается.
Можете использовать метод TrimExcess, чтобы сократить количество занимаемой, но не используемой списком памяти, однако освободится она все равно только после того, как отработает сборщик мусора (может быть).
1
16 / 16 / 4
Регистрация: 08.05.2013
Сообщений: 37
05.09.2013, 12:19  [ТС] 4
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
А у меня такой вопрос: Как посмотреть, сколько программа занимает места в памяти?
я смотрел просто по Диспетчеру задач Windows.
я добавил GC.Collect() после очистки листа... потребляемая память снизилась до 80 МВ. Уже лучше, но все равно многовато..

kolorotur, получается, нет способа в определенный момент выполнения программы полностью очистить память, которую занимал List?
0
366 / 338 / 108
Регистрация: 12.02.2013
Сообщений: 653
05.09.2013, 12:32 5
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
А у меня такой вопрос: Как посмотреть, сколько программа занимает места в памяти?
Никогда этим не заморачивался, но теперь интересно стало
Мне почему-то тоже стало интересно)
Запускаем прогу -> диспетчер задач -> во вкладке Приложения выбираем нашу запущенную прогу -> Правый щелчок и в контекстном меню выбрать перейти к процессу -> выйдет таблица с памятью
Кажется так

Добавлено через 11 минут
Цитата Сообщение от Charoplet Посмотреть сообщение
потребляемая память снизилась до 80 МВ.
Charoplet,
можно переменной list присвоить ссылку на другой новый массив и тогда старый массив полностью удалится
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        static void Main(string[] args)
        {
            Console.ReadKey();
            Test();
            Console.ReadKey();
        }
 
        static void Test()
        {
            var list = new List<string>();
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(i.ToString());
            }
            list.Clear();
            list = new List<string>();
            GC.Collect();
        }
память сокращается до 16 мб
1
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
05.09.2013, 12:35 6
а если вызвать GC.Collect() вне метода Test() то он и список удалит...
1
366 / 338 / 108
Регистрация: 12.02.2013
Сообщений: 653
05.09.2013, 12:39 7
Spectral-Owl, кстати, да, тоже так пробовал, но память почему то все равно также до 16 мб сокращается
0
69 / 69 / 12
Регистрация: 09.08.2011
Сообщений: 116
Записей в блоге: 1
05.09.2013, 12:41 8
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
А у меня такой вопрос: Как посмотреть, сколько программа занимает места в памяти?
Никогда этим не заморачивался, но теперь интересно стало...
программа Proccess Explorer или Proccess Monitor
1
16 / 16 / 4
Регистрация: 08.05.2013
Сообщений: 37
05.09.2013, 13:04  [ТС] 9
Diman777, такой же эффект даст просто присваивание листу Null
Spectral-Owl, да, тоже работает, память около 16 МВ
хорошо, спасибо всем!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2013, 13:04

Динамические массивы: очищается ли память?
Здравствуйте. Подскажите, пожалуйста, по поводу динамических массивов. Допустим, есть вот такой...

Беда с курсором. Видимо, не очищается память
Есть у меня такой курсор: set @prodName = (select Product_name from inserted) set @prodQuant =...

Cpp. Как очищается память в функциях?
Я привык, что чисткой памяти занимается GC. А тут надо написать библиотеку на Cpp. От сюда базовые...

Не очищается память при завершении потока
Добрый день уважаемые форумчане. Из главного потока создаю поток который работает в цикле while...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.