That's such an unfair comparison, though (and really, with 8+ GB of RAM being the norm, 20 MB is still pretty svelte). Java has an entire virtual machine and runtime, whereas a C program is just a binary that gets loaded straight into memory.
Java theoretically taking a lot of care not to use excessive memory. It loads classes on demand, it compiles bytecode only when this path is really hot. I don't really see why it's necessary to use 16MB RAM. Golang has GC and doesn't that much memory. Lua has an entire virtual machine and runtime and doesn't use that much memory either. It's not a valid argument. I still believe that current JVM developers just don't care that much about memory consumption which is a valid decision, but I don't like it anyway. Not everyone has 8+GB of RAM. I have 256 MB VPS which runs quite a few of network services and has half of memory free, but I don't think that I could afford Java if I want to run something there, even if my load is tiny.
You can't say "wow, look how much smaller the C program is" and then ignore why it's so much smaller in the first place (no runtime, no garbage collection, etc.) If that's the case, then we should hand-roll assembly all the time because it's "smaller". You also can't just call Java inefficient because it produces larger programs or is "slower". It's all about choosing the right tool for the job.
Perhaps Java should have been designed to scale down and not require all that stuff when perfectly reasonable applications don't need them all the time.