Optimizing Java Applications