ОБНОВЛЕНИЕ 27.03.2013
Может показаться, что я не теряю память, это просто 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) для получения более подробной информации о классе и его методах, но не придумали ничего, что сработало.
Я прошу всех, кто отвечает, пожалуйста, быть как можно более подробным в том, как справиться с очисткой памяти. Пример будет высоко ценится, спасибо заранее!
В руководстве по WApplication говорится, что вы создаете его при вызове обратного вызова createApplication и что Wt удаляет его при вызове quit и по истечении времени сеанса. Время ожидания сеанса по умолчанию составляет 10 минут (wt_config.xml), поэтому это может быть причиной того, что потребление памяти изначально увеличивается при нажатии клавиши F5.
http://www.webtoolkit.eu/wt/doc/reference/html/classWt_1_1WApplication.html#details
Нечто иное, объясняющее то, что вы видите: потребление памяти, сообщаемое операционной системой, не является надежным методом определения утечки памяти приложением так как на самом деле бесплатно не вернуть память в ОС. Используйте правильные инструменты проверки памяти, такие как valgrind.
Вы также должны знать о том, что с Wt 3.3.0 сеансы очищаются только при получении запросов (см. этот ответ 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();
...
}