RFR: 8254758: Change G1ServiceThread to be task based [v6]

Stefan Johansson sjohanss at openjdk.java.net
Mon Nov 2 13:07:26 UTC 2020

> Please review this enhancement to make `G1ServiceThread` task based. This thread has evolved from having a single responsibility to do more things. And there are plans to add more to it. To make this easier and to allow different tasks to run at different intervals this change adds a simple task mechanism to the service thread.
> The idea is that the service thread keeps a list of `G1ServiceTask`-objects that are ordered by when they should execute. When no tasks are ready to be run the service thread check how far into the future the next task is scheduled and sleeps/waits for that duration. If a new task is added while the thread is waiting it will be woken up to check for ready tasks. 
> There are currently two tasks in the list. They have been extracted from the old service thread into the tasks: `G1PeriodicGCTask` and `G1RemSetSamplingTask`. These are more or less identical to the old code, but in the form of tasks. The only difference is that `G1PeriodicGCTask` no longer need to keep track of the last attempt, since it will be rescheduled with the correct interval. 
> To reschedule a task is to update the time when it should be executed next and adding it back to the list. This insertion is O(n) and it should be fine since the expected number of tasks handled by the service thread is low. If a task don't want to be rescheduled it can set a negative timeout and that will cause the task to be dropped from the list. There are currently no such tasks and adding such tasks come with the responsibility of making sure resources are taken care of when the task is no longer active.
> I've added a gtest to do some basic VM-testing and apart from a lot of local testing I've run mach5 tier 1-4 a few times with good results.
> I have created a few follow up tasks to look at moving the current tasks to more appropriate locations and also updated a few old service thread related tasks with the label: [`gc-g1-service-thread`](https://bugs.openjdk.java.net/issues/?jql=labels%20%3D%20gc-g1-service-thread)

Stefan Johansson has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 13 additional commits since the last revision:

 - Merge branch 'master' into 8254758
 - Albert and Thomas review
 - Merge branch 'master' into 8254758
 - Aditional gtest and assert
 - Review tschatzl: Explicit reschedule call in task
 - Review tschatzl: Use elapsed_counter
 - Review tschatzl: Spelling and such
 - Self review: Test cleanup
 - Albert review: Remove run_tasks and _ms post-fix
 - Ivan and Albert review
 - ... and 3 more: https://git.openjdk.java.net/jdk/compare/abb80478...94689f0a


  - all: https://git.openjdk.java.net/jdk/pull/734/files
  - new: https://git.openjdk.java.net/jdk/pull/734/files/c39aa701..94689f0a

 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=734&range=05
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=734&range=04-05

  Stats: 79680 lines in 1179 files changed: 58226 ins; 15780 del; 5674 mod
  Patch: https://git.openjdk.java.net/jdk/pull/734.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/734/head:pull/734

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

More information about the hotspot-gc-dev mailing list