Always have 7-10 thread dumps taken in an interval of 5 seconds each
A thread dump will give you an insight on what every thread in the JVM is currently doing.
While analyzing the thread dump you should be looking for stuck threads (threads which have not moved from a long time) – could be a resource (file / db) lock not allowing the thread to complete the task and free the monitor.
Look for thread lock (if two threads store references to different objects into the same reference value, the variable will subsequently contain a reference to one object or the other, not a reference to some other object or a corrupted reference value).
Look for recursive loops in application / server code traces, usually hampers server performance by utilizing CPU.