First check GC logs. You must have "-verbose:gc" to get such output. If garbage collection is happening frequently and is running for long time, you most likely are dealing with low memory on this host. You process memory most likely is in swap and is taking long time. You can validate this by running "sar" command. Look at "%iowait" column, which would appear to be higher than normal. You can also run "free" command to see how much swap space is being utilized. Ideally, you want zero swap utilization for java processes.
Now if GC is not issue, you have a bad loop in code, either your code or vendor code. You can take thread dumps at regular interval to validate this. Generally "kill -3 pid" works to get thread dumps. But it may be different for you JDK. You can take 5 thread dumps at 10 seconds interval for example and then take few more after few minutes. Then you have to hunt for stacks that repeat in various dumps. Sometimes you may have infinite loop and it may appear in all the dumps, which would be easier to find. I have also seen HashMap methods run into infinite loop, if HashMap is used by multiple threads without any synchronization. There are some Thread dump analyzers for some JDK, which can also help.
There is definitely a chance that if your host is not big enough to handle work load , it will run very hot.