Bug #8092
closed[patch] gc: improve accuracy of objspace_live_num() and allocated/freed counters
Description
Test with large rails app:
ruby -e'
require "./config/environment"
stat, count = {}, {}
GC.start
GC.stat(stat)
ObjectSpace.count_objects(count)
printf "%d == %d\n", stat[:heap_live_num], count[:TOTAL]-count[:FREE]
'
Without patch:
632974 == 628506
With patch:
628506 == 628506
diff --git a/gc.c b/gc.c
index bd95073..48f9470 100644
--- a/gc.c
+++ b/gc.c
@@ -1432,10 +1432,8 @@ finalize_list(rb_objspace_t *objspace, RVALUE p)
run_final(objspace, (VALUE)p);
if (!FL_TEST(p, FL_SINGLETON)) { / not freeing page */
add_slot_local_freelist(objspace, p);
-
if (!is_lazy_sweeping(objspace)) {
-
objspace->total_freed_object_num++;
-
objspace->heap.free_num++;
-
}
-
objspace->total_freed_object_num++;
-
}objspace->heap.free_num++;
else {
struct heaps_slot *slot = (struct heaps_slot *)(VALUE)RDATA(p)->dmark;
@@ -1939,9 +1937,9 @@ slot_sweep(rb_objspace_t *objspace, struct heaps_slot *sweep_slot)
else {
sweep_slot->free_next = NULL;
}
- objspace->total_freed_object_num += freed_num;
objspace->heap.free_num += freed_num + empty_num;
}
-
objspace->total_freed_object_num += freed_num;
objspace->heap.final_num += final_num;if (deferred_final_list && !finalizing) {
@@ -2965,11 +2963,11 @@ rb_gc_force_recycle(VALUE p)
rb_objspace_t *objspace = &rb_objspace;
struct heaps_slot *slot; -
objspace->total_freed_object_num++;
if (MARKED_IN_BITMAP(GET_HEAP_BITMAP(p), p)) {
add_slot_local_freelist(objspace, (RVALUE *)p);
}
else {
- objspace->total_freed_object_num++;
objspace->heap.free_num++;
slot = add_slot_local_freelist(objspace, (RVALUE *)p);
if (slot->free_next == NULL) {