[OpenJDK 2D-Dev] RFR 8148886: SEGV in sun.java2d.marlin.Renderer._endRendering

Jim Graham james.graham at oracle.com
Sat Feb 20 00:02:19 UTC 2016


Sounds good then...

			...jim

On 2/19/2016 2:06 PM, Laurent Bourgès wrote:
> Dear Jim,
>
>     With respect to the ArrayCacheHolder, if the refType is SOFT, then
>     you have a SOFT reference holding a WEAK reference.  Isn't that
>     similar to the WEAK/WEAK case that you feel is redundant?  Or is
>     there an important value to having a WEAK reference to the caches
>     when the entire RendererContext is held by SOFT?
>
>
> In terms of liveness, a SoftReference is living a lot longer than a
> WeakReference; typically in my benchmarks, SoftReferences are only
> cleared when they are no more used for a long time (gc time threshold)
> i.e. after a very long time !
> That's why I really want to have a SOFT/WEAK solution to maintain the
> RendererContext in memory longer (more useful ie higher reuse rate) than
> the ArrayCacheHolder (less useful).
>
>     (Perhaps WEAK is much more transient than SOFT?)
>
>
> Exactly: weak references are (in practice) cleared at each young gen GC
> cycle ie their associated memory is very short lived.
>
>     I'm just verifying that you are intending that the Caches are held
>     by a WEAK reference when the context is held by a SOFT reference. I
>     don't really have a counter-argument other than it didn't make sense
>     to me upon first glance, but if it is intentional than that's good
>     enough for me. If that's true then I'm good with the fix...
>
>
> The current behaviour is working as expected i.e. intentional as I want
> to minimize the memory footprint:
> - RendererContext are kept in memory by a SoftReference = longer alive
> (to maximize their reuse)
> - ArrayCache are kept by a WeakReference = shorter alive (to reduce
> their footprint)
>
> Besides, ArrayCache contain larger primitive arrays that consumes a lot
> more memory than a RendererContext (larger cache) for large shapes /
> canvas that should happen less frequently so the reallocation overhead
> should remain small.
>
> Regards,
> Laurent
>
>     On 2/19/2016 12:14 AM, Laurent Bourgès wrote:
>
>         Dear Jim,
>
>         Please have a look to this updated webrev:
>         http://cr.openjdk.java.net/~lbourges/marlin/marlin-8148886.6/
>
>         I fixed the javadoc in ReentrantContextProvider: see below.
>
>
>         2016-02-18 23:40 GMT+01:00 Jim Graham <james.graham at oracle.com
>         <mailto:james.graham at oracle.com>
>         <mailto:james.graham at oracle.com <mailto:james.graham at oracle.com>>>:
>
>
>
>              I swear I thought I remember asking this before and getting an
>              answer, but I can't find it.
>
>              RenderContext line 49 - should that be "!= HARD" so that
>         you keep a
>              hard reference for SOFT as well?
>
>
>         This concerns the ArrayCacheHolder that gathers several ArrayCache
>         instances that may consume a lot of memory: for example, it
>         holds large
>         primitive arrays in case of large shapes / images or very
>         complex ones.
>
>         To minimize the memory footprint, I deliberately use a
>         WeakReference<ArrayCachesHolder>(holder) i.e. such large caches are
>         "short live" (always in GC's young generation or TLAB ?).
>
>         When the RendererContext is also kept in memory by a
>         WeakReference, then
>         it is redundant to have 2 WeakReferences:
>         in this case, the forementioned statement set the
>         USE_CACHE_HARD_REF to
>         true that makes a strong reference between the RendererContext
>         and its
>         related ArrayCachesHolder.
>
>         Finally I still plan to rewrite the "ArrayCache" feature as a more
>         generic array cache as we discussed several times !
>         Probably it is time to do it now or after fixing the bug:
>         https://bugs.openjdk.java.net/browse/JDK-8144938
>
>              Also, I just noticed a typo in the sample code in
>              ReentrantContextProvider, shouldn't the constructor in the
>              newContext() method be "new ReentrantContextImpl()"?
>         (TileState
>              probably came from cutting and pasting from AAShapePipe.)
>
>
>         Good catch: fixed.
>
>         Besides I added a sample for ReentrantContextImpl:
>
>             52  * - create a subclass ReentrantContextImpl to hold the
>         thread state:
>             53  *
>             54  * static final class ReentrantContextImpl extends
>         ReentrantContext {
>             55  *     // specific cached data
>             56  * }
>             57  *
>
>         Moreover I checked that the sample code is valid as it compiles
>         properly
>         in a new class.
>
>
>         PS: I will be on winter holidays (leaving tomorrow for 1 week), so I
>         would like to push this patch myself asap.
>         If it is not possible, could you please handle the review thread
>         & push
>         it for me ?
>
>         Cheers,
>         Laurent
>
>
>
>
> --
> --
> Laurent Bourgès



More information about the 2d-dev mailing list