Gestion de la mémoire en Perl (garbage collector)

Le
Nathan
Bonjour,

J'ai une question concernant la gestion de la mémoire par perl (garbage
collector).

Soit le code suivant:

my %hash = ();
{ # Accolade pour limiter la portée des variables
my @lambda = ();
{ # Accolade pour limiter la portée des variables
my $var1 = 1;
my $var2 = 2;
$lambda[0] = $var1;
$lambda[1] = $var2;
}
$hash{"lambda"} = @lambda;
}
%hash = undef;


La ligne "%hash = undef" permet-elle de vraiment libérer toute la mémoire?
C'est à dire, les références vers la variable @lambda et les variables
$var1 et $var2 sont-elle libérées ou faut-il le faire manuellement ?

$ref_tab = $hash{"lambda"};
$ref_tab->[0] = undef;
$ref_tab->[1] = undef;
$hash{"lambda"} = undef;
%hash = undef;

Merci

Nathan
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #155639
À (at) Wed, 19 Dec 2007 16:55:56 +0100,
Nathan
Bonjour,

J'ai une question concernant la gestion de la mémoire par perl (garbage
collector).

Soit le code suivant:

my %hash = ();
{ # Accolade pour limiter la portée des variables
my @lambda = ();
{ # Accolade pour limiter la portée des variables
my $var1 = 1;
my $var2 = 2;
$lambda[0] = $var1;
$lambda[1] = $var2;
}
$hash{"lambda"} = @lambda;
}


Pour obtenir le même résultat, on peut écrire plus simplement :

my %hash (
lambda => [1, 2],
);


%hash = undef;


Qu'on peut écrire :

undef %hash;

La ligne "%hash = undef" permet-elle de vraiment libérer toute la mémoire?
C'est à dire, les références vers la variable @lambda et les variables
$var1 et $var2 sont-elle libérées ou faut-il le faire manuellement ?


Ce n'est pas vraiment $var1, $var2 et @lambda qui sont référencés mais
bien leurs valeurs.

En fait toutes les valeurs tiennent un décompte des références qui
pointent vers elles. Dès que ce décompte tombe à zéro, la valeur est
libérée (c'est un ramasse-miettes assez basiques mais très efficace et
simple à mettre en oeuvre). Dans le cas présent, ça marche : tous les
décomptes tombent à zéro.

Le défaut de cet algorithme apparaît lorsqu'il y a des références
circulaires. Dans ce cas, il faut casser les cycles soi-même avant de
pouvoir tout libérer. Sinon on se retrouve avec un ensemble de valeurs
qui se référencent elle-mêmes (circulairement) sans qu'on puisse y
accèder depuis notre programme puisque plus aucune variable ne
conserve de références vers ces valeurs. On peut voir cela comme une
fuite mémoire...

--
Paul Gaborit - Perl en français -
Paul Gaborit
Le #155638
À (at) Wed, 19 Dec 2007 17:49:50 +0100,
Paul Gaborit
À (at) Wed, 19 Dec 2007 16:55:56 +0100,
Nathan
Bonjour,

J'ai une question concernant la gestion de la mémoire par perl (garbage
collector).

Soit le code suivant:

my %hash = ();
{ # Accolade pour limiter la portée des variables
my @lambda = ();
{ # Accolade pour limiter la portée des variables
my $var1 = 1;
my $var2 = 2;
$lambda[0] = $var1;
$lambda[1] = $var2;
}
$hash{"lambda"} = @lambda;
}


Pour obtenir le même résultat, on peut écrire plus simplement :

my %hash > (
lambda => [1, 2],
);


Désolé, j'ai oublié un niveau :

my %hash (
lambda => [1, 2],
);

Mais ça ne change rien pour le reste... ;-)

--
Paul Gaborit - Perl en français -

Nathan
Le #155543
Re bonjour,

Exactement la réponse qu'il me fallait.
Merci beaucoup pour ta réponse rapide, complète et efficace.

Nathan

À (at) Wed, 19 Dec 2007 17:49:50 +0100,
Paul Gaborit
À (at) Wed, 19 Dec 2007 16:55:56 +0100,
Nathan
Bonjour,

J'ai une question concernant la gestion de la mémoire par perl (garbage
collector).

Soit le code suivant:

my %hash = ();
{ # Accolade pour limiter la portée des variables
my @lambda = ();
{ # Accolade pour limiter la portée des variables
my $var1 = 1;
my $var2 = 2;
$lambda[0] = $var1;
$lambda[1] = $var2;
}
$hash{"lambda"} = @lambda;
}
Pour obtenir le même résultat, on peut écrire plus simplement :


my %hash >> (
lambda => [1, 2],
);


Désolé, j'ai oublié un niveau :

my %hash > (
lambda => [1, 2],
);

Mais ça ne change rien pour le reste... ;-)





Publicité
Poster une réponse
Anonyme