If you run into a situation where the processor utilization is high - the process for determining the cause isn't the easiest thing to find on your typical Google search. So here it is:
For the sake of brevity I'm just going to do Linux
1) Take a javacore. This is easy on a Unix-type system. Just find your process and run "kill -3 <PID>"
2) Collect some top data
# top -bH -d 5 > top.out
3) Find the threads that are using the most processor usage in the top output
12771 user 20 0 6028m 2.3g 59m R 19.6 7.4 48:33.59 java
11880 huser 20 0 6028m 2.3g 59m R 19.6 7.4 46:41.38 java
4) Open up calculate and convert the PID to a hexadecimal value
For example 12771 -> 31E3
5) Open up the javacore and find your thread via the native thread ID.
3XMTHREADINFO "WebContainer : 46" J9VMThread:0x00000000C4506C00, j9thread_t:0x00007FA9F66D2E10, java/lang/Thread:0x00000000091B2350, state:CW, prio=5
3XMTHREADINFO1 (native thread ID:0x31E3, native priority:0x5, native policy:UNKNOWN)
3XMTHREADINFO2 (native stack address range from:0x00007FA99EFE0000, to:0x00007FA99F021000, size:0x41000)
3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at java/awt/image/DataBufferInt.<init>(DataBufferInt.java:52(Compiled Code))
4XESTACKTRACE at java/awt/image/Raster.createPackedRaster(Raster.java:469(Compiled Code))
4XESTACKTRACE at java/awt/image/DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1026(Compiled Code))
4XESTACKTRACE at java/awt/image/BufferedImage.<init>(BufferedImage.java:323(Compiled Code))
You want to do this on different datasets so that you can confirm the pattern behavior is the same. So essentially just repeat the process
And that's it. Now that you have found the culprit, all you have to do is determine why that thread path is using up too much cpu.