virtuald makes good points. You could log the actual execution time and easily see whether that is happening.
Has anyone documented the GC settings on the roboRIO? I've wondered, but we're a C++ team and a bit busy right now to go figure it out. -XX:MaxGCPauseMillis would be really useful.
I'd move the autonomous selection logic from disabledPeriodic to autonomousInit().
Can you do your profile generation earlier (e.g., via an
instance initializer) and see if that helps?
It looks like you know the size of the list of Elements wrapped by Profile in advance. Consider modifying Profile's constructor to receive an initial capacity, and use that to set the size of the ArrayList<Element>. This will help your perf.