Сброс мусора
Добавлено: 12.09.2016 00:07:18
Описываю ситуацию:
Разрабатываю программу, которая умеет загружать большие высокоструктурированные файлы. Т.е. при их загрузки происходит интенсивная работа с динамической памятью, часть которой после загрузки высвобождается. Загрузка происходит в потоке. Кол-во одновременно работающих потоков программа автоматически приравнивает к кол-ву процессоров. В моем случае параллельно работают до двух потоков. При загрузке тестового набора файлов программа занимает в ОЗУ гигабайт, а должна около 400 мегабайт. При закрытии файлов в программе память не освобождается ни грамма. Но если открыть заново какой-либо файл, то весь этот гиг освобождается, программа снова начинает занимать стартовые 30МБ+размер файла. И так можно проделывать много раз без накопления не освобождаемой памяти ОЗУ. Если же программу принудительно заставить запускать по одному потоку, то при загрузке этих же файлов программа занимает в ОЗУ те самые 400МБ, а при их закрытии память освобождается сразу же.
Складывается впечатление, что менеджер памяти работает с дин. памятью абсолютно по-разному в зависимости от того один или несколько потоков работают в данный момент. Если работают несколько потоков, то менеджер не то, чтобы освобождал ненужную память, он её даже не пытается повторно использовать, выделяя все новые и новые блоки. Сброс этого кучи мусора происходит, когда запускается очередной поток в одиночку (все предыдущие уже закончили свою работу).
Вопросы:
1) Может ли кто-нибуть подтвердить что менеджер именно так и работает? Или это у меня все таки косяк.
2) Пытался вызвать искусственно сброс этой кучи мусора в менеджере, создавая поток и выделяя и освобождая в нем большой кусок памяти. Не срабатывает. Может кто-нибуть знает что должно вызывать этот сброс?
ПС спрашиваю на всякий случай, может кто в курсе, на помощь не очень рассчитываю.
Разрабатываю программу, которая умеет загружать большие высокоструктурированные файлы. Т.е. при их загрузки происходит интенсивная работа с динамической памятью, часть которой после загрузки высвобождается. Загрузка происходит в потоке. Кол-во одновременно работающих потоков программа автоматически приравнивает к кол-ву процессоров. В моем случае параллельно работают до двух потоков. При загрузке тестового набора файлов программа занимает в ОЗУ гигабайт, а должна около 400 мегабайт. При закрытии файлов в программе память не освобождается ни грамма. Но если открыть заново какой-либо файл, то весь этот гиг освобождается, программа снова начинает занимать стартовые 30МБ+размер файла. И так можно проделывать много раз без накопления не освобождаемой памяти ОЗУ. Если же программу принудительно заставить запускать по одному потоку, то при загрузке этих же файлов программа занимает в ОЗУ те самые 400МБ, а при их закрытии память освобождается сразу же.
Складывается впечатление, что менеджер памяти работает с дин. памятью абсолютно по-разному в зависимости от того один или несколько потоков работают в данный момент. Если работают несколько потоков, то менеджер не то, чтобы освобождал ненужную память, он её даже не пытается повторно использовать, выделяя все новые и новые блоки. Сброс этого кучи мусора происходит, когда запускается очередной поток в одиночку (все предыдущие уже закончили свою работу).
Вопросы:
1) Может ли кто-нибуть подтвердить что менеджер именно так и работает? Или это у меня все таки косяк.
2) Пытался вызвать искусственно сброс этой кучи мусора в менеджере, создавая поток и выделяя и освобождая в нем большой кусок памяти. Не срабатывает. Может кто-нибуть знает что должно вызывать этот сброс?
ПС спрашиваю на всякий случай, может кто в курсе, на помощь не очень рассчитываю.