Hi Stuart,

Thank you for help to publish the fix, my pleasure to contribute to OpenJDK project.

Thanks,
Eric

On 2012/6/28 12:40, Stuart Marks wrote:
I've posted the webrev here:

http://cr.openjdk.java.net/~smarks/yiming.wang/7123972/webrev.0/

I've looked at the changes and they seem fine.

It's interesting that the run times take 30-60 sec in your experience. I've run them on my system (Linux in a virtual machine) and they usually run in 10-20 sec. In any case, as you say, if the test times out it indicates there really was a failure.

I'll give people a chance to look at the webrev and if there aren't any more comments in another day or so I'll push in the changeset.

Thanks for developing this!

s'marks

On 6/26/12 11:50 PM, Eric Wang wrote:
Hi David,

Thank you! I run the test several times on 3 platforms (windows, solaris and linux), the average execution time is 30secs to 60secs. if the test hang 2
minutes, there should be something wrong.

Hi Marks,

I don't have the author role, Can you please help to review and post the webrev
7123972.zip in attachment if it is OK, Thanks a lot!

Regards,
Eric

On 2012/6/27 14:19, David Holmes wrote:
Eric,

Ignore my comment about adding the timeouts. As Alan reminded me if the test
would hang then jtreg will time it out after two minutes anyway.

So this is good to go as far as I am concerned.

Thanks,
David

On 27/06/2012 7:51 AM, David Holmes wrote:
Thanks Eric.

So to summarize:

- we create a custom classloader, load a class through it and store a
reference to that Class in a WeakReference
- we then drop the reference to the loader

At this point the only reference to the loader is from the Class loaded,
which in turn is only weakly reachable.

I must confess that I'm unclear why this test should be failing in its
original form. The first gc() should remove the strong reference to the
loader. That leaves a weak cycle: WeakRef -> Class -> Loader -> Class.
The second gc() should detect the cycle and clear the WeakRef. I guess
the problem is that depending on which gc is in use the actual gc()
calls may not in fact induce every possible GC action.

The fix seems reasonable in that regard - keep gc'ing and finalizing
till we see the loader is gone, and so the WeakReference should be
cleared. The original bug would cause a ref to the Class to remain (from the annotation) and hence the WeakRef would not be cleared. However, in
that case the loader would also be strongly referenced and so never
become finalizable. So if this test was now run against a JDK with the
original bug, the test would hang. So I think we need to add a timeout
in there as well.

David

On 25/06/2012 6:06 PM, Eric Wang wrote:
On 2012/6/21 20:16, David Holmes wrote:
Hi Eric,

On 21/06/2012 8:57 PM, Eric Wang wrote:
Hi David,

Thanks for your review, I have updated the code by following your
suggestion. please see the attachment.
I'm not sure whether there's a better way to guarantee object finalized by GC definitely within the given time. The proposed fix may work in
most cases but may still throw InterruptException if execution is
timeout (2 minutes of JTreg by default).

There is no way to guarantee finalization in a specific timeframe, but if a simple test hasn't executed finalizers in 2 minutes then that in
itself indicates a problem.

Can you post a full webrev for this patch? I don't like seeing it out
of context and am wondering exactly what we are trying to GC here.

David

Regards,
Eric

On 2012/6/21 14:32, David Holmes wrote:
Hi Eric,

On 21/06/2012 4:05 PM, Eric Wang wrote:
I come from Java SQE team who are interested in regression test bug
fix.
Here is the first simple fix for bug 7123972
<http://monaco.us.oracle.com/detail.jsf?cr=7123972>, Can you please
help
to review and comment? Attachment is the patch Thanks!

This bug is caused by wrong assumption that the GC is started
immediately to recycle un-referenced objects after System.gc() called
one or two times.

The proposed solution is to make sure the un-referenced object is
recycled by GC before checking if the reference is null.

Your patch makes its own assumptions - specifically that finalization
must eventually run. At a minimum you should add
System.runFinalization() calls after the System.gc() inside the loop. Even that is no guarantee in a general sense, though it should work
for hotspot.

David


Regards,
Eric

Hi Alan & David,

Thank you for your comments, sorry for reply this mail late as i was
just back from the dragon boat holiday.
I have updated the code again based on your suggestions: rename the flag
variable, increase the sleep time and remove it from problem list.
The attachment is the full webrev for this patch, Can you please review
again? Thanks a lot!

Regards,
Eric


Reply via email to