RFR: 8260267: ZGC: Reduce mark stack usage [v5]

Per Liden pliden at openjdk.java.net
Wed May 19 08:43:43 UTC 2021


On Wed, 19 May 2021 08:39:07 GMT, Per Liden <pliden at openjdk.org> wrote:

>> Under some conditions, striped marking can cause excessive mark stack memory usage. For example, when the object graph has one or more N:1 relations ships, where N is a large number.
>> 
>> To avoid pushing mark stack entries to already marked objects, and thus reduce mark stack memory usage, this patch adds does two things:
>>  * GC threads will under some conditions mark the object before pushing, else (if the condition to mark failed)
>>  * GC threads will check if the object is already marked before pushing.
>> 
>> The conditions for marking before pushing is:
>>  * We are using a single stripe, in which cases striped marking is essentially disabled anyway.
>>  * We see excessive mark stack usage. In other words, the mark stack allocator indicates "high usage".
>> 
>> To make this easier to review, this PR contains two commits:
>>  * `ZGC: Reduce mark stack usage` - This patch adds the infrastructure needed to mark before push, but only does so if we are using a single stripe.
>>  * `ZGC: Mark before push if mark stack usage is high` - This patch adds the condition to mark before push if the mark stack allocator indicates "high usage". As a bonus, this patch will also uncommit memory used for mark stacks after the marking has completed.
>> 
>> Testing:
>>  * Tier1-7
>>  * SPECjbb2015, score and marking times unaffected
>>  * casparcwang at tencent.com reports that this patch, in combination with PR #3455, solves the problem for Apache Zookeeper.
>
> Per Liden has updated the pull request incrementally with three additional commits since the last revision:
> 
>  - Print mark stack memory usage
>  - Shrink to currently used
>  - Always mark before push

Updated PR with the following:
1) Always mark before push. After additional testing and some discussions, it turns out that the overhead of marking before pushing it's that high. Concurrent Mark times increase by about 1% or so on SPECjbb2015 and BigRamTester. So let's keep thing simple, and avoid introducing that arbitrary "high usage" threshold.
2) Only uncommit the part of the mark stack space that hasn't been used.
3) Print mark stack memory usage in the GC log.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3460



More information about the hotspot-gc-dev mailing list