Implementing a trivial checkpoint mechanism is not difficult at all---it has been done many times for Java. People have also used such mechanisms to perform thread migration in distributed Java systems.
Implementing full orthogonal persistence is more challenging, particularly with regards to language design issues (how do you combine concurrency and persistence semantics in a way that does not impinge on the language?).
Many years ago, we build an orthogonally persistent Java (OPJ) which performed well. While other folks embedded their mechanism in the VM, we did ours exclusively by transforming classes at classloading time. We eventually generallized this to be able to extend java semantics in all sorts of interesting ways. We called it the Semantic Extension Framework (SEF). I moved to the US and the key author left for industry and so our SEF never really made it into the mainstream. A year or so later we saw AOP emerge, which carries many of the same ideas.
There was also a major project at Sun (http://research.sun.com/forest) which worked on this. Their approach was to modify the VM internals.
There is a project at ANU (dJVM) looking at distributed jvms (http://djvm.anu.edu.au/).
The SEF and OPJ work was a lot of fun, but I don't think it has much to do with core VM design as I think the best approach is to build it using the dynamic classloader. :-)
Cheers,
--Steve
http://cs.anu.edu.au/~Steve.Blackburn/pubs/abstracts.html#opj-pos9 http://cs.anu.edu.au/~Steve.Blackburn/pubs/abstracts.html#fly-pjw3
