Servo problems...

Looks to me as if the GPS input is being received on average twice a second, there was only one error, the GPS position was consistent throughout and the commanded servo angle was 39 degrees throughout.

If the servo moved during that time then either there's a problem with the servo itself (or wiring/power supply etc), or memory corruption causing the servo's internal state to be corrupted, or a timing issue preventing the Servo class from outputting the PWM pulses accurately. It seems unlikely that a timing issue would occur consistently so the third option seems unlikely. I suggest you check the free memory immediately before doing the gps.encode and see whether you're anywhere near running out. I haven't looked at the gps implementation but presumably it's got a buffer big enough to hold at least a complete sentence, so it'll be a bit of a memory hog. It's also possible that gps.encode itself uses significant stack or heap space , so unless your freeMemory check shows you have hundreds of bytes to spare I would suggest you also look under the covers of the GPS library and see whether the memory consumption is likely to be static, or changing significantly over time. (If it's changing, then your free memory checks won't tell you what the peak consumption is unless you put them INSIDE the library.)