I wish I had an answer for getting a good reliable JVM with Shenandoah enabled, but I've run into similar issues. But just to point out the benefit of Shenandoah.
I'm running a very simple program, but very big. I need between 300-400GB of RAM to run my program. The program is little more than a couple of large array lists and a couple of large ConcurrentHashMaps. I have about 700 million objects that I need to put into those lists and maps. So when I simply measure the load time of this data on any JDK 1.8-1.19 without Shenandoah, ie g1gc, it takes about 40 minutes and all 32 cores are 90% busy, much of it in the kernel. This is running on Windows Server 2012 R2. By only changing the garbage collector to Shenandoah that time drops to 35 seconds. With only 1 core busy. That's a huge improvement. The JDK that I found with Shenandoah support was:
openjdk version "16.0.2" 2021-07-20
OpenJDK Runtime Environment Temurin-16.0.2+7 (build 16.0.2+7)
OpenJDK 64-Bit Server VM Temurin-16.0.2+7 (build 16.0.2+7, mixed mode, sharing)
The downside is that after loading my data, I populate additional maps of similar size using ForkJoin pools with between 8 and 32 threads and run some RegEx's, but I can repeatedly crash the JVM. I don't know if this is due to something I've done wrong, the fork join pools, garbage collector, or the OpenJDK. But I'd love to find a production hardened JDK with Shenandoah.