![Screenshot 2019-12-16 10 51 05](https://user-images.githubusercontent.com/793565/70934095-fd91ed80-1ff1-11ea-93b5-746e816585ec.png)
There's seems to be circumstances where unmounted DOM/Fibers are kept alive by React DevTools. They're kept alive in `primaryFibers`:
https://github.com/facebook/react/blob/34527063083195558f98108cde10b5d6ad0d6865/packages/react-devtools-shared/src/backend/renderer.js#L772

It seems like a WeakSet would be appropriate and would remove the leak. Otherwise we'd need to understand why recordUnmount isn't called.

CC @bvaughn  
return;
      }
    }
    const numUnmountIDs =
      pendingRealUnmountedIDs.length +
      pendingSimulatedUnmountedIDs.length +
      (pendingUnmountedRootID === null ? 0 : 1);
    const operations = new Array(
       I
      2 +  [rendererID, rootFiberID]
       How big is the string table?
      1 +  [stringTableLength]
         Then goes the actual string table.
        pendingStringTableLength +
         All unmounts are batched in a single message.
         [TREE_OPERATION_REMOVE, removedIDLength, ...ids]
        (numUnmountIDs > 0 ? 2 + numUnmountIDs : 0) +
         R
        pendingOperations.length,
    );
     I
     T
     W
    let i = 0;
    operations[i++] = rendererID;
    operations[i++] = currentRootID;
     N
     [
    operations[i++] = pendingStringTableLength;
    pendingStringTable.forEach((value, key) => {