Dear Jim,

I advocated I only looked at the netbeans memory profiler's output: no more
megabytes allocated !

The main question is: how to know how GC / hotspot deals with such small
allocations ? Is there any JVM flag to enable to see real allocations as
does jmap -histo.

>
> Quick questions - which benchmarks were run before/after?  I see a lot of
> benchmark running in your Pisces improvement thread, but but none here.
>

Agreed; I can try running j2dBench on this fix only. I generally run
Andrea's MapBench as I appeared more complex and using multiple threads.


> Also, this should be tested on multiple platforms, preferably Linux,
> Windows and Mac to see how it is affected by differences in the platform
> runtimes and threading (hopefully minimal).
>

It appears more difficult for me: I can use at work a mac 10.8 and I can
run Windows XP within virtual box (but it is not very representative).

Don't you have at oracle any test platform to perform such tests /
benchmark ?


> Finally, Hotspot is supposed to deal very well for small thread-local
> allocations like the int[4] and Rectangle2D that you optimized.  Was it
> necessary to cache those at all?  I'm sure the statistics for the
> allocations show up in a memory profile, but that doesn't mean it is
> costing us anything - ideally such small allocations are as fast as free
> and having to deal with caching them in a context will actually lose
> performance.  It may be that the tile caching saved enough that it might
> have masked unnecessary or detrimental changes for the smaller objects...


I repeat my question: how can I know at runtime how hotspot optimizes
AAShapePipe code (allocations ...) ? Does hotspot can do stack allocation ?
is it explained somewhere (allocation size threshold) ?

Maybe verbose:gc output may help ?

Finally I spent a lot of time on pisces renderer and running MapBench to
show performance gains.

Thanks for your interesting feedback,

Laurent

On 4/5/2013 5:20 AM, Laurent Bourgčs wrote:

> Dear java2d members,
>
> I figured out some troubles in java2d.pipe.AAShapePipe related to both
> concurrency & memory usage:
> - concurrency issue related to static theTile field: only 1 tile is cached
> so a new byte[] is created for other threads at each call to renderTile()
> - excessive memory usage (byte[] for tile, int[] and rectangle): at each
> call to renderPath / renderTiles, several small objects are created (never
> cached) that leads to hundreds megabytes that GC must deal with
>
> Here are profiling screenshots:
> - 4 threads drawing on their own buffered image (MapBench test):
> http://jmmc.fr/~bourgesl/**share/AAShapePipe/AAShapePipe_**byte_tile.png<http://jmmc.fr/~bourgesl/share/AAShapePipe/AAShapePipe_byte_tile.png>
>
> - excessive int[] / Rectangle creation:
> http://jmmc.fr/~bourgesl/**share/AAShapePipe/AAShapePipe_**int_bbox.png<http://jmmc.fr/~bourgesl/share/AAShapePipe/AAShapePipe_int_bbox.png>
> http://jmmc.fr/~bourgesl/**share/AAShapePipe/AAShapePipe_**
> rectangle_bbox.png<http://jmmc.fr/~bourgesl/share/AAShapePipe/AAShapePipe_rectangle_bbox.png>
>
> Here is the proposed patch:
> http://jmmc.fr/~bourgesl/**share/AAShapePipe/webrev-1/<http://jmmc.fr/~bourgesl/share/AAShapePipe/webrev-1/>
>
> I applied a simple solution = use a ThreadLocal or ConcurrentLinkedQueue
> (see useThreadLocal flag) to cache one AAShapePipeContext per thread (2K
> max).
> As its memory footprint is very small, I recommend using ThreadLocal.
>
> Is it necessary to use Soft/Weak reference to avoid excessive memory usage
> for such cache ?
>
> Is there any class dedicated to such cache (ThreadLocal with cache
> eviction or ConcurrentLinkedQueue using WeakReference ?) ?
> I think it could be very useful at the JDK level to have such feature (ie
> a generic "GC friendly"cache )
>
> Regards,
> Laurent
>

Reply via email to