Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8062128

Dramatic difference between UseConcMarkSweepGC and UseG1GC

    Details

    • Subcomponent:
      gc
    • CPU:
      x86
    • OS:
      windows_2008

      Description

      A DESCRIPTION OF THE REQUEST :
      There is a dramatic divergence in performance between ConcMarkSweep and G1 garbage collection options for large lists as per the attached example.


      JUSTIFICATION :
      Such a dramatic change in garbage collection performance can lead to improper configuration on machines, leading to decreased performance.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      ConcMarkSweep and G1 be more reasonably aligned in the program execution times. I would expect the execution times to be approximately within the same order of magnitude.
      ACTUAL -
      Notice that the first iteration of the loop takes 8.5 seconds with ConcMarkSweep, and a whopping 215 seconds with G1!


      Running on my machine with various options produces the below:

      Options: -Xmx8G -verbose:gc -XX:+UseConcMarkSweepGC

      [GC (Allocation Failure) 4197K->489K(253440K), 0.0012620 secs]
      [Full GC (Allocation Failure) 489K->475K(253440K), 0.0023629 secs]
      [GC (Allocation Failure) 332635K->358164K(515652K), 0.9329661 secs]
      [GC (CMS Initial Mark) 358164K(515652K), 0.0043027 secs]
      [GC (Allocation Failure) 428180K->463104K(533700K), 0.4298466 secs]
      [GC (Allocation Failure) 533120K->568127K(638532K), 0.4589084 secs]
      [GC (Allocation Failure) 638143K->673149K(743556K), 0.5026516 secs]
      [GC (Allocation Failure) 743165K->778172K(848580K), 0.4950669 secs]
      [GC (Allocation Failure) 848188K->883194K(953604K), 0.4370889 secs]
      [GC (Allocation Failure) 953210K->988217K(1058628K), 0.4436002 secs]
      [GC (Allocation Failure) 1058233K->1129204K(1199940K), 0.4727909 secs]
      [GC (Allocation Failure) 1199220K->1243104K(1313988K), 0.4291697 secs]
      [GC (Allocation Failure) 1313120K->1348127K(1419012K), 0.4385637 secs]
      [GC (Allocation Failure) 1418143K->1453236K(1524228K), 0.4223058 secs]
      [GC (Allocation Failure) 1523252K->1558259K(1629060K), 0.4296635 secs]
      [GC (Allocation Failure) 1628275K->1663281K(1734084K), 0.4225988 secs]
      [GC (Allocation Failure) 1733297K->1768347K(1839300K), 0.4338428 secs]
      [GC (Allocation Failure) 1838363K->1873370K(1944324K), 0.4220629 secs]
      [GC (Allocation Failure) 1876171K->1886424K(1957188K), 0.0878145 secs]
      [Full GC (Allocation Failure) 1886424K->1835652K(1957188K), 5.6155671 secs]
      [GC (CMS Initial Mark) 2237047K(3366112K), 0.0003521 secs]
      67108864|8531
      [GC (Allocation Failure) 2501508K->2605004K(3366112K), 1.1743133 secs]
      [GC (Allocation Failure) 2877644K->3100149K(3373216K), 1.4558667 secs]
      [GC (Allocation Failure) 3214657K->3269438K(3542368K), 0.8864740 secs]
      33554432|4012
      [GC (Allocation Failure) 3542078K->3582163K(3855592K), 0.8005835 secs]
      [GC (Allocation Failure) 3838444K->3924795K(4197736K), 1.3208573 secs]
      16777216|1925
      [GC (Allocation Failure) 4191172K->4170552K(4443496K), 0.9668430 secs]
      8388608|844
      4194304|393
      2097152|175
      1048576|70
      524288|29
      262144|11
      131072|5
      65536|1
      32768|1
      16384|1
      8192|2
      4096|1
      2048|1
      1024|0
      512|0
      256|0
      128|0
      64|0
      32|0
      16|0
      8|0
      4|0
      2|0




      Options: -Xmx8G -verbose:gc -XX:+UseG1GC

      [GC pause (G1 Humongous Allocation) (young) (initial-mark) 1433K->592K(256M), 0.0012598 secs]
      [GC concurrent-root-region-scan-start]
      [GC concurrent-root-region-scan-end, 0.0009750 secs]
      [GC concurrent-mark-start]
      [GC concurrent-mark-end, 0.0009256 secs]
      [GC remark, 0.0006834 secs]
      [GC cleanup 257M->257M(512M), 0.0005585 secs]
      [GC pause (G1 Evacuation Pause) (young) 270M->269M(512M), 0.0311023 secs]
      [GC pause (G1 Evacuation Pause) (young) 291M->295M(1024M), 0.0530180 secs]
      [GC pause (G1 Evacuation Pause) (young) 341M->343M(2048M), 0.1020062 secs]
      [GC pause (G1 Evacuation Pause) (young) 437M->444M(3278M), 0.2061966 secs]
      [GC pause (G1 Evacuation Pause) (young) 592M->596M(4262M), 0.3261134 secs]
      [GC pause (G1 Evacuation Pause) (young) 786M->794M(5048M), 0.4208658 secs]
      [GC pause (G1 Evacuation Pause) (young) 1018M->1021M(5678M), 0.4913003 secs]
      [GC pause (G1 Evacuation Pause) (young) 1271M->1277M(6182M), 0.5466667 secs]
      67108864|215648
      [GC pause (G1 Evacuation Pause) (young) 2061M->2064M(6584M), 1.1163806 secs]
      33554432|72415
      [GC pause (G1 Evacuation Pause) (young) 2608M->2612M(6584M), 2.0054681 secs]
      16777216|22609
      [GC pause (G1 Evacuation Pause) (young) 3026M->3031M(6584M), 1.6127237 secs]
      [GC pause (G1 Humongous Allocation) (young) (initial-mark) 3119M->3123M(6584M), 0.4395586 secs]
      [GC concurrent-root-region-scan-start]
      [GC concurrent-root-region-scan-end, 0.1803907 secs]
      [GC concurrent-mark-start]
      [GC concurrent-mark-end, 0.8080920 secs]
      [GC remark, 0.0020432 secs]
      [GC cleanup 3172M->240M(6584M), 0.0300690 secs]
      [GC concurrent-cleanup-start]
      [GC concurrent-cleanup-end, 0.2658931 secs]
      8388608|6026
      4194304|573
      2097152|195
      1048576|82
      524288|35
      262144|16
      131072|4
      65536|3
      32768|1
      16384|0
      8192|0
      4096|0
      2048|0
      1024|0
      512|0
      256|0
      128|0
      64|0
      32|0
      16|0
      8|0
      4|0
      2|0



      ---------- BEGIN SOURCE ----------
      public class DelayInducer {

          public static void main(String[] inarr) {
              final Integer numTimes = 1;
              final Integer bitSize = 26;
              final Random rand = new Random();
              List<Integer> lengths = new ArrayList<>(bitSize);
              for (int i = bitSize; i > 0; --i) {
                  lengths.add(1 << i);
              }
              for (Integer n : lengths) {
                  final List<Integer> newList = new ArrayList<>(n);
                  IntStream.range(0, n + 1).forEach((int i) -> {
                      newList.add(i);
                  });
                  Instant start = Instant.now();
                  for (int j = 0; j < numTimes; ++j) {
                      for (int i = 0; i < newList.size(); ++i) {
                          int sizeLeft = newList.size() - i;
                          int shuffleWith = rand.nextInt(sizeLeft) + i;
                          Collections.swap(newList, i, shuffleWith);
                      }
                  }
                  Duration d = Duration.between(start, Instant.now());
                  System.out.println(String.format("%d|%d", n, d.toMillis()));
              }
          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      use ConcMarkSweep

        Attachments

        1. ArraysSort.java
          7 kB
        2. jsr166.jar
          640 kB
        3. SPL4.java
          4 kB

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                webbuggrp Webbug Group
              • Votes:
                0 Vote for this issue
                Watchers:
                6 Start watching this issue

                Dates

                • Created:
                  Updated: