docs: public static void startFinalizer(
        Class<?> finalizableReferenceClass,
        ReferenceQueue<Object> queue,
        PhantomReference<Object> frqReference) {
      /*
       * We use FinalizableReference.class for two things:
       *
       * 1) To invoke FinalizableReference.finalizeReferent()
       *
       * 2) To detect when FinalizableReference's class loader has to be garbage collected, at which
       * point, Finalizer can stop running
       */
      if (!finalizableReferenceClass.getName().equals(FINALIZABLE_REFERENCE)) {
        throw new IllegalArgumentException("Expected " + FINALIZABLE_REFERENCE + ".");
      }
  
      Finalizer finalizer = new Finalizer(finalizableReferenceClass, queue, frqReference);
      Thread thread = new Thread(finalizer);
      thread.setName(Finalizer.class.getName());
      thread.setDaemon(true);
  
      try {
        if (inheritableThreadLocals != null) {
          inheritableThreadLocals.set(thread, null);
        }
      } catch (Throwable t) {
        logger.log(
            Level.INFO,
            "Failed to clear thread local values inherited by reference finalizer thread.",
            t);
      }
  
      thread.start();
    }