2013-02-27 96 views
3

UPDATE 2013年3月27日如何清理WT中的內存?

這樣看來,我不泄漏內存,它只是WT不保持持續性會話每次F5被擊中,或新的用戶連接。基本上,舊會話被刪除,並且每當F5被擊中或新用戶從另一臺機器連接時,新會話被創建。我已經閱讀了文檔中提到會話持久性的一些部分,因此當用戶重新加載頁面或不同的用戶連接時,他們都會看到相同的內容。但是,我還沒有能夠得到它的工作。我認爲這是一個函數調用或wt_config.xml文件中的設置。如果我有其他進展,我會更新。

原帖

所以我的問題是,我該如何讓用戶按F5頁面上的內存使用停留在任務管理器一樣,每次清理內存在WT?

好的,所以我正在使用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

我遇到了一個內存不足的問題一旦我wt的啓動和運行自己http://stackoverflow.com/questions/15193585/virtual-memory-exhausted-cannot-allocate-memory – 2013-03-04 03:39:41

+0

做了更新,它是不是內存泄漏。 – user2115945 2013-03-27 13:24:30

回答

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。

+0

好吧,你幫我注意到這不是內存泄漏。也做了更新。 – user2115945 2013-04-05 11:52:08

1

你也必須意識到這個事實,即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(); 

    ... 
} 
+0

有趣的是,我必須嘗試一下!當我找到工作時,我會發布更新。 – user2115945 2013-08-27 17:51:24