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

Jaroslav Bachorik jaroslav.bachorik at oracle.com
Fri Oct 9 07:36:39 UTC 2015


On 9.10.2015 08:51, Jaroslav Bachorik wrote:
> On 8.10.2015 18:56, Martin Buchholz wrote:
>> 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
>
> Ok. I suppose this would be because currentTimeMillis() is dependent on
> the OS time, right?
>
>> - why use complex Phaser when simple CountDownLatch will do?
>
> The logic is more complex than just waiting for the finalization to
> happen. I need to make sure the finalization happened due to
> GC.run_finalization command and not because of an ordinary GC run or JVM
> shutdown. I will update the test comments to make this clear.
>
>>
>> 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");
>>      }
>
> This seems to be testing only the fact that the finalization has
> eventually been run - not that the finalization was actually provoked by
> System.gc() or System.runFinalization(). Unfortunately, this wouldn't
> suffice for my needs here.

Updated webrev addressing Dan's and Martin's concerns - 
http://cr.openjdk.java.net/~jbachorik/8135188/webrev.01

-JB-

>
> -JB-
>
>>
>>
>> On Thu, Oct 8, 2015 at 12:37 AM, Jaroslav Bachorik
>> <jaroslav.bachorik at oracle.com <mailto: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-
>>
>>
>



More information about the serviceability-dev mailing list