perlのプログラムを走らせていて、長時間走らせれば走らせるほど、そのプログラムのメモリサイズが増大していってしまうことがあります。
そのプログラムが何かしらのでデータをメモリ上にキャッシュしていくモデルならばそれは、当然のことなのですが、プログラムが巨大化すればするほど、いったいどのオブジェクトがメモリを食っているのか発見するのに困難になります。
そんなときは、Devel::Sizeが便利です。このモジュールは任意の配列や、ハッシュ、クラスオブジェクトに対して使用しているメモリサイズを計算することができます。
以下のようにインスタンスオブジェクトに対してtotal_size()を使うとそのオブジェクトのメモリサイズがわかります。異常にメモリを食ってしまうバグなどを生んでしまった時などに便利です!
#!/usr/bin/perl use strict; use warnings; use Devel::Size qw/size total_size/; use constant TEST_NUM => 100; package Class1; sub new { my $class = shift; my %hash; my $self = { hash => \%hash }; return bless $self, $class; } sub add_key { my $self = shift; my $key = shift; $self->{hash}->{$key}++; } sub get_key_num { my $self = shift; my $key_num = keys %{$self->{hash}}; return $key_num; } package main; my $cl1 = Class1->new(); for(my $i = 0; $i < TEST_NUM; $i++) { my $rand = rand(10000); $cl1->add_key($rand); my $key_num = $cl1->get_key_num(); my $mem_siz = total_size($cl1); print "key_num:$key_num\tmem_siz:$mem_siz [$i]\n"; }