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.