3

2013 年 3 月 27 日更新

看来我没有泄漏内存,只是每次按下 F5 或新用户连接时 WT 都没有保持持久会话。基本上,旧会话被删除,每次按 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)上查看了有关该类及其方法的更多详细信息,但还没有提出任何有效的东西。

我要求任何回复的人尽可能详细地说明如何处理内存清理。一个例子将不胜感激,在此先感谢!

4

2 回答 2

2

您还必须知道,从 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();

    ...
}
于 2013-08-22T13:30:58.153 回答
0

WApplication 的手册说您在调用 createApplication 回调时创建它,而 Wt 在调用 quit 时以及会话超时时将其删除。默认会话超时为 10 分钟 (wt_config.xml),因此这可能是您的内存消耗最初在按 F5 时增长的原因。

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

一些不同的东西可以解释您所看到的:操作系统报告的内存消耗不是确定应用程序是否泄漏内存的可靠方法,因为 free 并没有真正将内存返回给 OS。使用适当的内存检查工具,例如 valgrind。

于 2013-03-06T13:55:12.530 回答