如何清理 WT 中的内存?
Posted
技术标签:
【中文标题】如何清理 WT 中的内存?【英文标题】:How to clean up memory in WT? 【发布时间】:2013-02-27 15:38:21 【问题描述】:2013 年 3 月 27 日更新
看来我没有泄漏内存,只是每次按下 F5 或新用户连接时 WT 都没有保持持久会话。基本上,旧会话被删除,每次按 F5 或新用户从另一台机器连接时都会创建一个新会话。我已经阅读了文档的某些部分,其中提到了使会话持久化,因此当用户重新加载页面或不同的用户连接时,他们都会看到相同的内容。但是,我还不能让它工作。我认为这是 wt_config.xml 文件中的函数调用或设置。如果我有任何其他进展,会更新。
原帖
所以我的问题是,我如何清理 WT 中的内存,以便每次用户在页面上按 F5 时内存使用在任务管理器中保持不变?
好的,所以我正在使用 WT 发音(诙谐),我注意到每次用户在页面上按 F5 刷新它时,我的服务器应用程序都会消耗更多内存,这对我来说看起来像是在泄漏内存,但是我遵循与 WT 大多数基本应用程序相同的流程...
所以,我回到了我能找到的最基本的 WT 应用程序,如果您没有亲自构建项目,可以在此处找到代码和工作示例的 hello 应用程序。
在我的机器上运行示例并在页面上按 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) 上查看了有关该类及其方法的更多详细信息,但没有找到任何可行的方法。
我要求任何回复的人尽可能详细地说明如何处理内存清理。一个例子将不胜感激,在此先感谢!
【问题讨论】:
我在启动并运行自己 ***.com/questions/15193585/… 后遇到了内存问题 更新了,不是内存泄漏。 【参考方案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();
...
【讨论】:
有趣,我得试试这个!当我得到一些工作时,我会发布更新。【参考方案2】:WApplication 的手册说你在调用 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。
【讨论】:
嗯,你帮我注意到这不是内存泄漏。也做了更新。以上是关于如何清理 WT 中的内存?的主要内容,如果未能解决你的问题,请参考以下文章