IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fuite mémoire


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 129
    Par défaut Fuite mémoire
    Bonjour,

    Le code ci dessous(que vous pouvez tester chez vous) remplit un tableau localement dans une fonction.
    A la sortie de la fonction, la mémoire occupée par le tableau n'est pas libérée.

    Quelqu'un aurait-il une explication ?

    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
    <?php
    function convert($size)
    {
        $unit=array('b','kb','mb','gb','tb','pb');
        return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
    }
     
    $start = memory_get_usage(true);
     
    function run($i)
    {
        $list = array();
        for ($j=0;$j<=$i;$j++) {
            $list[] = '<p>Lorem ipsum dolor sit amet consectetuer id at Nunc tempus justo. Tempor mi Phasellus massa semper pulvinar vitae et interdum ipsum massa. Dui morbi Curabitur a Nullam consectetuer Vestibulum orci consequat id lacus. Phasellus metus ac Sed hendrerit leo wisi pellentesque ipsum lacus auctor. Suspendisse eleifend wisi ut Donec In pede Vestibulum quis tellus orci. Phasellus In semper amet et tellus nibh nibh Vestibulum facilisi.</p>
            <p>Integer volutpat penatibus consequat Integer In mauris Maecenas leo netus sit. Fusce in Aliquam pellentesque congue elit lacus diam amet porttitor tempus. Nunc velit Mauris Vestibulum eget eu mauris ut elit Ut tincidunt. Vivamus tellus condimentum dui adipiscing Aliquam dui justo tempus vitae Proin. Pede dolor a risus Lorem metus condimentum elit at penatibus tellus. </p>
            <p>Vitae congue Duis at felis vitae Ut massa ipsum elit hendrerit. Eu at Sed mauris eu felis et ut hendrerit Curabitur Morbi. Et quis laoreet sagittis convallis Curabitur mauris dignissim vitae et nec. Egestas Aenean elit Curabitur egestas sed velit nibh Donec ligula mauris. Donec cursus cursus amet ante ac.</p>
            <p>Aenean Curabitur wisi Donec ligula Curabitur volutpat fringilla et pede mi. Vestibulum enim semper Sed interdum platea nibh eget montes elit Cras. Libero porttitor volutpat nascetur Aenean metus Sed Lorem vel gravida justo. Donec nunc id urna congue ipsum id justo interdum id convallis. Convallis non penatibus penatibus nunc et eu Donec at consequat Nulla. </p>';            
        }   
     
    }   
     
    run(10000);
     
    $end = memory_get_usage(true);
     
    echo "[START] memory : " . convert($start) . "<br />";
    echo "[END] memory : " . convert($end) . "<br />";
    echo "[DIFF] " . convert($end-$start) . "<br />";
    echo "[PEAK] " . convert(memory_get_peak_usage(true)) . "<br />";
    Pour ce cas ci, la mémoire fait un bond de 2.75Mo.
    Je précise que j'utilise PHP 5.3.5.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ton tableau fait 15Mo, il est donc bien liberé.

    Tu as par contre 1,75Mo en plus pour la déclaration de tes deux fonctions.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 129
    Par défaut
    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
    <?php
    function convert($size)
    {
        $unit=array('b','kb','mb','gb','tb','pb');
        return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
    }
     
    function run($i)
    {
        $list = array();
        for ($j=0;$j<=$i;$j++) {
            $list[] = '<p>Lorem ipsum dolor sit amet consectetuer id at Nunc tempus justo. Tempor mi Phasellus massa semper pulvinar vitae et interdum ipsum massa. Dui morbi Curabitur a Nullam consectetuer Vestibulum orci consequat id lacus. Phasellus metus ac Sed hendrerit leo wisi pellentesque ipsum lacus auctor. Suspendisse eleifend wisi ut Donec In pede Vestibulum quis tellus orci. Phasellus In semper amet et tellus nibh nibh Vestibulum facilisi.</p>
            <p>Integer volutpat penatibus consequat Integer In mauris Maecenas leo netus sit. Fusce in Aliquam pellentesque congue elit lacus diam amet porttitor tempus. Nunc velit Mauris Vestibulum eget eu mauris ut elit Ut tincidunt. Vivamus tellus condimentum dui adipiscing Aliquam dui justo tempus vitae Proin. Pede dolor a risus Lorem metus condimentum elit at penatibus tellus. </p>
            <p>Vitae congue Duis at felis vitae Ut massa ipsum elit hendrerit. Eu at Sed mauris eu felis et ut hendrerit Curabitur Morbi. Et quis laoreet sagittis convallis Curabitur mauris dignissim vitae et nec. Egestas Aenean elit Curabitur egestas sed velit nibh Donec ligula mauris. Donec cursus cursus amet ante ac.</p>
            <p>Aenean Curabitur wisi Donec ligula Curabitur volutpat fringilla et pede mi. Vestibulum enim semper Sed interdum platea nibh eget montes elit Cras. Libero porttitor volutpat nascetur Aenean metus Sed Lorem vel gravida justo. Donec nunc id urna congue ipsum id justo interdum id convallis. Convallis non penatibus penatibus nunc et eu Donec at consequat Nulla. </p>';            
        }    
    }
     
    $start = memory_get_usage(true);
     
    run(1);
     
    $end = memory_get_usage(true);
     
    echo "[START] memory : " . convert($start) . "<br />";
    echo "[END] memory : " . convert($end) . "<br />";
    echo "[DIFF] " . convert($end-$start) . "<br />";
    echo "[PEAK] " . convert(memory_get_peak_usage(true)) . "<br />";
    J'ai déplacé l'emplacement de $start après le parse des deux fonctions.

    La mémoire libérée dépend du nombre d'itérations et non de la déclaration des deux fonctions :

    Pour i = 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [START] memory : 512 kb
    [END] memory : 512 kb
    [DIFF] 0 b
    [PEAK] 512 kb
    Pour i = 1000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [START] memory : 512 kb
    [END] memory : 2 mb
    [DIFF] 1.5 mb
    [PEAK] 2 mb
    Pour i = 2000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [START] memory : 512 kb
    [END] memory : 3 mb
    [DIFF] 2.5 mb
    [PEAK] 3.5 mb

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Avec PHP5.3 j'obtiens les mêmes résultats que toi.

    Cependant, quelque soit le nombre d’itérations on ne dépasse pas 3Mo.
    Je pense que l'explication touche à ce qui est décrit ici :
    http://bugs.php.net/bug.php?id=33487
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 129
    Par défaut
    Effectivement cela se stabilise vers 3Mo à partir d'un certain seuil. Certainement grâce au garbage collector de php 5.3.

    Cependant, mon cas va plus loin. Mon tableau devient une liste d'objet. Avec le code ci dessous, la mémoire ne redescend plus.

    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
    function convert($size)
    {
        $unit=array('b','kb','mb','gb','tb','pb');
        return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
    }
     
    function run($i)
    {
        $list = array();
        for ($j=0;$j<=$i;$j++) {
        	$list[] = new stdClass();             
        }   
    }
     
    $start = memory_get_usage(true);
     
    run(1000000);
     
    $end = memory_get_usage(true);
     
    echo "[START] memory : " . convert($start) . "<br />";
    echo "[END] memory : " . convert($end) . "<br />";
    echo "[DIFF] " . convert($end-$start) . "<br />";
    echo "[PEAK] " . convert(memory_get_peak_usage(true)) . "<br />";
    Résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [START] memory : 512 kb
    [END] memory : 32.75 mb
    [DIFF] 32.25 mb
    [PEAK] 220 mb

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pour moi c'est la même chose et cela correspond toujours à ce que est décrit dans l'article.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo