APIdock / Ruby
/
method

count_objects

ruby latest stable - Class: ObjectSpace
count_objects(p1 = v1)
public

Counts all objects grouped by type.

It returns a hash, such as:

{
 :TOTAL=>10000,
 :FREE=>3011,
 :T_OBJECT=>6,
 :T_CLASS=>404,
 # ...
}

The contents of the returned hash are implementation specific. It may be changed in future.

The keys starting with :T_ means live objects. For example, :T_ARRAY is the number of arrays. :FREE means object slots which is not used now. :TOTAL means sum of above.

If the optional argument result_hash is given, it is overwritten and returned. This is intended to avoid probe effect.

h = {}
ObjectSpace .count_objects (h)
puts h
# => { :TOTAL=>10000, :T_CLASS=>158280, :T_MODULE=>20672, :T_STRING=>527249 }

This method is only expected to work on C Ruby.

static VALUE
count_objects(int argc, VALUE *argv, VALUE os)
{
 rb_objspace_t *objspace = &rb_objspace;
 size_t counts[T_MASK+1];
 size_t freed = 0;
 size_t total = 0;
 size_t i;
 VALUE hash;
 if (rb_scan_args(argc, argv, "01", &hash) == 1) {
 if (!RB_TYPE_P(hash, T_HASH))
 rb_raise(rb_eTypeError, "non-hash given");
 }
 for (i = 0; i <= T_MASK; i++) {
 counts[i] = 0;
 }
 for (i = 0; i < heap_allocated_pages; i++) {
 struct heap_page *page = heap_pages_sorted[i];
 RVALUE *p, *pend;
 p = page->start; pend = p + page->total_slots;
 for (;p < pend; p++) {
 if (p->as.basic.flags) {
 counts[BUILTIN_TYPE(p)]++;
 }
 else {
 freed++;
 }
 }
 total += page->total_slots;
 }
 if (hash == Qnil) {
 hash = rb_hash_new();
 }
 else if (!RHASH_EMPTY_P(hash)) {
 st_foreach(RHASH_TBL_RAW(hash), set_zero, hash);
 }
 rb_hash_aset(hash, ID2SYM(rb_intern("TOTAL")), SIZET2NUM(total));
 rb_hash_aset(hash, ID2SYM(rb_intern("FREE")), SIZET2NUM(freed));
 for (i = 0; i <= T_MASK; i++) {
 VALUE type;
 switch (i) {
#define COUNT_TYPE(t) case (t): type = ID2SYM(rb_intern(#t)); break;
 COUNT_TYPE(T_NONE);
 COUNT_TYPE(T_OBJECT);
 COUNT_TYPE(T_CLASS);
 COUNT_TYPE(T_MODULE);
 COUNT_TYPE(T_FLOAT);
 COUNT_TYPE(T_STRING);
 COUNT_TYPE(T_REGEXP);
 COUNT_TYPE(T_ARRAY);
 COUNT_TYPE(T_HASH);
 COUNT_TYPE(T_STRUCT);
 COUNT_TYPE(T_BIGNUM);
 COUNT_TYPE(T_FILE);
 COUNT_TYPE(T_DATA);
 COUNT_TYPE(T_MATCH);
 COUNT_TYPE(T_COMPLEX);
 COUNT_TYPE(T_RATIONAL);
 COUNT_TYPE(T_NIL);
 COUNT_TYPE(T_TRUE);
 COUNT_TYPE(T_FALSE);
 COUNT_TYPE(T_SYMBOL);
 COUNT_TYPE(T_FIXNUM);
 COUNT_TYPE(T_IMEMO);
 COUNT_TYPE(T_UNDEF);
 COUNT_TYPE(T_ICLASS);
 COUNT_TYPE(T_ZOMBIE);
#undef COUNT_TYPE
 default: type = INT2NUM(i); break;
 }
 if (counts[i])
 rb_hash_aset(hash, type, SIZET2NUM(counts[i]));
 }
 return hash;
}

AltStyle によって変換されたページ (->オリジナル) /