Your formula is fairly accurate - given your system's memory you can support about 1000 threads. However, being able to physcially support that number of threads and having the system still run while juggling that number of threads are two different things. The only way to really tell how many threads your app can handle is through load testing. And while doing that you need to monitor system data, determine where the bottleneck is, then eliminate or reduce the bottleneck, and repeat until you get the performance you like. And there can be numerous reasons why your app starts to slow down at 500 threads: contention within the app, the app server or even the OS/hardware; too many heavy-duty requests; etc.