...everytime...it will call ExecutorService.newFixedThreadPool(3)
...
That is not how thread pools are meant to be used!!
@MarkRotteveel almost answered your question in a comment above. Here's the rest:
Thread pools exist because creating and destroying threads is relatively expensive as compared to the cost of some of the tasks that you might want a thread to do. The purpose of a thread pool is to allow the program to re-use threads instead of continually creating new ones and then destroying them.* Instead of letting each "worker thread" die after it finishes its task, the thread pool keeps the workers alive, and waiting for you to submit more tasks.
Mark Rotteveel guessed—and it sounds like a good guess to me—that your program doesn't shut down the thread pools that it creates. So, every time it creates a new thread pool, it's also creating three new worker threads that will continue to live, taking up space, but doing nothing, until the program ends.
If that's true, then the fix is easy.
Create the thread pool just one time, and then periodically submit new tasks to the same pool object again and again.
* FYI, the same is true for any other kind of X pool that you might encounter in the future. Its purpose will be to let your program re-use objects of type X instead of continually creating and destroying them.