While doing the profiling the following can be found easily which further help to identify the bottleneck.
1) Memory leaking objects:
These are the application objects relying on the memory without getting Garbage collected due the bug in the product. These objects will be consuming memory over the period of the program run and starts utilizing all the Heap memory. At certain point of time there will not be enough memory for the objects created newly, and Web server will go down.
These objects can be traced during the process of profiling.
Due to bug in product / bad architecture design, more number of unwanted threads can be created, and may not be killed over the time. These threads also one of the major causes of performance issues. These threads can be controlled in the application by Thread profiling.
And unnecessary threads can be found during the process of profiling.
3) Out of Memory Issues:
Out of memory issues can be found due to #1,#2 already mentioned. This can be Outofmemory from Heap Space, Outofmemory from PermGen space.
To get rid of Outofmemory from Heap Space, #1,#2 should be identified and rectified.,
For resolving Outofmemory from PermGen space, PermGen space in the JAVA_OPTS should be increased,. Still if you get the issue, then Non-heap memory should be analyzed well.