The most novel thing I've heard about Dalvik is their zygote technique for minimizing app startup time. The zygote is is a Dalvik process that's loaded and ready but for the actual bytecode it will need to run. To start a process it first makes a fork of the zygote, which allows for more shared memory and a more expensive initial setup time for the zygote without any penalty when creating new Dalvik processes.
I dunno if this technique necessitated writing their own VM however.
Does this seem backwards to anyone else?