RFR 8135188: RunFinalizationTest.java Exception java.lang.Error: Test failure: Object was not finalized

Martin Buchholz martinrb at google.com
Thu Oct 8 16:56:13 UTC 2015


Hi Jaroslav,

we all keep writing finalization code like this... welcome to the club!

  I think it would be better :
- never use currentTimeMillis to measure elapsed time; use nanoTime instead
- why use complex Phaser when simple CountDownLatch will do?

I just concidentally wrote this code, which I hope will be a model of best
practice:

    /** No guarantees, but effective in practice. */
    private static void forceFullGc() {
        CountDownLatch finalizeDone = new CountDownLatch(1);
        WeakReference<?> ref = new WeakReference<Object>(new Object() {
            protected void finalize() { finalizeDone.countDown(); }});
        try {
            for (int i = 0; i < 10; i++) {
                System.gc();
                if (finalizeDone.await(1L, SECONDS) && ref.get() == null) {
                    System.runFinalization(); // try to pick up stragglers
                    return;
                }
            }
        } catch (InterruptedException unexpected) {
            throw new AssertionError("unexpected InterruptedException");
        }
        throw new AssertionError("failed to do a \"full\" gc");
    }


On Thu, Oct 8, 2015 at 12:37 AM, Jaroslav Bachorik <
jaroslav.bachorik at oracle.com> wrote:

> Please, review the following test change
>
> Issue : https://bugs.openjdk.java.net/browse/JDK-8135188
> Webrev: http://cr.openjdk.java.net/~jbachorik/8135188/webrev.00
>
> The problem is described in detail in the issue. This patch follows the
> recommendation by Dan Daugherty and runs the part where finalization is
> being requested in a shutdown handler as a separate process. The test then
> checks the result of this separate process to see whether any errors were
> reported. In order to simplify the logic of the shutdown handler the
> failures are reported by simply printing messages into stderr as opposed to
> throwing 'new Error()'.
>
> The modified test is still passing on all supported platforms.
>
> Thanks,
>
> -JB-
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20151008/5c3b3b6b/attachment.html>


More information about the serviceability-dev mailing list