Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Виртуальная память

368  
romanovi4 постоялец13.04.10 20:54
romanovi4
13.04.10 20:54 
Привет всем!
Сейчас пишу VoIP server, на C/C++, где создаётся для каждого звонка пару threads. Всё это на Windows. Сам работаю на Windows XP - когда запускаю программу, то виртуальная память очень быстро растёт и не освобождается. Объектов я создаю немного и пытаюсь их удалять. Если я создаю обьект на heap, будет ли для этого тоже виртуальная память выделятся? На ХР ситуация совсем плохая - пару тысяч звонков - и виртуальная память вырастает до 500 МВ, на Server 2003 получше, но тоже потихоньку растёт.
Где можно про выделение и освобождение виртуальной памяти почитать? Либо на пальцах здесь обьясните.
Спасибо
#1 
Murr_0003 гость13.04.10 21:11
NEW 13.04.10 21:11 
в ответ romanovi4 13.04.10 20:54
виртуальная память очень быстро растёт
------
Почему тебя волнует виртуальная память? Скажи системе, что ее у тебя 200 Гиг и забудь... Правда для тестирования своего кода стоит сделать с точностью до наоборот - отключить всю виртуальную память - пусть извращается в оперативке.
и пытаюсь их удалять.
-----
Что значит пытаюсь? сalloc/free & new/delete в пределах одной и той же функции решают проблемы с памятью на раз.
Либо на пальцах здесь обьясните.
------
Чисто биллины фичи - когда считает, что что-то можно/нужно выгрузить - выгружает. Процесс - практически неуправляемый. Вариант - добавить оперативки и запретить виртуалку.
#2 
romanovi4 постоялец13.04.10 22:11
romanovi4
NEW 13.04.10 22:11 
в ответ Murr_0003 13.04.10 21:11
спасибо, просто когда виртулаьная память переваливает за 1 гиг, то программа начинает сильно тормозить. у меня на машине только 2 GB.
Delete и free делаю конечно, куда же без них. Забтра попробую отключить виртуальную память - в принципе потом это всё будет работать на сильных машинах - там будет памяти навалом :)
#3 
AlterEgo Чеширръ13.04.10 23:22
AlterEgo
NEW 13.04.10 23:22 
в ответ Murr_0003 13.04.10 21:11
В ответ на:
Скажи системе, что ее у тебя 200 Гиг и забудь...

32 битному виндоуз ? :) как ей сказать..? :)
*Ъ...
#4 
AlterEgo Чеширръ13.04.10 23:34
AlterEgo
NEW 13.04.10 23:34 
в ответ romanovi4 13.04.10 20:54, Последний раз изменено 13.04.10 23:36 (AlterEgo)
У тебя где то утечка - объекты создаются и не удаляются. Причем судя по скорости - очень большая. Возможно потоки как то неправильно завершаются а только останавливаются. (так ли это можно увидеть в TaskManager- Показыват число потоков)
Судя по тому что растет именно виртуальная память а не реальная это не фрагментация кучи а самая настоящая утечка. Стандартный приему поиска-интструментализовать код (есть программы и библиотеки для этого), так что бы фиксировались New /Delete а потом смотреть какого типа объекты болтаются в памяти. В идеале даже с указанием места в программе где они создаются и даже стеком.
Для особого долгоживущих программ рекомендуются "smart pointer" и Pooling (объекты не уничтожаются, а помещаются в пул). Ну или продвинутые Heap мэнеджеры а ля Апач, которые позволяют махом удалить все объекты ассоциированные с тредом после его завершения.
Upd:
http://msdn.microsoft.com/en-us/library/x98tx3cf%28VS.80%29.aspx
*Ъ...
#5 
Murr_0003 посетитель13.04.10 23:42
NEW 13.04.10 23:42 
в ответ AlterEgo 13.04.10 23:22
как ей сказать..? :)
------
Позвонить билли? :)
#6 
KwtH знакомое лицо27.04.10 14:50
KwtH
NEW 27.04.10 14:50 
в ответ romanovi4 13.04.10 20:54
В ответ на:
Объектов я создаю немного и пытаюсь их удалять

Это говорит о том что объекты создаешь не "автоматические" (ну про аналогии с автоматическими переменными)
Это в принципе нормально, т.к. все автоматические объекты хранятся на стеке, а там места маловато тебе будет.
Но создай поростенький класс и запакуй туда указатель на базаовый класс для твоих обьектов которые создаешь.
Создавай объект этого класса автоматически, но собсвенно объект - предмет работы твоей ситемы, естествеено созается в heap и указалетль автоматического объекта на него будет указывать (это сделай через конструктор).
Когда автоматический объект исчезнет, то естесьна выполнится его деструктор, где ты прилежненько применишь оператор delete для внутреннего указателя))))
Естествеено надо будет продумать структуру системы со всеми scope так, чтб эти автоматические объекты исчезали тогда когда надо.
Этот подход позволяет эффективно удалять созданные в heap обьекты без необходимости все время помнтить когда же надо примеять delete в ручную, в этом случае даже попыток удалять не надо будет тебе производить)))
#7 
Simple Nothing is f*cked27.04.10 14:59
Simple
NEW 27.04.10 14:59 
в ответ KwtH 27.04.10 14:50
Мог бы просто написать: RAII :)
#8 
KwtH знакомое лицо27.04.10 15:19
KwtH
NEW 27.04.10 15:19 
в ответ Simple 27.04.10 14:59
а хдеш ты, ронинький, раньше был?))) взял бы и написал))) а то я так старался, а ты так поздно слишком подоспел))))
#9 
Simple Nothing is f*cked27.04.10 15:22
Simple
NEW 27.04.10 15:22 
в ответ KwtH 27.04.10 15:19
Хорошая мысля приходит опосля :-D
#10 
KwtH знакомое лицо27.04.10 15:25
KwtH
NEW 27.04.10 15:25 
в ответ Simple 27.04.10 15:22
заметь, мне первому в голову пришла) хотя я этого не делал уже лет эдак 8)))) но все равно интересно)
#11