Analysis on JDK-8022321 java/lang/ref/OOMEInReferenceHandler.java fails intermittently

Peter Levart peter.levart at gmail.com
Sun Jan 26 19:07:35 UTC 2014


On 01/25/2014 05:35 AM, srikalyan chandrashekar wrote:
> Hi Peter, if you are a committer would you like to take this further 
> (OR) perhaps david could sponsor this change.

Hi,

Here's new webrev that takes into account Kaylan's and David's review 
comments:

cr.openjdk.java.net/~plevart/jdk9-dev/OOMEInReferenceHandler/webrev.02/


I changed into using Class.forName() instead of Unsafe for class 
preloading and initialization just to be on the safe side regarding 
unwanted premature initialization of Unsafe class. I also took the 
liberty of removing an unneeded semicolon (line 114) and fixing a JDK 8 
compile time error in generics (line 189):

     incompatible types: java.lang.ref.ReferenceQueue<capture#1 of ? 
super java.lang.Object> cannot be converted to 
java.lang.ref.ReferenceQueue<java.lang.Object>

I re-ran the java/lang/ref tests and they pass.

Can I count you as a reviewer, Kalyan? If I get a "go" also from David, 
I'll commit this to jdk9/dev...

Regards, Peter

> --
> Thanks
> kalyan
> On 1/24/14 4:05 PM, Peter Levart wrote:
>>
>> On 01/24/2014 02:53 AM, srikalyan chandrashekar wrote:
>>> Hi David, yes thats right, only benefit i see is we can avoid 
>>> assignment to 'r' if pending is null.
>>
>> Hi Kalyan,
>>
>> Good to hear that test runs without failures so far.
>>
>> Regarding assignment of 'r'. What I tried to accomplish with the 
>> change was eliminate double reading of 'pending' field. I have a 
>> mental model of local variable being a register and field being a 
>> memory location. This may be important if the field is volatile, but 
>> for normal fields, I guess the optimizer knows how to compile such 
>> code most optimally in either case. The old (your) version is better 
>> from logical perspective, since it guarantees that dereferencing the 
>> 'r', wherever it is possible, will never throw NPE (dereferencing 
>> where 'r' is not assigned is not possible because of definitive 
>> assignment rules). So I support going back to your version...
>>
>> Regards, Peter
>>
>>>
>>> -- 
>>> Thanks
>>> kalyan
>>>
>>> On 1/23/14 4:33 PM, David Holmes wrote:
>>>> On 24/01/2014 6:10 AM, srikalyan wrote:
>>>>> Hi Peter, i have modified your code from
>>>>>
>>>>> r = pending;
>>>>> if (r != null) {
>>>>>       ......
>>>>>        TO
>>>>> if (pending != null) {
>>>>>       r = pending;
>>>>>
>>>>> This is because the r is used later in the code and must not be 
>>>>> assigned
>>>>> pending unless it is not null(this was as is earlier).
>>>>
>>>> If r is null, because pending is null then you perform the wait() 
>>>> and then continue - back to the top of the loop. There is no bug in 
>>>> Peter's code.
>>>>
>>>> The new webrev is
>>>>> posted here
>>>>> http://cr.openjdk.java.net/~srikchan/Regression/JDK-8022321_OOMEInReferenceHandler-webrev-V2/ 
>>>>>
>>>>> . I ran a 1000 run and no failures so far, however i would like to 
>>>>> run a
>>>>> couple more 1000 runs to assert the fix.
>>>>>
>>>>> PS: The description section of JEP-122
>>>>> (http://openjdk.java.net/jeps/122) says meta-data would be in native
>>>>> memory(not heap).
>>>>
>>>> The class_mirror is a Java object not meta-data.
>>>>
>>>> David
>>>>
>>>>> -- 
>>>>> Thanks
>>>>> kalyan
>>>>> Ph: (408)-585-8040
>>>>>
>>>>>
>>>>> On 1/21/14, 2:31 PM, Peter Levart wrote:
>>>>>>
>>>>>> On 01/21/2014 07:17 PM, srikalyan wrote:
>>>>>>> Hi Peter/David, catching up after long weekend. Why would there 
>>>>>>> be an
>>>>>>> OOME in object heap due to class loading in perm gen space ?
>>>>>>
>>>>>> The perm gen is not a problem her (JDK 8 does not have it and we see
>>>>>> OOME on JDK8 too). Each time a class is loaded, new java.lang.Class
>>>>>> object is allocated on heap.
>>>>>>
>>>>>> Regards, Peter
>>>>>>
>>>>>>> Please correct if i am missing something here. Meanwhile i will 
>>>>>>> give
>>>>>>> the version of Reference Handler you both agreed on a try.
>>>>>>> -- 
>>>>>>> Thanks
>>>>>>> kalyan
>>>>>>> Ph: (408)-585-8040
>>>>>>>
>>>>>>> On 1/21/14, 7:24 AM, Peter Levart wrote:
>>>>>>>> On 01/21/2014 07:54 AM, Peter Levart wrote:
>>>>>>>>> *[Loaded sun.misc.Cleaner from
>>>>>>>>> /home/peter/Apps64/jdk1.8.0-ea-b121/jre/lib/rt.jar]*
>>>>>>>>> [Loaded java.io.ByteArrayInputStream from
>>>>>>>>> /home/peter/Apps64/jdk1.8.0-ea-b121/jre/lib/rt.jar]
>>>>>>>>> [Loaded sun.util.calendar.ZoneInfoFile$ZoneOffsetTransitionRule
>>>>>>>>> from /home/peter/Apps64/jdk1.8.0-ea-b121/jre/lib/rt.jar]
>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'm on linux, 64bit and using official EA build 121 of JDK 8...
>>>>>>>>>
>>>>>>>>> But if I try with JDK 7u45, I don't see it.
>>>>>>>>
>>>>>>>> So what changed between JDK 7 and JDK 8?
>>>>>>>>
>>>>>>>> I suspect the following: 8007572: Replace existing jdk timezone 
>>>>>>>> data
>>>>>>>> at <java.home>/lib/zi with JSR310's tzdb
>>>>>>>>
>>>>>>>>
>>>>>>>> Regards, Peter
>>>>>>>>
>>>>>>
>>>
>>
>




More information about the core-libs-dev mailing list