Fonctions étendues

1. Garbage collector

Ruby utilise un garbage collector pour nettoyer les objets en mémoire qui ne sont plus utilisés (c’est-à-dire sans référence). Ce garbage collector peut être contrôlé grâce au module GC ou par la classe ObjectSpace. Cette classe a également la capacité de parcourir tous les objets en mémoire.

Exemple :

class Test
  def initialize( v )
    @val = v
  end
end

(1..5).each do
  |i|
  Test.new( i )
end

ObjectSpace.each_object() do
  |obj|  
  printf( "%s => %s\n", obj.class, obj.inspect )
end 

Nous avons bien en sortie nos objets, plus tous les autres objets que Ruby utilise pour fonctionner :

Test => #<Test:0x27b021c @val=5>
Test => #<Test:0x27b0230 @val=4>
Test => #<Test:0x27b0244 @val=3>
Test => #<Test:0x27b0258 @val=2>
Test => #<Test:0x27b026c @val=1>
String => "Test"
Class => Test
String => "end\n"

... 

Nous pouvons passer en argument de la méthode each_object une classe ou un module pour filtrer uniquement certains objets.

Si nous voulons forcer l’appel du garbage collector nous utiliserons les méthodes GC.start ou ObjectSpace.garbage_collect.

Exemple :

(1..5).each do
  |i|
  Test.new( i )
end

cpt = 0

ObjectSpace.each_object(Test) do
  |obj|
  cpt += 1   
end

puts "#{cpt} objets en memoire"

ObjectSpace.garbage_collect

cpt = 0

ObjectSpace.each_object(Test) do
  |obj|
  cpt += 1   
end

puts "#{cpt} objets en memoire" 

Avec les traces suivantes...

Pour consulter la suite, découvrez le livre suivant :
couv_Ruby.PNG
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Exceptions
Suivant
Exercices