またも役に立ってしまい、やはり最初からついているべきだという
思いを新たにしたので GC.stress を提案します。

どうでしょう?

Index: gc.c
===================================================================
RCS file: /src/ruby/gc.c,v
retrieving revision 1.227
diff -u -p -r1.227 gc.c
--- gc.c	30 Dec 2005 09:15:14 -0000	1.227
+++ gc.c	9 Jan 2006 16:16:40 -0000
@@ -88,11 +88,40 @@ rb_memerror(void)
     rb_exc_raise(nomem_error);
 }
 
-#ifdef RUBY_GC_DEBUG
-int always_gc = 0;
-#else
-# define always_gc 0
-#endif
+int gc_stress = 0;
+
+/*
+ *  call-seq:
+ *    GC.stress                 => true or false
+ *
+ *  returns current status of GC stress mode.
+ */
+
+static VALUE
+gc_stress_get(VALUE self)
+{
+    return gc_stress ? Qtrue : Qfalse;
+}
+
+/*
+ *  call-seq:
+ *    GC.stress = bool          => bool
+ *
+ *  updates GC stress mode.
+ *
+ *  When GC.stress = true, GC is invoked for all GC opportunity:
+ *  all memory and object allocation.
+ *
+ *  Since it makes Ruby very slow, it is only for debugging.
+ */
+
+static VALUE
+gc_stress_set(VALUE self, VALUE bool)
+{
+    rb_secure(2);
+    gc_stress = RTEST(bool);
+    return bool;
+}
 
 void *
 ruby_xmalloc(size_t size)
@@ -105,7 +134,7 @@ ruby_xmalloc(size_t size)
     if (size == 0) size = 1;
     malloc_increase += size;
 
-    if (always_gc || malloc_increase > malloc_limit) {
+    if (gc_stress || malloc_increase > malloc_limit) {
 	garbage_collect();
     }
     RUBY_CRITICAL(mem = malloc(size));
@@ -153,7 +182,7 @@ ruby_xrealloc(void *ptr, size_t size)
     if (!ptr) return ruby_xmalloc(size);
     if (size == 0) size = 1;
     malloc_increase += size;
-    if (always_gc) garbage_collect();
+    if (gc_stress) garbage_collect();
     RUBY_CRITICAL(mem = realloc(ptr, size));
     if (!mem) {
 	if (garbage_collect()) {
@@ -383,7 +412,7 @@ rb_newobj(void)
 {
     VALUE obj;
 
-    if ((always_gc || !freelist) && !garbage_collect())
+    if ((gc_stress || !freelist) && !garbage_collect())
 	rb_memerror();
 
     obj = (VALUE)freelist;
@@ -1915,6 +1944,8 @@ Init_GC(void)
     rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0);
     rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
     rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
+    rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
+    rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
     rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
 
     rb_mObSpace = rb_define_module("ObjectSpace");
Index: main.c
===================================================================
RCS file: /src/ruby/main.c,v
retrieving revision 1.17
diff -u -p -r1.17 main.c
--- main.c	27 Dec 2005 05:40:04 -0000	1.17
+++ main.c	9 Jan 2006 16:16:40 -0000
@@ -25,9 +25,9 @@ static void objcdummyfunction( void ) { 
 int
 main(int argc, char **argv, char **envp)
 {
-#ifdef RUBY_GC_DEBUG
-    RUBY_EXTERN int always_gc;
-    always_gc = getenv("RUBY_ALWAYS_GC") != NULL;
+#ifdef RUBY_GC_STRESS
+    RUBY_EXTERN int gc_stress;
+    gc_stress = getenv("RUBY_GC_STRESS") != NULL;
 #endif
 #ifdef _WIN32
     NtInitialize(&argc, &argv);
Index: signal.c
===================================================================
RCS file: /src/ruby/signal.c,v
retrieving revision 1.71
diff -u -p -r1.71 signal.c
--- signal.c	12 Dec 2005 00:35:08 -0000	1.71
+++ signal.c	9 Jan 2006 16:16:40 -0000
@@ -944,12 +944,12 @@ Init_signal(void)
 #endif
 
 #ifdef SIGBUS
-# ifndef RUBY_GC_DEBUG
+# ifndef RUBY_GC_STRESS
     install_sighandler(SIGBUS, sigbus);
 # endif
 #endif
 #ifdef SIGSEGV
-# ifndef RUBY_GC_DEBUG
+# ifndef RUBY_GC_STRESS
     install_sighandler(SIGSEGV, sigsegv);
 # endif
 #endif
-- 
[田中 哲][たなか あきら][Tanaka Akira]