Without knowing what else you did to tune the whole system, I can only make some observations...
It's possible to run low on memory before using up cpu... (min/max heap)
You may not have enough acceptor threads and/or request-processing threads...
Your application may have an internal bottleneck in its own threads...
The network io may be a bottleneck.
Disk io may be maxed out on the back-end or front-end...
Probably more I can't think of at the moment...
[Message sent by forum member 'russpet' (russpet)]
http://forums.java.net/jive/thread.jspa?messageID=317174