виртуальная память
От: madprogrammer. Россия  
Дата: 21.08.08 16:19
Оценка:
Привет!

Есть прога на С++ под Linux (gcc). При работе она через некоторое время "съедает" всю виртуальную память (как я понял) — 3060 Мб, после чего
странным образом зависает. bad_alloc-ов ниоткуда не кидается, физической памяти, судя по top, она занимает всего 0.6%.

Как понять откуда растут ноги?

22.08.08 13:46: Перенесено модератором из 'C/C++' — Кодт
Re: виртуальная память
От: Аноним  
Дата: 21.08.08 16:23
Оценка:
M>Есть прога на С++ под Linux (gcc). При работе она через некоторое время "съедает" всю виртуальную память (как я понял) — 3060 Мб, после чего
M>странным образом зависает. bad_alloc-ов ниоткуда не кидается, физической памяти, судя по top, она занимает всего 0.6%.
M>Как понять откуда растут ноги?
Выделяет память и не пользуется ею. Ленивый VMM не юзает физическую память под страницы виртуальной к которым не было обращений.
Re: виртуальная память
От: vsb Казахстан  
Дата: 21.08.08 16:26
Оценка:
Здравствуйте, madprogrammer., Вы писали:


M>Привет!


M>Есть прога на С++ под Linux (gcc). При работе она через некоторое время "съедает" всю виртуальную память (как я понял) — 3060 Мб, после чего

M>странным образом зависает. bad_alloc-ов ниоткуда не кидается, физической памяти, судя по top, она занимает всего 0.6%.

M>Как понять откуда растут ноги?


malloc реально не выделяет память, она выделяется при попытке чтения/записи, поэтому ситуация с тремя гигабайтами виртуальной памяти и небольшим количеством реально используемой возможна.

Где она зависает — выясняйте отладчиком.
Re[2]: виртуальная память
От: madprogrammer. Россия  
Дата: 21.08.08 18:07
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, madprogrammer., Вы писали:



M>>Привет!


M>>Есть прога на С++ под Linux (gcc). При работе она через некоторое время "съедает" всю виртуальную память (как я понял) — 3060 Мб, после чего

M>>странным образом зависает. bad_alloc-ов ниоткуда не кидается, физической памяти, судя по top, она занимает всего 0.6%.

M>>Как понять откуда растут ноги?


vsb>malloc реально не выделяет память, она выделяется при попытке чтения/записи, поэтому ситуация с тремя гигабайтами виртуальной памяти и небольшим количеством реально используемой возможна.


vsb>Где она зависает — выясняйте отладчиком.


Выяснилось, что "утекающая" виртуальная память появляется каждый раз при создании нового потока с помощью pthread_create(). При этом утекает 8 Мб (предположительно, стек).
Поток в последствии успешно завершается, однако виртуальная память не высвобождается. Как лечить, не подскажете? Идея самостоятельного управления стеком потока рассматривается
в последнюю очередь
Re[3]: виртуальная память
От: madprogrammer. Россия  
Дата: 21.08.08 18:48
Оценка:
Здравствуйте, madprogrammer., Вы писали:

M>Здравствуйте, vsb, Вы писали:


vsb>>Здравствуйте, madprogrammer., Вы писали:



M>>>Привет!


M>>>Есть прога на С++ под Linux (gcc). При работе она через некоторое время "съедает" всю виртуальную память (как я понял) — 3060 Мб, после чего

M>>>странным образом зависает. bad_alloc-ов ниоткуда не кидается, физической памяти, судя по top, она занимает всего 0.6%.

M>>>Как понять откуда растут ноги?


vsb>>malloc реально не выделяет память, она выделяется при попытке чтения/записи, поэтому ситуация с тремя гигабайтами виртуальной памяти и небольшим количеством реально используемой возможна.


vsb>>Где она зависает — выясняйте отладчиком.


M>Выяснилось, что "утекающая" виртуальная память появляется каждый раз при создании нового потока с помощью pthread_create(). При этом утекает 8 Мб (предположительно, стек).

M>Поток в последствии успешно завершается, однако виртуальная память не высвобождается. Как лечить, не подскажете? Идея самостоятельного управления стеком потока рассматривается
M>в последнюю очередь

Проблема решилась. Нужно было явно создавать поток с флагом PTHREAD_CREATE_DETACHED (по-умолчанию создается с PTHREAD_CREATE_JOINABLE).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.