JDK-8027351: (ref) Base's class finalize method not invoked if a private finalize method exists in its subclass
mandy.chung at oracle.com
Fri Nov 1 18:15:39 UTC 2013
This fixes the finalization implementation to invoke the finalize method
via shared secret so that it will call the same method as the bytecode
The current implementation uses JNI_GetMethodID to find the finalize
method of a given instance. JNI_GetMethodID returns the private finalize
method which gets invoked during finalization (which is different than
the method looked up via invokevirtual). If there is a static method
matching the name and descriptor, it will throw NoSuchMethodError even
if the base class has a matching instance method. JDK-8027270 is filed
for this JNI_GetMethodID issue.
This change replaces the JNI call to the finalize method with the shared
secret as Jeroen suggests . This will resolve this bug independent
of JDK-8027270 and also avoid the overhead of the JNI calls.
The behavioral change with this fix should rarely impact any existing
application. It would only impact code that defines a finalize method
in a base class and also a private finalize method in a subclass. The
only way to have a private finalize method is to write to the bytecode
P.S. I would love to use Martin's beloved GcFinalization utility that we
can extend our testlibrary in the future. The new regression test is
simple enough that a counter would do its work.
More information about the core-libs-dev