I've found that peers.dat gets wiped out from time to time, manifesting as "Loaded 0 addresses from peers.dat <n>ms" when it previously had hundreds of peers recorded. I've associated this power outages/kernel oopses, but seen it more often. I think I've tracked this down: StopNode() calls DumpAddresses() but doesn't account for how we started up. When we'd started up and found .lock held, we reach DumpAddresses() with zero peers and dump an empty database, overwriting the good one.
It's easy to forget about .lock after an outage. When you're tinkering and bitcoin-cli stop and hastily relaunch bitcoind, which I used to do before I realised (a) that bitcoin-cli stop is asynchronous, and (b) just how slow shutdown can sometimes be on my hardware, you trigger the same thing, which I think accounts for every other time I've seen it. Probably annoys me more because working Tor HS peers are harder to find.
Maybe it's as simple as wrapping the dump in if (addrman.size() != 0) { ... }, but I haven't tested it.