test/hotspot/jtreg/gc/g1/mixedgc/TestOldGenCollectionUsage.java
author phh
Thu, 24 Jan 2019 10:57:31 -0800
changeset 53475 6130409b923e
parent 51726 a3989376ade2
child 53523 4c5184c56dc2
permissions -rw-r--r--
8217520: Remove vm.opt.MaxGCPauseMillis == "null" from TestOldGenCollectionUsage.java Summary: Remove the corresponding @requires line Reviewed-by: tschatzl
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50635
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     1
/*
53475
6130409b923e 8217520: Remove vm.opt.MaxGCPauseMillis == "null" from TestOldGenCollectionUsage.java
phh
parents: 51726
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
50635
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     4
 *
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     7
 * published by the Free Software Foundation.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     8
 *
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    13
 * accompanied this code).
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    14
 *
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    18
 *
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    21
 * questions.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    22
 */
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    23
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    24
/*
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    25
 * @test TestOldGenCollectionUsage.java
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    26
 * @bug 8195115
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    27
 * @summary G1 Old Gen's CollectionUsage.used is zero after mixed GC which is incorrect
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    28
 * @key gc
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    29
 * @requires vm.gc.G1
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    30
 * @library /test/lib
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    31
 * @modules java.base/jdk.internal.misc
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    32
 * @modules java.management
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    33
 * @build sun.hotspot.WhiteBox
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    34
 * @run driver ClassFileInstaller sun.hotspot.WhiteBox
51726
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
    35
 * @run main/othervm -Xbootclasspath/a:. -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -verbose:gc -XX:SurvivorRatio=1 -Xmx14m -Xms14m -XX:MaxTenuringThreshold=1 -XX:InitiatingHeapOccupancyPercent=100 -XX:-G1UseAdaptiveIHOP -XX:G1MixedGCCountTarget=4 -XX:MaxGCPauseMillis=30000 -XX:G1HeapRegionSize=1m -XX:G1HeapWastePercent=0 -XX:G1MixedGCLiveThresholdPercent=100 TestOldGenCollectionUsage
50635
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    36
 */
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    37
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    38
import jdk.test.lib.Asserts;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    39
import sun.hotspot.WhiteBox;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    40
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    41
import java.util.ArrayList;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    42
import java.util.List;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    43
import java.util.Collections;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    44
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    45
import java.lang.management.*;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    46
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    47
// 8195115 says that for the "G1 Old Gen" MemoryPool, CollectionUsage.used
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    48
// is zero for G1 after a mixed collection, which is incorrect.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    49
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    50
public class TestOldGenCollectionUsage {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    51
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    52
    private String poolName = "G1 Old Gen";
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    53
    private String collectorName = "G1 Young Generation";
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    54
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    55
    public static void main(String [] args) throws Exception {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    56
        TestOldGenCollectionUsage t = new TestOldGenCollectionUsage();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    57
        t.run();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    58
    }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    59
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    60
    public TestOldGenCollectionUsage() {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    61
        System.out.println("Monitor G1 Old Gen pool with G1 Young Generation collector.");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    62
    }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    63
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    64
    public void run() {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    65
        // Find memory pool and collector
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    66
        List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    67
        MemoryPoolMXBean pool = null;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    68
        boolean foundPool = false;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    69
        for (int i = 0; i < pools.size(); i++) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    70
            pool = pools.get(i);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    71
            String name = pool.getName();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    72
            if (name.contains(poolName)) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    73
                System.out.println("Found pool: " + name);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    74
                foundPool = true;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    75
                break;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    76
            }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    77
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    78
        if (!foundPool) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    79
            throw new RuntimeException(poolName + " not found, test with -XX:+UseG1GC");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    80
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    81
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    82
        List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    83
        GarbageCollectorMXBean collector = null;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    84
        boolean foundCollector = false;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    85
        for (int i = 0; i < collectors.size(); i++) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    86
            collector = collectors.get(i);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    87
            String name = collector.getName();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    88
            if (name.contains(collectorName)) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    89
                System.out.println("Found collector: " + name);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    90
                foundCollector = true;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    91
                break;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    92
            }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    93
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    94
        if (!foundCollector) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    95
            throw new RuntimeException(collectorName + " not found, test with -XX:+UseG1GC");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    96
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    97
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    98
        MixedGCProvoker gcProvoker = new MixedGCProvoker();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
    99
        gcProvoker.allocateOldObjects();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   100
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   101
        // Verify no non-zero result was stored
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   102
        long usage = pool.getCollectionUsage().getUsed();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   103
        System.out.println(poolName + ": usage after GC = " + usage);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   104
        if (usage > 0) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   105
            throw new RuntimeException("Premature mixed collections(s)");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   106
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   107
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   108
        // Verify that collections were done
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   109
        long collectionCount = collector.getCollectionCount();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   110
        System.out.println(collectorName + ": collection count = "
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   111
                           + collectionCount);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   112
        long collectionTime = collector.getCollectionTime();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   113
        System.out.println(collectorName + ": collection time  = "
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   114
                           + collectionTime);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   115
        if (collectionCount <= 0) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   116
            throw new RuntimeException("Collection count <= 0");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   117
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   118
        if (collectionTime <= 0) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   119
            throw new RuntimeException("Collector has not run");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   120
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   121
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   122
        gcProvoker.provokeMixedGC();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   123
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   124
        usage = pool.getCollectionUsage().getUsed();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   125
        System.out.println(poolName + ": usage after GC = " + usage);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   126
        if (usage <= 0) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   127
            throw new RuntimeException(poolName + " found with zero usage");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   128
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   129
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   130
        long newCollectionCount = collector.getCollectionCount();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   131
        System.out.println(collectorName + ": collection count = "
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   132
                           + newCollectionCount);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   133
        long newCollectionTime = collector.getCollectionTime();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   134
        System.out.println(collectorName + ": collection time  = "
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   135
                           + newCollectionTime);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   136
        if (newCollectionCount <= collectionCount) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   137
            throw new RuntimeException("No new collection");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   138
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   139
        if (newCollectionTime <= collectionTime) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   140
            throw new RuntimeException("Collector has not run some more");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   141
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   142
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   143
        System.out.println("Test passed.");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   144
    }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   145
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   146
    /**
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   147
     * Utility class to guarantee a mixed GC. The class allocates several arrays and
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   148
     * promotes them to the oldgen. After that it tries to provoke mixed GC by
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   149
     * allocating new objects.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   150
     *
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   151
     * The necessary condition for guaranteed mixed GC is running MixedGCProvoker is
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   152
     * running in VM with the following flags: -XX:MaxTenuringThreshold=1 -Xms12M
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   153
     * -Xmx12M -XX:G1MixedGCLiveThresholdPercent=100 -XX:G1HeapWastePercent=0
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   154
     * -XX:G1HeapRegionSize=1m
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   155
     */
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   156
    public class MixedGCProvoker {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   157
        private final WhiteBox WB = WhiteBox.getWhiteBox();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   158
        private final List<byte[]> liveOldObjects = new ArrayList<>();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   159
        private final List<byte[]> newObjects = new ArrayList<>();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   160
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   161
        public static final int ALLOCATION_SIZE = 20000;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   162
        public static final int ALLOCATION_COUNT = 15;
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   163
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   164
        public void allocateOldObjects() {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   165
            List<byte[]> deadOldObjects = new ArrayList<>();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   166
            // Allocates buffer and promotes it to the old gen. Mix live and dead old
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   167
            // objects
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   168
            for (int i = 0; i < ALLOCATION_COUNT; ++i) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   169
                liveOldObjects.add(new byte[ALLOCATION_SIZE * 5]);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   170
                deadOldObjects.add(new byte[ALLOCATION_SIZE * 5]);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   171
            }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   172
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   173
            // Do two young collections, MaxTenuringThreshold=1 will force promotion.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   174
            // G1HeapRegionSize=1m guarantees that old gen regions will be filled.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   175
            WB.youngGC();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   176
            WB.youngGC();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   177
            // Check it is promoted & keep alive
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   178
            Asserts.assertTrue(WB.isObjectInOldGen(liveOldObjects),
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   179
                               "List of the objects is suppose to be in OldGen");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   180
            Asserts.assertTrue(WB.isObjectInOldGen(deadOldObjects),
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   181
                               "List of the objects is suppose to be in OldGen");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   182
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   183
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   184
        /**
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   185
         * Waits until Concurent Mark Cycle finishes
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   186
         * @param wb  Whitebox instance
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   187
         * @param sleepTime sleep time
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   188
         */
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   189
        private void waitTillCMCFinished(int sleepTime) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   190
            while (WB.g1InConcurrentMark()) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   191
                if (sleepTime > -1) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   192
                    try {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   193
                        Thread.sleep(sleepTime);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   194
                    } catch (InterruptedException e) {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   195
                        System.out.println("Got InterruptedException while waiting for ConcMarkCycle to finish");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   196
                    }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   197
                }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   198
            }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   199
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   200
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   201
        public void provokeMixedGC() {
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   202
            waitTillCMCFinished(0);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   203
            WB.g1StartConcMarkCycle();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   204
            waitTillCMCFinished(0);
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   205
            WB.youngGC();
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   206
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   207
            System.out.println("Allocating new objects to provoke mixed GC");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   208
            // Provoke a mixed collection. G1MixedGCLiveThresholdPercent=100
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   209
            // guarantees that full old gen regions will be included.
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   210
            for (int i = 0; i < (ALLOCATION_COUNT * 20); i++) {
51726
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   211
                try {
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   212
                    newObjects.add(new byte[ALLOCATION_SIZE]);
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   213
                } catch (OutOfMemoryError e) {
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   214
                    newObjects.clear();
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   215
                    WB.youngGC();
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   216
                    WB.youngGC();
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   217
                    System.out.println("OutOfMemoryError is reported, stop allocating new objects");
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   218
                    break;
a3989376ade2 8210193: [TESTBUG]gc/g1/mixedgc/TestOldGenCollectionUsage.java fails intermittently with OutOfMemoryError in CDS mode.
jiangli
parents: 50635
diff changeset
   219
                }
50635
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   220
            }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   221
            // check that liveOldObjects still alive
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   222
            Asserts.assertTrue(WB.isObjectInOldGen(liveOldObjects),
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   223
                               "List of the objects is suppose to be in OldGen");
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   224
        }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   225
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   226
    }
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   227
5d3c5af82654 8195115: G1 Old Gen MemoryPool CollectionUsage.used values don't reflect mixed GC results
phh
parents:
diff changeset
   228
}