Currently the mempool isn't persisted across restarts. The historical argument against doing this is that it would make transactions immortal. Expiration now addresses that issue.

Without preserving the mempool node behavior changes drastically across restarts which complicates production use (e.g. mining overly small/low fee blocks) as well as development testing. The lack of retention also causes the loss of txn priority modifications made with prioritisetransaction which makes the API less reliable.

/**
 * Maintain validation-specific state about nodes, protected by cs_main, instead
 * by CNode's own locks. This simplifies asynchronous operation, where
 * processing of incoming data is done after the ProcessMessage call returns,
 * and we're no longer holding the node's locks.
 */
struct CNodeState {
    
    CService address;
    
    bool fCurrentlyConnected;
    
    int nMisbehavior;
    
    bool fShouldBan;
    
    std::string name;
    
    std::vector<CBlockReject> rejects;
    
    CBlockIndex *pindexBestKnownBlock;
    
    uint256 hashLastUnknownBlock;
    
    CBlockIndex *pindexLastCommonBlock;
    
    CBlockIndex *pindexBestHeaderSent;
    
    int nUnconnectingHeaders;