diff --git a/src/task.c b/src/task.c index 1de0f192..4a20af47 100644 --- a/src/task.c +++ b/src/task.c @@ -169,6 +169,9 @@ typedef struct _tf_task_t timeout_t* timeouts; hitch_t hitches[32]; + + uint64_t last_gc_ns; + int64_t last_gc_duration_ns; } tf_task_t; typedef struct _export_record_t @@ -1456,12 +1459,19 @@ static void _tf_task_promise_rejection_tracker(JSContext* context, JSValueConst static void _tf_task_gc_timer(uv_timer_t* timer) { tf_task_t* task = timer->data; - tf_trace_begin(task->_trace, "JS_RunGC"); - JS_RunGC(task->_runtime); - tf_trace_end(task->_trace); + uint64_t start_ns = uv_hrtime(); + if (task->last_gc_duration_ns < (int64_t)(start_ns - task->last_gc_ns)) + { + tf_trace_begin(task->_trace, "JS_RunGC"); + JS_RunGC(task->_runtime); + tf_trace_end(task->_trace); #ifdef M_TRIM_THRESHOLD - malloc_trim(0); + malloc_trim(0); #endif + uint64_t end_ns = uv_hrtime(); + task->last_gc_duration_ns = end_ns - start_ns; + task->last_gc_ns = end_ns; + } } static void _tf_task_trace_timer(uv_timer_t* timer)