gcj does not do what you think it does. It compiles ahead of time, so you get rid of the startup time and the warm-up time that plagues Java applications. But the code produced is just as GC-happy and memory-intensive as before. So the steady-state performance of gcj binaries vs JVM-run .class files are about the same (or somewhat worse for gcj binaries).