> On 04 May 2016, at 17:08, Sergey Bylokhov <sergey.bylok...@oracle.com> 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).
No, I don’t have a standalone test. The linking chain for the CGE ref is here: https://i.imgur.com/hhrdjln.png <https://i.imgur.com/hhrdjln.png> (the one I posted before didn’t contain "JNI Local” ref because that JDK build had the proposed fix in) I’m not sure if CGE can be recreated, but if it can, this is a potential leak. For the second one (CPlatformWindow), unfortunately I couldn’t find the memory dump that contained it, from which I tracked it down. It wasn’t me who reproduced the leak, I had only the dump in my disposal (and I didn’t save it because the leak seemed obvious to me). But if you search for "jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]” in the code, you’ll find that with its every usage platformWindow gets deleted (because it’s a temp JNI local) except for the one occurance which I fixed. Anyway, both the JNI locals don’t seem to be left intentionally, but look like a simple misses. Unfortunately (as I wrote during the “CAccessible fix" discussion), PushLocalFrame/PopLocalFrame doesn’t take care of the locals in all the cases. So, a missed JNI object can be a potential leak. Regards Anton. > > >>> On 29 Apr 2016, at 18:19, Sergey Bylokhov <sergey.bylok...@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.bylok...@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. >> > > > -- > Best regards, Sergey.