Java has built-in multithreading. Java's serialization makes checkpointing trivial and correct. Java's socket libraries make interprocess exchange a snap. Results are replicable across platforms. Results are replicable across platforms.
Results are replicable across platforms.
Comparing the relative speeds of GP engines is always difficult because differences in their random number generators and subtly different breeding mechanisms mean that they rarely evaluate the same number or same sized individuals. ECJ's speed will also change dramatically depending on the virtual machine you run it on. My experience has shown that ECJ's breeding is slower than lil-gp's breeding, but its evaluation is as fast or faster. Since the trend in GP is towards longer evaluation times, I think this is a reasonable tradeoff given the considerable disparity in features. ECJ's big achilles heel is memory consumption, the bugaboo of Java GP programs everywhere.