These are for traditional, stack-based JVM bytecode. But as I understand after having spent way too much time lately poking around and modifying .smali disassembly of other people's apps, Dalvik (Android JVM) bytecode was initially designed to map more-or-less directly to actual CPU registers to be easily JIT-able.
But then I don't think garbage collection can be done purely in hardware. You still have to have something resembling a runtime, and it has to be written in a lower level language.
https://en.m.wikipedia.org/wiki/Java_processor