Move immutable fields from struct heaps_slot and struct sorted_heaps_slot into struct heaps_header.
One exception is limit field, but it starts to be mutable just before freeing a heaps_header, so that it is not big issue.
Embed bitmap into struct heaps_slot
Change free_unused_heaps to free_unused_heap, so that it will not be called on every GC round, but only when page should be freed.
While free_unused_heaps does not consume much time (it is invisible in profiler), but regular application has no need in calling this function every time.
I'm not sure that 3. improves a performance, because it's using binary search each one slot.
Well, free_unused_heaps runs on each GC and does linear scan, and free_unused_heap runs only on heap's freeing.
Heap freeing occurs rare in typical long running application, so that it is possibly that linear scan for each GC is overkill.
This issue was solved with changeset r37613.
Yura, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
gc.c: move immutable fields from struct heaps_slot and struct
sorted_heaps_slot into struct heaps_header.
Based on a patch from Sokolov Yura [Feature #6199][ruby-core:43592]