diff --git a/packages/vaex-core/vaex/dataframe.py b/packages/vaex-core/vaex/dataframe.py
index <HASH>..<HASH> 100644
--- a/packages/vaex-core/vaex/dataframe.py
+++ b/packages/vaex-core/vaex/dataframe.py
@@ -311,7 +311,6 @@ class DataFrame(object):
 
     def execute(self):
         '''Execute all delayed jobs.'''
-        # no need to clear _task_aggs anymore, since they will be removed for the executors' task list
         from .asyncio import just_run
         just_run(self.execute_async())
 
diff --git a/packages/vaex-core/vaex/execution.py b/packages/vaex-core/vaex/execution.py
index <HASH>..<HASH> 100644
--- a/packages/vaex-core/vaex/execution.py
+++ b/packages/vaex-core/vaex/execution.py
@@ -66,6 +66,10 @@ class Executor:
                 logger.info("executing tasks in run: %r", tasks)
                 for task in tasks:
                     self.tasks.remove(task)
+                    # make sure we remove it from task_aggs, otherwise we can memleak
+                    for key, value in list(task.df._task_aggs.items()):
+                        if value is task:
+                            del task.df._task_aggs[key]
                 return tasks
fix: memleak because of references to old tasks