0
votes

Fuite de mémoire dans JS

J'ai un fichier JavaScript avec le contenu ci-dessous.

"use strict";
$(function () {
var divs = $(".sc-frames");
var next = 0;
var currentIndex = 0;

var request = function (action, controller, div) {
    var url = "../" + controller + "/" + action;

    $.ajax({
        type: "GET",
        url: url,
        dataType: "html",
        async: false,
        timeout:10000,
        success: function (result) {

            writeResponse(result, div);
        },
        error: function () {
            $("#errorMessage").show();
        }
    });
};

var writeResponse = function (result, div) {
    $(div).hide().html(result).slideDown("slow"); 
    currentIndex = divs.index($(div));
    if (parseInt(divs.length - 1) == parseInt(currentIndex)) {
        next = 0;
    } else {
        next++;
    }
};

var createRequest = function () {
    $("#errorMessage").hide();
    $(divs[currentIndex]).empty(); 
    var div = divs[next]; 
    var action = $(div).attr("data-action");
    var controller = $(div).attr("data-controller");
    request(action, controller, div);
};

setInterval(createRequest, 30000);
createRequest(); 

});


0 commentaires

3 Réponses :


-1
votes

Vous devez utiliser ClearInterval (CreekeQuest);

Lorsque vous n'avez plus besoin du code en cours d'exécution.


0 commentaires

-1
votes

Vous pouvez déterminer quand cela ne se produit pas en supprimant de petites pièces de fonctionnalité (ou des lignes simples) - alors vous savez ce qui le cause. Cependant, je ne trouve pas l'endroit où vous arrêtez la boucle? Peut-être que cela envoie la demande toutes les 30 secondes et ne s'arrête jamais?


2 commentaires

Cela fonctionne continuellement sur un écran afin de ne jamais m'arrêter. Existe-t-il un moyen de dégager la mémoire dans le code peut-être chaque minuit?


Bien sûr, rafraîchissez la page. Pourquoi voudriez-vous faire cela? Vous pouvez utiliser des webockets ou d'autres technologies pour pousser des choses à vos clients.



0
votes

La taille du tas JS augmente lentement.

Ce n'est pas (nécessairement) une fuite de mémoire. Il arrive alors que la plupart des moteurs utilisent la collection d'ordures d'arrêt-la mondiale, ce qui signifie que les variables resteront en mémoire bien qu'elles puissent être déjà collectées, alors à un moment donné, le GC commence, arrête l'exécution actuelle de JS, vérifie toutes les références. et libère la mémoire qui n'est plus référencée, puis continue l'exécution (elle est faite comme celle-ci que JS est très dynamique, vous ne pouvez pas que Tel Weher une variable qui laisse la portée est complètement déréférencée, si vous cochez toutes les variables à la fois que vous savez. à coup sûr).

Cependant, cela rend la collecte des ordures une opération coûteuse de performance. Par conséquent, le GC tente de frapper le plus rarement possible, ce qui signifie que cela ne donne que de nouveau dans, si la mémoire est nécessaire (comme elle est pleine).

Par conséquent, vous n'avez pas nécessairement une fuite de mémoire (et je ne vois pas un dans le code). Observez le tas sur une période plus longue et attendez quelques cycles GC ou manuellement (ressemble à une scie alors), puis vérifiez que le graphique global augmente. Si c'est le cas, vous avez une fuite de mémoire, car il existe des éléments qui survivent à la collection de Garbagge, ils fuient.

Y a-t-il un moyen de savoir où est exactement la fuite de la mémoire?

Utiliser la plupart des debuggers Vous pouvez créer un "instantané" de l'état de mémoire du courant. Prenez deux d'entre eux, un avant et après la collecte des ordures, puis les comparez à découvrir ce qui est venu exactement, il est généralement possible de retrouver cela au code qui le fuit.


5 commentaires

Vous avez raison, il frappe dans le GC car le graphique diminue un peu. Mais le graphique global est en augmentation. Il y a un moyen de le nettoyer via JavaScript?


@liroforum Combien coûte-t-il? À quelle fréquence le GC a-t-il été lancé? Avez-vous forcé le GC?


J'ai ajouté l'écran tiré dans la section Description. J'ai forcé GC manuellement qui est montré dans les 3 dernières trempettes. Mais le graphique global augmente.


@Liroforum Vous mesurez sur une très courte durée. Que se passe-t-il si vous créez le graphique pendant une heure ou plus?


résultat similaire.