![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  
if (memoizedState === null || typeof memoizedState !== 'object') {
      return false;
    }
    const {deps} = memoizedState;
    const hasOwnProperty = Object.prototype.hasOwnProperty.bind(memoizedState);
    return (
      hasOwnProperty('create') &&
      hasOwnProperty('destroy') &&
      hasOwnProperty('deps') &&
      hasOwnProperty('next') &&
      hasOwnProperty('tag') &&
      (deps === null || isArray(deps))
    );
  }
  function didHookChange(prev: any, next: any): boolean {
    const prevMemoizedState = prev.memoizedState;
    const nextMemoizedState = next.memoizedState;
    if (isEffect(prevMemoizedState) && isEffect(nextMemoizedState)) {
      return (
        prevMemoizedState !== nextMemoizedState &&
        !areHookInputsEqual(nextMemoizedState.deps, prevMemoizedState.deps)
      );
    }
    return nextMemoizedState !== prevMemoizedState;
  }
  function didHooksChange(prev: any, next: any): boolean {