that is CPU time. In general, the name concurrent is there for a reason. Let's see that via an example:
public class Del {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
while (true) {
map.put(new Random().toString(), new Random().nextInt());
}
}
}
And invoke it via:
java -Xms50M -Xmx50M "-Xlog:heap*=debug" "-Xlog:gc*=debug" Del.java
In my particular run, the relevant to your question logging starts at this line:
....
[0.667s][info ][gc ] GC(11) Concurrent Mark Cycle
....
[0.668s][info ][gc,marking] GC(11) Concurrent Mark From Roots
....
So GC says, OK time to start a "concurrent mark". Notice that is already knows the roots (concurrent marking has to start from somewhere, after all). The root knowledge (where the roots are) was computed in the previous GC cycle.
Then look at where that GC(11) cycle continues:
[0.739s][info ][gc ] GC(22) Pause Young (Normal) (G1 Evacuation Pause) 43M->42M(50M) 4.566ms
[0.739s][info ][gc,cpu ] GC(22) User=0.01s Sys=0.00s Real=0.00s
[0.739s][debug][gc,ref ] GC(11) Preclean WeakReferences 4.713ms
...
[0.739s][info ][gc,start] GC(11) Pause Remark
Notice that there were other 11 gc cycles (22 -> 11), while this concurrent one was executing.
I'd like also to point you to this log:
[0.739s][info ][gc,start] GC(11) Pause Remark
This is a remark phase, some attribute this to concurrent phase, which is a STW phase; but notice that G1 track it's time individually.