Why is this an issue?

Enabling runFinalizersOnExit is unsafe as it might result in erratic behavior and deadlocks on application exit.

Indeed, finalizers might be force-called on live objects while other threads are concurrently manipulating them.

Instead, if you want to execute something when the virtual machine begins its shutdown sequence, you should attach a shutdown hook.

Noncompliant code example

public static void main(String [] args) {
  System.runFinalizersOnExit(true);  // Noncompliant
}

protected void finalize(){
  doShutdownOperations();
}

Compliant solution

public static void main(String [] args) {
  Thread myThread = new Thread( () -> { doShutdownOperations(); });
  Runtime.getRuntime().addShutdownHook(myThread);
}

Resources