Let's say we have a block with lots of blockstates. How much memory does it use?
We can use Java Object Layout to get an estimate of how many bytes an instance of an object uses as described here: https://www.baeldung.com/jvm-measuring-object-sizes
So let's say we create a bunch of blocks with different blockstate properties. Java Object Layout has a graph-walking tool that will find every object reachable from a given instance, but most of these objects we find will be shared by other blocks.
However, Java Object Layout does let us get a graph layout for two objects and subtract the references in one from the other,