A memory leak in a long-running Symfony messenger process

A Symfony Messenger worker daemon processing imported spreadsheets slowly grew from 64MB to 1.2GB of RAM over six hours before being terminated by the Linux OOM killer.

// In the message handler:
public function __invoke(ProcessRowMessage $msg): void
{
    $entity = $this->repository->find($msg->id);
    $entity->markProcessed();
    $this->entityManager->flush();

    // Critical: Doctrine identity map retains every managed entity indefinitely!
    $this->entityManager->clear();
}

Doctrine’s unit-of-work identity map tracks every entity retrieved in memory until explicitly cleared. In long-running worker processes, failing to call EntityManager::clear() after each job guarantees a progressive memory leak.