CRR: 7046558 G1: concurrent marking optimizations (S)

Tony Printezis tony.printezis at oracle.com
Tue Jun 7 20:35:48 UTC 2011


Hi all,

All set thanks to Stefan and a second code review from John Cuthbertson. 
In case anyone wants to have a look, here's the updated webrev(s):

Complete:
http://cr.openjdk.java.net/~tonyp/7046558/webrev.2/webrev.all/

Change 1 (closure specialization):
http://cr.openjdk.java.net/~tonyp/7046558/webrev.2/webrev.0.G1CMOptSpecial/

Change 2 (method inlining):
http://cr.openjdk.java.net/~tonyp/7046558/webrev.2/webrev.1.G1CMOptInline/

Change 3 (misc optimizations):
http://cr.openjdk.java.net/~tonyp/7046558/webrev.2/webrev.2.G1CMOptMisc/

The only one that's changed compared to the previous version is the last 
change. I introduced and use the is_in_g1_heap() method in 
ConcurrentMark to avoid calling into the G1 heap. I also added a comment 
near the start of the claim_region() method which addresses an issue 
that John Cuthbertson brought up.

Tony

On 06/02/2011 04:25 AM, Tony Printezis wrote:
> Stefan,
>
> Thanks for the code review! Good catch about the circular dependency. 
> I re-organized things a bit: I moved scan_object() from the 
> .inline.hpp to the .cpp file (it's only called from there so it should 
> be inlined anyway) so now I don't need to include 
> g1OopClosures.inline.hpp in concurrentMark.inline.hpp.
>
> Here's the updated webrev:
>
> All included:
> http://cr.openjdk.java.net/~tonyp/7046558/webrev.1/webrev.all/
>
> Change 1:
> http://cr.openjdk.java.net/~tonyp/7046558/webrev.1/webrev.G1CMOptSpecial/
>
> Change 2:
> http://cr.openjdk.java.net/~tonyp/7046558/webrev.1/webrev.G1CMOptInline/
>
> Change 3:
> http://cr.openjdk.java.net/~tonyp/7046558/webrev.1/webrev.G1CMOptMisc/
>
> Tony
>
> On 6/1/2011 9:28 AM, Stefan Karlsson wrote:
>> Note that you have introduced a circular dependency between the 
>> files: concurrentMark.inline.hpp and g1OopClosures.inline.hpp.
>>
>> Otherwise, this looks good.
>>
>> StefanK
>>
>> On 06/01/2011 02:19 PM, Tony Printezis wrote:
>>> Hi,
>>>
>>> Could I please have a couple of code reviews for the following change:
>>>
>>> http://cr.openjdk.java.net/~tonyp/7046558/webrev.0/webrev.all/
>>>
>>> It includes a few optimizations in the concurrent marking code. The 
>>> fact that webrev shows that almost 400 lines of code have been 
>>> changed is actually a bit misleading given that the changes are 
>>> actually relatively simple. Here's a breakdown to make your life a 
>>> bit easier:
>>>
>>> Change 1: Specialize the G1CMOopClosure to avoid the virtual call to 
>>> do_oop() every time we visit an oop during marking (the closure used 
>>> to be called CMOopClosure, I prefixed its name with G1 since it's 
>>> been moved out of the concurrentMark.cpp file). Note: I didn't 
>>> change much code here, just moved things around.
>>>
>>> http://cr.openjdk.java.net/~tonyp/7046558/webrev.0/webrev.G1CMOptSpecial/ 
>>>
>>>
>>> Change 2 (builds on Change 1): Move methods 
>>> CM::deal_with_reference() and CM::push() to the .inline.hpp file, 
>>> without changing them, to make sure they get inlined, as they are 
>>> called from the fast path. You can either check line by line that 
>>> they are unchanged. Or you can take my word for it. :-)
>>>
>>> http://cr.openjdk.java.net/~tonyp/7046558/webrev.0/webrev.G1CMOptInline/ 
>>>
>>>
>>> Change 3 (builds on Change 2): A few minor performance improvements 
>>> here and there (plus a couple of cosmetic changes to introduce some 
>>> missing curly brackets).
>>>
>>> http://cr.openjdk.java.net/~tonyp/7046558/webrev.0/webrev.G1CMOptMisc/
>>>
>>> I kept track of the separate patches to be able to evaluate them 
>>> separately so I thought I'd present the changes separately to make 
>>> the code review process a bit easier. I will of course push them as 
>>> a single changeset.
>>>
>>> I was not quite sure how to evaluate the performance impact of the 
>>> changes given that marking runs concurrently and not always in a 
>>> deterministic fashion (from a performance point-of-view!!!). So I 
>>> did the evaluation using collect and analyze. When looking at 
>>> time-based profiles, I see that the above changes decrease the time 
>>> we spend in the marking code (i.e., how long we spend in the 
>>> CMConcurrentMarkingTask::work(int i) method) by between 7%-10%. The 
>>> improvement is similar when looking at cycle counts. And I also see 
>>> a nice decrease in L2 cache misses. Each separate Change does 
>>> improve on the previous one, but the Change with the biggest impact 
>>> was 1.
>>>
>>> Tony
>>>
>>



More information about the hotspot-gc-dev mailing list