<AWT Dev> [8u/9] Review request: JDK-8028486 [TEST_BUG] [macosx] java/awt/Window/WindowsLeak/WindowsLeak.java fails

Philip Race philip.race at oracle.com
Wed May 4 15:06:22 UTC 2016


I recall Anton's fix included a couple of unrelated JNI refs that were not
being deleted. A separate bug ID would be good for that as it really
has nothing to do with this problem at all.

-phil.

On 5/4/16, 7:08 AM, Sergey Bylokhov wrote:
> On 04.05.16 16:07, Anton Tarasov wrote:
>> Hi Sergey,
>>
>> As you fixed the surface leak separately (thanks!) should I create a 
>> dedicated CR for the unrelated JNI ones?
>
> Can you please clarify this case? Do you have a testcase or steps to 
> reproduce?(WindowsLeak.java will pass after the current fix).
>
>
>>> On 29 Apr 2016, at 18:19, Sergey Bylokhov 
>>> <Sergey.Bylokhov at oracle.com> wrote:
>>>
>>> On 29.04.16 18:01, Anton Tarasov wrote:
>>>> [CC’ing to 2d-dev to discuss the issue]
>>>>
>>>>> On 29 Apr 2016, at 16:14, Sergey Bylokhov 
>>>>> <Sergey.Bylokhov at oracle.com> wrote:
>>>>>
>>>>> On 29.04.16 15:53, Anton Tarasov wrote:
>>>>>> It seems so. But that might be not that critical, because it 
>>>>>> doesn’t hold (it won’t) any UI controls and all the UI tree. 
>>>>>> Anyway it leaks, yes.
>>>>>
>>>>> Looks like this is crossplatform bug and it also affects d3d/ogl. 
>>>>> So probably we can fix it on the upper level? 
>>>>> validatedSrc/Dst/Data is stored the surfaces which were validated 
>>>>> and ready to paint. from the first point of view we can change 
>>>>> them to soft reference, and take care about null values.
>>>>
>>>> Are the validatedSrc/Dst/Data objects referenced from somewhere 
>>>> else? They are private, so from native? If not, soft refs won’t 
>>>> help I’m afraid...
>>>
>>> I guess it is used in BufferedContext only, to skip updates of the 
>>> native ogl/d3d context if the target/source surfaces were not 
>>> changed since the last update.
>>>
>>>>
>>>> This is not the case for CGLLayer, which is referenced from JNI. 
>>>> And so, wrapping it with a weak ref will work. Also, if the 
>>>> SurfaceData is uniquely tight to the layer, then it seems natural 
>>>> to dispose (not flush) it with the layer disposal. And that’s 
>>>> actually the case: LWWindowPeer.disposeImpl() invalidates it.
>>>> But the problem is that invalidation doesn’t release the layer.
>>>
>>> Yes, that's right the surface and layer are bound to each other(and 
>>> the layer can have more than one surface). So I do not see a reason 
>>> why we should break the link between them, which causes the surface 
>>> to live more time than its layer. I guess the right things to do is 
>>> to fix the "gc root", since we have no cycles here.
>>>
>>>>
>>>> So, again the question is: should the layer be nullified on 
>>>> invalidation or it should be made a weak ref? For me this seems 
>>>> quite logical to release resources on disposal/invalidation, what 
>>>> do you think?
>>>>
>>>> As to the fixing the issue globally, I don’t have enough 
>>>> understanding of the pipe design so that to do that properly. For 
>>>> instance, as I wrote before, I don’t know under which conditions 
>>>> the context should/may be disposed…
>>>>
>>>> May be someone else can advice on it.
>>>
>>> I can take a look, but are you sure that the test "WindowsLeak.java" 
>>> reproduce exactly your problem?
>>>
>>>>> Note that such changes are 2d related code and should be reviewed 
>>>>> on 2d-dev.
>>>>>
>>>>>>
>>>>>>> Assigned the peer/surfaceData to null in CGLayer can causes an 
>>>>>>> NPE in all its usage, because there is no any synchronization 
>>>>>>> which will prevent the usage of CGLayer after disposing.
>>>>>>
>>>>>> That’s bad. Will wrapping the refs with AtomicReference help?
>>>>>>
>>>>>>>
>>>>>>> Unrelated to the fix, but it seems we should call flush() on 
>>>>>>> surface when the layer is disposed, at least I do not understand 
>>>>>>> where we flush the native ogl data for the latest surface data.
>>>>>>
>>>>>>
>>>>>> This will trigger CGLLayerSurfaceData.invalidate(), but the 
>>>>>> “layer” will still not be nullified. What about nullifying it in 
>>>>>> invalidate()? Will we face the same synchronisation issue?
>>>>>>
>>>>>> Anton.
>>>>>>
>>>>>>>
>>>>>>> On 29.04.16 15:00, Anton Tarasov wrote:
>>>>>>>> Hi Sergey, Alexander,
>>>>>>>>
>>>>>>>> Please review the fix:
>>>>>>>>
>>>>>>>> bug: JDK-8028486 [TEST_BUG] [macosx] 
>>>>>>>> java/awt/Window/WindowsLeak/WindowsLeak.java fails
>>>>>>>> webrev: http://cr.openjdk.java.net/~ant/JDK-8028486/webrev.0
>>>>>>>>
>>>>>>>> I’m copying my comment from CR:
>>>>>>>>
>>>>>>>> Please open the attached screenshot [*], made with YourKit, 
>>>>>>>> where a chain of links is shown from the GC roots.
>>>>>>>> The frame is held by its peer which is held by CGLLayer which 
>>>>>>>> is held as validatedSrcData in the GL context.
>>>>>>>> The point is that the GL context doesn't cleanup the last state 
>>>>>>>> until under some conditions, which are not applicable to this 
>>>>>>>> scenario.
>>>>>>>> I'm not sure should the cleanup be triggered here or not, but 
>>>>>>>> the problem can be solved otherwise.
>>>>>>>>
>>>>>>>> The point is that in the chain the CGLLayer instance has been 
>>>>>>>> disposed, in response to the frame disposal.
>>>>>>>> So, this is the only ref that holds it (the JNI ref is released 
>>>>>>>> by the native peer on disposal).
>>>>>>>> Thus, as the layer is disposed it can at least zero all the 
>>>>>>>> java refs it holds (this change already fixes the problem).
>>>>>>>> Then, the "layer" ref in CGLLayerSurfaceData should probably be 
>>>>>>>> made weak.
>>>>>>>>
>>>>>>>> [*] 
>>>>>>>> https://bugs.openjdk.java.net/secure/attachment/59121/8028486.png
>>>>>>>>
>>>>>>>> As to the “weak ref” mentioned in the comment. I didn’t do 
>>>>>>>> that, but if you find it reasonable I can add that change (or 
>>>>>>>> file a separate CR).
>>>>>>>>
>>>>>>>> Also, the fix contains some additional cleanup (not related to 
>>>>>>>> this CR): two more JNI local refs leak, fixed.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Anton.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> Best regards, Sergey.
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> Best regards, Sergey.
>>>>
>>>
>>>
>>> -- 
>>> Best regards, Sergey.
>>
>
>


More information about the awt-dev mailing list