Running finalizers on JVM exit is disabled by default. It can be enabled with System.runFinalizersOnExit and Runtime.runFinalizersOnExit, but both methods are deprecated because they are inherently unsafe.

According to the Oracle Javadoc:

It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

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

Noncompliant Code Example

fun main() {
  ...
  System.runFinalizersOnExit(true)  // Noncompliant
  ...
}

Compliant Solution

fun main() {
    Runtime.getRuntime().addShutdownHook(object : Thread() {
        override fun run() {
            doSomething()
        }
    })
}

See