Посмотрите на реализацию внутри:
public int size() {
if (size == 0)
return 0;
expungeStaleEntries();
return size;
}
специально для expungeStaleEntries
метода, который использует:
/**
* Reference queue for cleared WeakEntries
*/
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
Этот метод также обновляет size
, прежде чем он будет возвращен вам,