Project

General

Profile

Actions

Bug #8092

closed

[patch] gc: improve accuracy of objspace_live_num() and allocated/freed counters

Added by tmm1 (Aman Karmani) almost 12 years ago. Updated almost 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.1.0dev (2013-03-14 trunk 39748) [x86_64-darwin12.2.1]
Backport:
[ruby-core:53392]

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) {

Related issues 1 (0 open1 closed)

Related to Backport200 - Backport #8147: Backport r39812Closednagachika (Tomoyuki Chikanaga)03/22/2013Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0