2013-02-27 6 views
3

UPDATE 3/27/2013Как очистить память в WT?

Казалось бы, что я не утечка памяти, это просто WT не держать постоянный сеанс каждый раз, когда F5 ударил, или новый пользователь подключается. В основном старый сеанс удаляется, а новый создается каждый раз, когда F5 попадает, или новый пользователь подключается с другого компьютера. Я прочитал некоторые части документации, в которых упоминается, что сеанс является постоянным, поэтому, когда пользователь перезагружает страницу или другой пользователь подключается, все они видят один и тот же контент. Тем не менее, я еще не смог заставить его работать. Я думаю, что это вызов функции или параметр в файле wt_config.xml. Будет обновлен, если я сделаю какой-либо другой прогресс.

ОРИГИНАЛЬНЫЙ ПОСТ

Так что мой вопрос, как я могу очистить память WT поэтому каждый раз, когда пользователь нажимает клавишу F5 на странице использование памяти остается неизменным в диспетчере задач?

Хорошо, поэтому я работаю с WT произносится (остроумно), и я заметил, что мое серверное приложение потребляет больше памяти каждый раз, когда пользователь нажимает F5 на странице, чтобы обновить его, что для меня похоже, что я утечка памяти, но я следил за тем же процессом, что и большинство основных приложений WT ...

Итак, я вернулся к самому основному приложению WT, которое мог найти, приложение приветствия, код которого и рабочий пример можно найти здесь (http://www.webtoolkit.eu/wt/examples/), если вы лично не создали проект.

Как только я запустил пример на своей машине и нажал F5 на странице, память в моем диспетчере задач увеличилась.

Возможно, моя подозреваемая эта функция ниже.

WApplication *createApplication(const WEnvironment& env) 
{ 
    /* 
    * You could read information from the environment to decide whether 
    * the user has permission to start a new application 
    */ 
    return new HelloApplication(env); 
} 

Она вызывается каждый раз, когда F5 ударил и делает новый экземпляр HelloApplication который наследуется от WApplication.

Некоторые вещи, которые я пытался исправить, которые не работали, включают в себя: Сохранение 2 указателей для HelloApplication, чтобы я мог удалять старый указатель каждый раз, когда он был выделен. Вызов функции quit() и удаление указателя. Просто вызывая функцию quit(). Я также просмотрел сайт документации WT (http://www.webtoolkit.eu/wt/doc/reference/html/index.html) для получения более подробной информации о классе и его методах, но не придумал ничего, что сработало.

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

+0

Я столкнулся с проблемой памяти, когда я получил и дикого типа работает сам http://stackoverflow.com/questions/15193585/virtual-memory-exhausted-cannot-allocate-memory – 2013-03-04 03:39:41

+0

сделал обновление, это а не утечка памяти. – user2115945

ответ

0

В руководстве WApplication указано, что вы создаете его, когда вызывается callback createApplication, и что Wt удаляет его при вызове quit и когда сеанс заканчивается. Тайм-аут сеанса по умолчанию составляет 10 минут (wt_config.xml), так что это может быть причиной того, что потребление памяти растет первоначально при нажатии F5.

http://www.webtoolkit.eu/wt/doc/reference/html/classWt_1_1WApplication.html#details

Что-то другое, что объясняет, что вы видите: потребление памяти сообщаемое операционной системы не является надежным методом для определения, если приложение утечки памяти since free does not really return the memory to the OS. Используйте надлежащие инструменты проверки памяти, такие как valgrind.

+0

Ну, вы помогли мне заметить, что это не утечка памяти. Также сделал обновление. – user2115945

1

Вы также должны знать о том, что с Wt 3.3.0 сеансы очищаются только до тех пор, пока принимаются запросы (см. this reply разработчика Wt). Чтобы преодолеть это ограничение, разработчик предлагает использовать что-то похожее на следующий код.

static bool terminating = false; 

void 
callRepeatedly(boost::function<void()> function, int seconds) 
{ 
    if (!terminating) { 
     Wt::WServer::instance()->ioService().schedule(
      seconds * 1000, boost::bind(callRepeatedly, function, seconds)); 
    } 
    function(); 
} 

int 
main(int argc, char** argv) 
{ 
    ... 

    callRepeatedly(boost::bind(&Wt::WServer::expireSessions, &server), 60); 
    Wt::WServer::waitForShutdown(); 
    terminating = true; 
    server.stop(); 

    ... 
} 
+0

Интересно, мне придется попробовать! Когда я получу что-то, я опубликую обновление. – user2115945

 Смежные вопросы

  • Нет связанных вопросов^_^