2013-02-27 3 views
3

MISE À JOUR 3/27/2013Comment nettoyer la mémoire dans WT?

Il semblerait que je ne suis pas une fuite de mémoire, il est juste WT ne pas tenir une session persistante à chaque fois F5 est touché, ou un nouvel utilisateur se connecte. Fondamentalement, l'ancienne session est supprimée, et une nouvelle est faite à chaque fois que F5 est touché, ou un nouvel utilisateur se connecte à partir d'une autre machine. J'ai lu certaines parties de la documentation qui mentionnent la persistance de la session, donc lorsqu'un utilisateur recharge la page, ou qu'un autre utilisateur se connecte, ils voient tous le même contenu. Cependant, je n'ai pas encore réussi à le faire fonctionner. Je pense que c'est un appel de fonction ou un paramètre dans le fichier wt_config.xml. Mettra à jour si je fais d'autres progrès.

ORIGINAL POST

Donc ma question est, comment puis-je nettoyer la mémoire dans le document WT donc chaque fois que l'utilisateur appuie sur F5 sur la page de l'utilisation de la mémoire reste le même dans le gestionnaire de tâches? Ok, donc je travaille avec WT prononcé (spirituel) et j'ai remarqué que mon application serveur consomme plus de mémoire chaque fois que l'utilisateur tape F5 sur la page pour le rafraîchir, ce qui me semble être une fuite de mémoire, Mais j'ai suivi le même processus que les applications les plus basiques de WT ...

Donc, je suis retourné à l'application WT la plus basique que j'ai pu trouver, l'application Bonjour le code pour lequel, et l'exemple de travail, peut être trouvé ici (http://www.webtoolkit.eu/wt/examples/) si vous n'avez pas personnellement construit le projet.

Une fois que j'ai exécuté l'exemple sur mon ordinateur et que j'ai appuyé sur F5 sur la page, la mémoire dans mon gestionnaire de tâches a augmenté.

Mon suspect probable est cette fonction ci-dessous.

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); 
} 

Il est appelé à chaque fois F5 est touché et fait une nouvelle instance de la HelloApplication qui hérite de WApplication. Certaines choses que j'ai essayé de remédier à la situation qui n'ont pas fonctionné comprennent: Garder 2 pointeurs pour le HelloApplication afin que je puisse supprimer l'ancien pointeur chaque fois qu'un nouveau est alloué. Appel de la fonction quit() et suppression du pointeur. Appelez simplement la fonction quit(). J'ai également regardé sur le site de documentation de WT (http://www.webtoolkit.eu/wt/doc/reference/html/index.html) pour plus d'informations sur la classe et ses méthodes, mais je n'ai rien trouvé qui fonctionne.

Je demande à tous ceux qui répondent d'être aussi détaillés que possible sur la façon de gérer le nettoyage de la mémoire. Un exemple serait très apprécié, merci d'avance!

+0

je suis tombé sur un problème de mémoire une fois que je suis en poids et moi-même en cours d'exécution http://stackoverflow.com/questions/15193585/virtual-memory-exhausted-cannot-allocate-memory –

+0

a fait une mise à jour, il est pas une fuite de mémoire. – user2115945

Répondre

0

Le manuel de WApplication indique que vous le créez lorsque le rappel createApplication est appelé et que Wt le supprime lorsque quit est appelé, et lorsque la session expire. Le délai d'attente de session par défaut est de 10 minutes (wt_config.xml), ce qui explique peut-être pourquoi votre consommation de mémoire augmente au début en appuyant sur F5.

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

Quelque chose de différent qui explique ce que vous voyez: la consommation de mémoire rapportée par le système d'exploitation n'est pas une méthode fiable pour déterminer si une application des fuites de mémoire since free does not really return the memory to the OS. Utilisez des outils de vérification de la mémoire appropriés, tels que valgrind.

+0

Eh bien, vous m'avez aidé à remarquer que ce n'est pas une fuite de mémoire. Aussi fait une mise à jour. – user2115945

1

Vous devez également être conscient du fait que Wt 3.3.0 les sessions ne sont nettoyées que tant que les demandes sont reçues (voir this reply d'un développeur Wt). Pour surmonter cette limitation, le développeur suggère d'utiliser quelque chose de similaire au code suivant.

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

Intéressant, je vais devoir essayer! Je posterai une mise à jour quand je serai en train de travailler. – user2115945

Questions connexes