更新2013年3月27日
似乎我没有泄漏内存,只是WT在每次F5被击中或新用户连接时都没有保持持久会话。基本上旧的会话被删除,每次F5被击中时都会生成一个新会话,或者新用户从另一台机器连接。我已经阅读了文档中提到使会话持久化的一些部分,因此当用户重新加载页面时,或者不同的用户连接时,他们都会看到相同的内容。但是,我还没能让它工作。我认为这是函数调用或wt_config.xml文件中的设置。如果我做出任何其他进展,将会更新。
原始发布
所以我的问题是,如何在WT中清理内存,以便每次用户按下页面上的F5时,内存使用在任务管理器中保持不变?
好的,所以我正在使用WT发声(诙谐),我注意到每次用户点击页面上的F5刷新它时,我的服务器应用程序会消耗更多内存,这对我来说看起来像是在泄漏内存,但是我遵循与WT最基本的应用程序相同的过程...
所以,我回到了我能找到的最基本的WT应用程序,如果你没有亲自构建项目,可以在这里找到hello应用程序的代码和工作示例(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时都会调用它,并生成一个继承自WApplication的HelloApplication的新实例。
我试图解决一些没有用的情况包括:为HelloApplication保留2个指针,这样我就可以在每次分配新指针时删除旧指针。调用quit()函数,并删除指针。只需调用quit()函数。我还浏览了WT文档站点(http://www.webtoolkit.eu/wt/doc/reference/html/index.html),了解有关该类及其方法的更多详细信息,但没有提出任何有效的方法。
我要求任何响应的人尽可能详细地说明如何处理内存的清理。一个例子将非常感谢,提前感谢!
答案 0 :(得分:1)
您还必须意识到,从Wt 3.3.0开始,只要收到请求,就会清理会话(请参阅Wt开发人员的this reply)。为克服此限制,开发人员建议使用类似于以下代码的内容。
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();
...
}
答案 1 :(得分:0)
WApplication手册说你在调用createApplication回调时创建它,并且在调用quit时以及会话超时时Wt删除它。默认会话超时为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。