CPU usage

Not that it’ll definitely help, but have you tried stepping through your render method in a debugger?
Sometimes seeing each line of code run can help you see how everything is flowing a what may or may not be unnecessary.

Don’t forget that HotSpot will typically inline everything into everything, so that self-time can be the CPU cycles spent in the (inlined) methods it calls.

VisualVM has both sampling and instrumenting profilers; the instrumenting profiler should not be affected by inlining, but does drastically slow down the code being profiled, and if you’re doing something like spinning to sync to a framerate, you’re unlikely to uncover it when you’ve slowed down your code. Always worth trying though if the sampling profiler isn’t illuminating the problem.

You may need to enable the JMX agent first using the usual -Dcom.sun.management.jmxremote foofraw in order to use the instrumenting profiler. Seems to be a windows problem mostly.