Some thoughts on your scenario (sorry I also won't give hints for specific hardware):
* ever thought about using docker? You'd concentrate some of your VM into one (like 20 docker container on one VM) and could save a lot overhead of complete VM
* regarding stopped / frozen VM: You likely want to use some kind of watchdog which triggers a restart of VM if its not responding for a specific amount of time. So you could decrease the offline time and therefore decrease the amount of data to be parsed. This could save you a lot of money and ressources you would keep just for worsecase otherwise.
* I understand that your java software is threadable and therefore capable of using multi core. So I'd prefer more cores over higher speed. In PVE you can set 4 or 6 cores per VM and then limit the usage to half of it. E.g. 6 cores and a limit of 300% or probably 400%. So you can spread the load over more cores assuming, they are not all running the same time.
* ever thought about using docker? You'd concentrate some of your VM into one (like 20 docker container on one VM) and could save a lot overhead of complete VM
* regarding stopped / frozen VM: You likely want to use some kind of watchdog which triggers a restart of VM if its not responding for a specific amount of time. So you could decrease the offline time and therefore decrease the amount of data to be parsed. This could save you a lot of money and ressources you would keep just for worsecase otherwise.
* I understand that your java software is threadable and therefore capable of using multi core. So I'd prefer more cores over higher speed. In PVE you can set 4 or 6 cores per VM and then limit the usage to half of it. E.g. 6 cores and a limit of 300% or probably 400%. So you can spread the load over more cores assuming, they are not all running the same time.