Each heap relation has a Visibility Map (VM) to keep track of
which pages contain only tuples that are known to be visible to
all active transactions. It's stored alongside the main relation
data in a separate relation fork, named after the filenode number
of the relation, plus a _vm suffix. For
example, if the filenode of a relation is 12345, the VM is stored
in a file called 12345_vm, in the same
directory as the main relation file. Note that indexes do not
have VMs.

The visibility map simply stores one bit per heap page. A set
bit means that all tuples on the page are known to be visible to
all transactions. This means that the page does not contain any
tuples that need to be vacuumed. This information can also be
used by index-only scans to answer
queries using only the index tuple.

The map is conservative in the sense that we make sure that
whenever a bit is set, we know the condition is true, but if a
bit is not set, it might or might not be true. Visibility map
bits are only set by vacuum, but are cleared by any
data-modifying operations on a page.