Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Charoplet
16 / 16 / 4
Регистрация: 08.05.2013
Сообщений: 37
#1

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

05.09.2013, 11:34. Просмотров 1463. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 11:34
Ответы с готовыми решениями:

List, потоки. Съедает память
Всем привет. Написал приложение. Спасибо всем тут, кто помогал советами. Мое...

Почему удаляются ссылки из List
Обьясню ситуацию. Создаю List&lt;String&gt; 1.добавил в него елементов 2.Создал...

Почему не удаляется элемент List?
Кода слишком много, поэтому не знаю, есть ли смысл его вставлять сюда. Но суть...

Почему не работает массив List<>
Скажите пожалуйста что я делаю не так? public partial class Form1 : Form ...

Почему не выделяется память?
Привет! Экспериментирую с потреблением памяти: static void test() {...

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

kolorotur, получается, нет способа в определенный момент выполнения программы полностью очистить память, которую занимал List?
0
Diman777
360 / 332 / 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
Spectral-Owl
567 / 547 / 151
Регистрация: 29.06.2010
Сообщений: 1,574
Завершенные тесты: 1
05.09.2013, 12:35 #6
а если вызвать GC.Collect() вне метода Test() то он и список удалит...
1
Diman777
360 / 332 / 108
Регистрация: 12.02.2013
Сообщений: 653
05.09.2013, 12:39 #7
Spectral-Owl, кстати, да, тоже так пробовал, но память почему то все равно также до 16 мб сокращается
0
Masia_March
63 / 63 / 12
Регистрация: 09.08.2011
Сообщений: 116
Записей в блоге: 1
05.09.2013, 12:41 #8
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
А у меня такой вопрос: Как посмотреть, сколько программа занимает места в памяти?
Никогда этим не заморачивался, но теперь интересно стало...
программа Proccess Explorer или Proccess Monitor
1
Charoplet
16 / 16 / 4
Регистрация: 08.05.2013
Сообщений: 37
05.09.2013, 13:04  [ТС] #9
Diman777, такой же эффект даст просто присваивание листу Null
Spectral-Owl, да, тоже работает, память около 16 МВ
хорошо, спасибо всем!
0
05.09.2013, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 13:04

Первый элемент List<> почему-то не на своем месте
В общем дело обстоит так: объявлен и инциализован массив списка List&lt;int&gt; ...

Почему NamedPipeServerStream пожирает память
Всем привет. Между процессами гоняю данные, но в случае аварийного отключения...

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и...


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

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

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