To prove how this memory leak comes to life, we need to go deeper. Deep to the JobIntentService class implementation.

Every JobIntentService is started using enqueueWork method, which needs object of Context type as a first parameter:

Part of JobIntentService source code (enqueueWork) method

Later, next enqueueWork method is called:

Part of JobIntentService source code (enqueueWork 2) method

As we can see, later internally getWorkEnqueuer method is called with implementation:

This method base on Android version creates JobWorkEnqeuer class, or CompatWorkEnqueuer class.

Very important fact to notice:

single (specific for every service type) JobIntentService.WorkEnqueuer is created only once (because later it is stored in sClassWorkEnqueuer map).

And this map is static field of JobIntentService class

To be clear, there are only put and get methods used to interact with this map in whole JobIntentService source code (no remove, clear etc.). So once any WorkEnqueuer is added to this map it stays there forever.