Bonjour, j'ai des problèmes de fuites mémoires.
J'affiche une table (avec le plugin DataTables) dans ma page HTML suivant une balise select (Select2) qui possède l'évenement change().
Lorsque je sélectionne une valeur dans ma liste déroulante, j'ai remarqué, via le task manager, que l'utilisation de mémoire augmentait et après un certain nombre de sélection, j'arrive à saturation mémoire (avec IE).
Mon code fonctionne bien, il m'affiche bien les données, le soucis vient de la gestion de la mémoire.
Voici mon code Html, j'ai 2 tables, la deuxième (table_statistic_10_ligne) s'affiche lorsque je clique sur une ligne de mon premier tableau (table_statistic_10), il affiche les détails de cette ligne:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 <body> <select id="Select2" name="D1" style="margin-right :50px"> </select> <script> $("#Select2").change(function () { selectStat10(Select2.options[Select2.selectedIndex].value) }); </script> <table id="table_statistic_10" class="display"> <caption class="caption">Detail van verkopen</caption> <thead> </thead> <tbody> </tbody> </table> <br /> <br /> <table id="table_statistic_10_ligne" class="display"> <thead> </thead> <tbody> </tbody> </table> <script type="text/javascript"> fillSlectTagStat10(); </script> </body>
Voici mon code javascript, dans success, je récupère les valeurs (extraites d'un web service en C #) et je les remplis dans la dataTables :
Voici le code qui remplit la dataTables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 function getStatistic10(dstart, dend, nam) { var response; var allstat10 = []; if (typeof myTabLigne10 != 'undefined') { myTabLigne10.fnClearTable(); } $.ajax({ type: 'GET', url: 'http://localhost:52251/Service1.asmx/Statistic_10_Entete', data: { "start": JSON.stringify(dstart), "end": JSON.stringify(dend), "name": JSON.stringify(nam) }, contentType: 'application/json; charset=utf-8', dataType: 'json', success: function (msg) { response = msg.d; for (var i = 0; i < response.Items.length; i++) { var j = 0; allstat10[i] = [response.Items[i].Nom, response.Items[i].Date, response.Items[i].Piece, response.Items[i].Tiers, number_format(response.Items[i].AmoutHT, 2, ',', ' '), number_format(response.Items[i].AmountTTC, 2, ',', ' '), response.Items[i].Quantite]; } if (typeof myTabEntete10 != 'undefined') { myTabEntete10.fnClearTable(); } fillDataTableEntete10(allstat10, dstart, dend); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("error loading statistic 10"); alert("Status: " + textStatus + "\n" + "Error: " + errorThrown); } }); }
Dans ma liste déroulante, j'ai une valeur qui, une fois sélectionnée, me retourne environ 20 000 lignes. C'est grâce à cette valeur que j'ai remarqué les fuites mémoires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 function fillDataTableEntete10(data, dstart, dend) { if ($("#table_statistic_10").css("visibility") == "hidden") $("#table_statistic_10").css("visibility", "visible"); myTabEntete10 = $('#table_statistic_10').dataTable({ 'aaData': data, 'aoColumns': [ { "sTitle": "Nom" }, { "sTitle": "Date" }, { "sTitle": "Piece" }, { "sTitle": "Tiers" }, { "sTitle": "AmoutHT" }, { "sTitle": "AmountTTC" }, { "sTitle": "Quantite" } ], "sPaginationType": "full_numbers", "iDisplayLength": 10, "bJQueryUI": true, "bDestroy": true, "bPaginate": true, "bLengthChange": false, "bFilter": true, "bSort": false, "bInfo": false, "bAutoWidth": false, "sDom": '<"top"f<"clear">>rt<"bottom"ilp<"clear">>' });
Je ne comprends pas, je pensais qu'il existait un Garbage Collector qui libérait automatiquement la mémoire.
Comment puis-je remédier à cela? Je suis perdu...
Merci.
Partager