As a result, when the VM gets dropped, the memory gets deallocated even if there are still objects that reference it.
Somewhat related, there also is the issue that when you create multiple VMs, you can use classes/objects/… created by one VM with another.
As for where the static lifetime gets into play, VM creation doesn't use unsafe & compiler is happy about it, even though ISTM that there could be a tighter bound on the lifetime? https://github.com/andreabergia/rjvm/blob/93e7e48db085e780b0...
The thing with a tighter bound on the lifetime is that VM carrying a lifetime for itself is fundamentally flawed. A solution would be to remove said lifetime, and have all methods on VM that return lifetimed objects take said lifetime from the reference to the VM.
I am not sure I am going to try it though - it probably is a bit too much code to change for something that I consider "done" and I am not working on. :)