Lately I'm also running macOS virtualized for testing various apps. After some heavy usage the same problem popped up: the .vmdk uses way too much space on my quite small 256GB SSD. Currently is at around 70GB.
The process is similar to what I did on Windows and Linux i.e. write a null file that is erased at the end then use the command-line tools to compact the .vmdk and reclaim space (the example is specific for VMWare Fusion).
Without further ado:
Fill up all the empty space with 0x00
$ cat /dev/zero > zeroed_empy_space; rm zeroed_empy_space
In case you're wondering what
/dev/zerois a special file in Unix-like operating systems that provides as many null characters (ASCII NUL, 0x00) as are read from it. One of the typical uses is to provide a character stream for initializing data storage.
VMWare Fusion is installed by default in
/Applications/VMware Fusion.app so you just have to run:
$ cd ‘/Applications/VMware Fusion.app/Contents/Library/‘ $ vmware-vdiskmanager -k your_vm_name.vmdk
and wait until it finishes - please note that you need at least the .vmdk file size free space on disk or this operation will fail.
Original vmdk size: 70GB
After zeroing free space and clean-up: 40GB