Do that a lot. Watch RAM vanish. GC cleans up the objects out of
object
space just fine, but RAM trickles away nonetheless.
Here is a test program:
loop do
attrs = Hash[‘this’,‘that’,‘the other’,‘enough’,‘stuff’,‘for six’]
Hash[attrs]
end
I have tested it on an installation of RedHat Enterprise Linux with
1.8.1,
1.8.2, 1.8.4, and 1.8.5 and also under 1.8.4 (one click installer) on
WinXP Home.
I’ve ran it under valgrind and just straight, and have inserted code to
run GC after each loop iteration. The behavior is consistent. If you
eliminate the Hash[attrs] line, there is no leak.
I’ve ran it under valgrind and just straight, and have inserted code to
run GC after each loop iteration. The behavior is consistent. If you
eliminate the Hash[attrs] line, there is no leak.
Kirk H.
Wow…that seems to be a pretty major leak to have made it this long
w/o being noticed. Maybe that type of behavior isn’t repeated often
enough in most programs to expose the leak?
Wow…that seems to be a pretty major leak to have made it this long
w/o being noticed. Maybe that type of behavior isn’t repeated often
enough in most programs to expose the leak?
It’s a small enough leak that it takes a lot of iterations to start to
add
up. And while the threshold of pain involved in chasing that thing down
wasn’t horrible, it’s high enough that I can understand people doing
what
I have done for a long time:
Oh, that process is getting a bit big. killrestart
Or they assume that it’s a bug in their code somewhere and do the same
thing.
Look at the discussion about Mutex leaking last week.
BTW, my test code makes use of a number of mutexes and heavy use of
threading, and after running 120k hits through it, the RAM usage is rock
solid at 13.8Mb. Normally after that many hits it would have grown to
around 45mb. So, this is very pleasing to me.
+static VALUE hash_alloc0 _((VALUE));
static VALUE hash_alloc _((VALUE));
static VALUE
-hash_alloc(klass)
+hash_alloc0(klass)
VALUE klass;
{
@@ -233,9 +234,19 @@ hash_alloc(klass)
hash->ifnone = Qnil;
hash->tbl = st_init_table(&objhash);
return (VALUE)hash;
}
+static VALUE
+hash_alloc(klass)
VALUE klass;
+{
VALUE hash = hash_alloc0(klass);
RHASH(hash)->tbl = st_init_table(&objhash);
return hash;
+}
VALUE
rb_hash_new()
@@ -326,7 +337,5 @@ rb_hash_s_create(argc, argv, klass)