Patch review request - Test bug 7123972 test/java/lang/annotation/loaderLeak/Main.java fails intermittently

Eric Wang yiming.wang at oracle.com
Tue Jun 26 08:49:10 UTC 2012


Hi Alan,

Looks that the core-libs-dev group rejects zip file, so i reattached the 
patches again, can you please help to review?
There's another bug 6948101 
<http://monaco.us.oracle.com/detail.jsf?cr=6948101> which is caused by 
same reason as this one, I'll send the fix in another mail thread.

Thanks,
Eric

On 2012/6/25 16:06, 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

-------------- next part --------------
--- old/test/ProblemList.txt	2012-06-25 15:41:20.466150117 +0800
+++ new/test/ProblemList.txt	2012-06-25 15:41:18.998075349 +0800
@@ -122,9 +122,6 @@
 
 # jdk_lang
 
-# 7123972
-java/lang/annotation/loaderLeak/Main.java			generic-all
-
 # 6944188
 java/lang/management/ThreadMXBean/ThreadStateTest.java          generic-all
 
-------------- next part --------------
--- old/test/java/lang/annotation/loaderLeak/Main.java	2012-06-25 15:41:26.005179716 +0800
+++ new/test/java/lang/annotation/loaderLeak/Main.java	2012-06-25 15:41:24.531076496 +0800
@@ -36,6 +36,8 @@
 import java.io.*;
 
 public class Main {
+    static volatile boolean finalized = false;
+    
     public static void main(String[] args) throws Exception {
         for (int i=0; i<100; i++)
             doTest(args.length != 0);
@@ -57,8 +59,11 @@
         System.gc();
         System.gc();
         loader = null;
-        System.gc();
-        System.gc();
+        while(!finalized) {
+            System.gc();
+            System.runFinalization();
+            Thread.sleep(20);
+        }
         if (c.get() != null) throw new AssertionError();
     }
 }
@@ -67,6 +72,7 @@
     private Hashtable classes = new Hashtable();
 
     public SimpleClassLoader() {
+        Main.finalized = false;
     }
     private byte getClassImplFromDataBase(String className)[] {
         byte result[];
@@ -124,4 +130,8 @@
         classes.put(className, result);
         return result;
     }
+    
+    protected void finalize() {
+        Main.finalized = true;
+    }
 }


More information about the core-libs-dev mailing list