[OpenJDK Rasterizer] Segfault in marlin code for Java 9 ea100
Laurent Bourgès
bourges.laurent at gmail.com
Thu Feb 4 22:43:04 UTC 2016
Jim,
Jim, here are my comments:
2016-02-04 2:55 GMT+01:00 Jim Graham <james.graham at oracle.com>:
> Interesting, so this can happen with any custom Paint or Composite. Yes,
> re-entrance detection should be done.
>
FYI, I proposed a bug fix and also checked the output images are now
correct:
http://mail.openjdk.java.net/pipermail/2d-dev/2016-February/006272.html
Please also check twice AAShapePipe as it may also have problem with
reentrancy as the TileState is in thread-local storage too:
Should I also use another TileState ?
I fixed an issue with int[] abox but I eventually see another issue with
the int[] alpha if outpipe.renderPathTile() make reentrant calls too !
> Just out of curiosity - the 10% performance hit for the CLQ storage vs.
> thread-local - that was specifically only for the time it takes to retreive
> the Renderer, right? I can't imagine why the entire rendering operation
> would take 10% longer for any mechanism that retrieves a cached Renderer -
> unless perhaps it was missing the cache and allocating a new one every
> time? I would think a simple synchronized block around a small cache of
> Renderers would be nearly imperceptible compared to the amount of time
> spent inside the rendering process...
>
Let me try to explain:
In my MapBench tool, I have a very complex map [135 000 shapes]:
dc_shp_alllayers_2013-00-30-07-00-47.ser
- Marlin [TL]:
Test Threads Ops Med
Pct95 Avg StdDev Min Max FPS(med) TotalOps [ms/op]
dc_shp_alllayers_2013-00-30-07-00-47.ser 1 25 778.610
779.885 778.876 0.622 777.904 780.050 1.284 25
dc_shp_alllayers_2013-00-30-07-00-47.ser 2 50 780.596
781.677 780.532 0.733 779.091 782.623 1.281 50
dc_shp_alllayers_2013-00-30-07-00-47.ser 4 100 781.663
788.781 783.098 4.548 779.113 805.189 1.279 100
- Marlin [CLQ]:
Test Threads Ops Med
Pct95 Avg StdDev Min Max FPS(med) TotalOps [ms/op]
dc_shp_alllayers_2013-00-30-07-00-47.ser 1 25 787.245
789.810 787.370 1.556 784.139 790.589 1.270 25
dc_shp_alllayers_2013-00-30-07-00-47.ser 2 50 846.023
877.742 853.157 19.231 818.292 885.293 1.182 50
dc_shp_alllayers_2013-00-30-07-00-47.ser 4 100 826.174
851.683 831.681 12.548 814.943 871.630 1.210 100
As you can see, the 8 to 10% difference corresponds to the ratio between
total times taken to render the map [877ms vs 780ms] (on the 95th
percentile) that happens with 2 or 4 concurrent threads.
I guess:
1. threads are rendering many shapes in parallel (135k) so there is a high
pressure on the underlying ConcurrentLinkedQueue to add/remove the
RendererContext instances.
I tried also with a simple synchronized(ArrayDeque) that is slightly slower
than CLQ (high concurrency) as all threads are busy.
2. More garbage is produced as every CLQ.offer() will create a CLQ.Node as
seen with jmap -histo <pid>:
num #instances #bytes class name
----------------------------------------------
1: 3370992 107871744 java.awt.geom.Path2D$Float$CopyIterator
* 2: 3370996 80903904
java.util.concurrent.ConcurrentLinkedQueue$Node* 3: 135226
9736272 java.awt.geom.AffineTransform
4: 858 8430464 [I
5: 135309 7770696 [F
6: 135213 6490224 it.geosolutions.java2d.DrawingCommand
7: 135213 4326816 java.awt.geom.GeneralPath
8: 99122 3964880 java.awt.BasicStroke
9: 99118 3964720
it.geosolutions.java2d.SerializableBasicStroke
10: 135391 3500728 [B
11: 135213 3245112
it.geosolutions.java2d.SerializableAlphaComposite
PS: the most important garbage corresponds to the Path2D.Float.CopyIterator
instances : that could also be improved ...
Regards,
Laurent
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/graphics-rasterizer-dev/attachments/20160204/cc379dc3/attachment-0001.html>
More information about the graphics-rasterizer-dev
mailing list