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...