clear_decks(gen);
}
-bool data_heap::low_memory_p()
+bool data_heap::high_fragmentation_p()
{
return (tenured->largest_free_block() <= nursery->size + aging->size);
}
+bool data_heap::low_memory_p()
+{
+ return (tenured->free_space() <= nursery->size + aging->size);
+}
+
void data_heap::mark_all_cards()
{
memset(cards,-1,cards_end - cards);
void reset_generation(nursery_space *gen);
void reset_generation(aging_space *gen);
void reset_generation(tenured_space *gen);
+ bool high_fragmentation_p();
bool low_memory_p();
void mark_all_cards();
};
{
collect_mark_impl(trace_contexts_p);
collect_sweep_impl();
+
if(data->low_memory_p())
+ {
+ current_gc->op = collect_growing_heap_op;
+ current_gc->event->op = collect_growing_heap_op;
+ collect_growing_heap(0,trace_contexts_p);
+ }
+ else if(data->high_fragmentation_p())
{
current_gc->op = collect_compact_op;
current_gc->event->op = collect_compact_op;
collect_compact_impl(trace_contexts_p);
}
+
code->flush_icache();
}
break;
case collect_aging_op:
collect_aging();
- if(data->low_memory_p())
+ if(data->high_fragmentation_p())
{
current_gc->op = collect_full_op;
current_gc->event->op = collect_full_op;
break;
case collect_to_tenured_op:
collect_to_tenured();
- if(data->low_memory_p())
+ if(data->high_fragmentation_p())
{
current_gc->op = collect_full_op;
current_gc->event->op = collect_full_op;