So what's happening is that one of your Tomcat JVMs is trying to exceed to 2048 MB heap that you allocated for it.
It just sounds like you're looking for a specific answer as much as a checklist of things to try, so here you go:
Running out of heap is either due to a memory leak, where you leak a little bit with each request, or in a load scenario it can be because you're just throwing more at the JVM than it can handle. You want to identify which of those is the problem, so start by looking at how you generate your load.
If the problem occurs only at a high level of parallel requests but never at a lower level, then you have a problem that the number of requests times the memory required to process each request is too big. You either need to make each request use less memory, or limit the concurrency somehow.
If the problem occurs after a certain number of requests have been processed regardless of the concurrency, then you have a memory leak. You need to find it and reclaim the memory.
In either scenario, you will be greatly aided by having a good heap memory analyzer. There are good commercial ones like YourKit Java Profiler, or free ones like Eclipse Memory Analyzer. Find a tool that works for you and learn how to use it to see what's taking up memory. Note that you don't necessarily need to use the tool to launch your program-- if you are running a load test on a server then you can use the jmap command-line tool from the JDK to capture a heap dump in a file, and then use your tool to analyze the dump file. The tool will show you what objects are taking up space in your heap.