test/jdk/jdk/jfr/event/gc/stacktrace/AllocationStackTrace.java
author lkorinth
Wed, 13 Nov 2019 11:37:29 +0100
changeset 59053 ba6c248cae19
parent 50113 caf115bb98ad
permissions -rw-r--r--
8232365: Implementation for JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector Reviewed-by: kbarrett, tschatzl, erikj, coleenp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
59053
ba6c248cae19 8232365: Implementation for JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
lkorinth
parents: 50113
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
package jdk.jfr.event.gc.stacktrace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
import javax.management.MBeanServer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.lang.management.ManagementFactory;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import com.sun.management.GarbageCollectorMXBean;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import jdk.jfr.Recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import jdk.jfr.consumer.RecordedEvent;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import jdk.jfr.consumer.RecordedStackTrace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import jdk.jfr.consumer.RecordedFrame;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import jdk.jfr.consumer.RecordedMethod;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import jdk.jfr.consumer.RecordedThread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import jdk.test.lib.jfr.EventNames;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import jdk.test.lib.jfr.Events;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import java.net.URL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import java.net.URLClassLoader;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import java.lang.reflect.InvocationHandler;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import java.lang.reflect.Method;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import java.lang.reflect.Proxy;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
abstract class MemoryAllocator {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
    public static final int KB = 1024;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
    public static final int MB = 1024 * KB;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
    public static Object garbage = null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
    abstract public void allocate();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
    public void clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
        garbage = null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
class EdenMemoryAllocator extends MemoryAllocator {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
    public void allocate() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
        garbage = new byte[10 * KB];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
class HumongousMemoryAllocator extends MemoryAllocator {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
    public void allocate() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
        garbage = new byte[5 * MB];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
 * Attempts to fill up young gen and allocate in old gen
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
class OldGenMemoryAllocator extends MemoryAllocator {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
    private List<byte[]> list = new ArrayList<byte[]>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
    private int counter = 6000;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
    public void allocate() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
        if (counter-- > 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
            list.add(new byte[10 * KB]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
        } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
            list = new ArrayList<byte[]>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
            counter = 6000;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        garbage = list;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
    public void clear(){
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        list = null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
        super.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
class MetaspaceMemoryAllocator extends MemoryAllocator {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
    private static int counter = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
     * Imitates class loading. Each invocation of this method causes a new class
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
     * loader object is created and a new class is loaded by this class loader.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
     * Method throws OOM when run out of memory.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
    static protected void loadNewClass() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
            String jarUrl = "file:" + (counter++) + ".jar";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
            URL[] urls = new URL[]{new URL(jarUrl)};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
            URLClassLoader cl = new URLClassLoader(urls);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
            Proxy.newProxyInstance(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
                    cl,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
                    new Class[]{Foo.class},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
                    new FooInvocationHandler(new FooBar()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
        } catch (java.net.MalformedURLException badThing) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
            // should never occur
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
            System.err.println("Unexpected error: " + badThing);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
            throw new RuntimeException(badThing);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    public void allocate() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
            loadNewClass();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
        } catch (OutOfMemoryError e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            /* empty */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
    public static interface Foo {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
    public static class FooBar implements Foo {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
    static class FooInvocationHandler implements InvocationHandler {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
        private final Foo foo;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        FooInvocationHandler(Foo foo) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
            this.foo = foo;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
            return method.invoke(foo, args);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
 * Utility class to peform JFR recording, GC provocation/detection and
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
 * stacktrace verification for related JFR events
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
public class AllocationStackTrace {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
     * Tests event stacktrace for young GC if -XX:+UseSerialGC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
    public static void testDefNewAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
        GarbageCollectorMXBean bean = garbageCollectorMXBean("Copy");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
        MemoryAllocator memory = new EdenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testDefNewAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
     * Tests event stacktrace for old GC if -XX:+UseSerialGC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
    public static void testMarkSweepCompactAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
        GarbageCollectorMXBean bean = garbageCollectorMXBean("MarkSweepCompact");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
        MemoryAllocator memory = new OldGenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testMarkSweepCompactAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
     * Tests event stacktrace during metaspace GC threshold if -XX:+UseSerialGC
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
     * is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    public static void testMetaspaceSerialGCAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        GarbageCollectorMXBean bean = garbageCollectorMXBean("MarkSweepCompact");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
        MemoryAllocator memory = new MetaspaceMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testMetaspaceSerialGCAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
     * Tests event stacktrace for young GC if -XX:+UseParallelGC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
    public static void testParallelScavengeAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
        GarbageCollectorMXBean bean = garbageCollectorMXBean("PS Scavenge");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
        MemoryAllocator memory = new EdenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testParallelScavengeAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
     * Tests event stacktrace for old GC if -XX:+UseParallelGC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
    public static void testParallelMarkSweepAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
        GarbageCollectorMXBean bean = garbageCollectorMXBean("PS MarkSweep");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        MemoryAllocator memory = new OldGenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testParallelMarkSweepAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
     * Tests event stacktrace during metaspace GC threshold if
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
     * -XX:+UseParallelGC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
    public static void testMetaspaceParallelGCAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
        GarbageCollectorMXBean bean = garbageCollectorMXBean("PS MarkSweep");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
        MemoryAllocator memory = new MetaspaceMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testMetaspaceParallelGCAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
     * Tests event stacktrace for young GC if -XX:+UseG1GC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
    public static void testG1YoungAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        GarbageCollectorMXBean bean = garbageCollectorMXBean("G1 Young Generation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
        MemoryAllocator memory = new EdenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testG1YoungAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
     * Tests event stacktrace for old GC if -XX:+UseG1GC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
    public static void testG1OldAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
        GarbageCollectorMXBean bean = garbageCollectorMXBean("G1 Old Generation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
        MemoryAllocator memory = new OldGenMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testG1OldAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
     * Tests event stacktrace during metaspace GC threshold if -XX:+UseG1GC is
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
     * used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
    public static void testMetaspaceG1GCAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
        GarbageCollectorMXBean bean = garbageCollectorMXBean("G1 Young Generation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
        MemoryAllocator memory = new MetaspaceMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testMetaspaceG1GCAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
     * Tests event stacktrace for GC caused by humongous allocations if
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
     * -XX:+UseG1GC is used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    public static void testG1HumonAllocEvent() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
        // G1 tries to reclaim humongous objects at every young collection
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
        // after doing a conservative estimate of its liveness
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
        GarbageCollectorMXBean bean = garbageCollectorMXBean("G1 Young Generation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
        MemoryAllocator memory = new HumongousMemoryAllocator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
        String[] expectedStack = new String[]{
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testAllocEvent",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
            "jdk.jfr.event.gc.stacktrace.AllocationStackTrace.testG1HumonAllocEvent"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
        };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
        testAllocEvent(bean, memory, expectedStack);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
    private static GarbageCollectorMXBean garbageCollectorMXBean(String name) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
        GarbageCollectorMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
                server, "java.lang:type=GarbageCollector,name=" + name, GarbageCollectorMXBean.class);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
        return bean;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
     * Performs JFR recording, GC provocation/detection and stacktrace
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
     * verification for JFR event. In case of verification failure
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
     * repeats several times.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
     * @param bean MX bean for desired GC
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
     * @param memory allocator for desired type of allocations
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
     * @param expectedStack array of expected frames
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
    private static void testAllocEvent(GarbageCollectorMXBean bean, MemoryAllocator memory, String[] expectedStack) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
        // The test checks the stacktrace of events and expects all the events are fired
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
        // in the current thread. But compilation may also trigger GC.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
        // So to filter out such cases the test performs several iterations and expects
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
        // that the memory allocations made by the test will produce the desired JFR event.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
        final int iterations = 5;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
        for (int i = 0; i < iterations; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
            if (allocAndCheck(bean, memory, expectedStack)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
                return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
                System.out.println("Attempt: " + i + " out of " + iterations+": no matching stack trace found.");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
            memory.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
        throw new AssertionError("No matching stack trace found");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
     * Performs JFR recording, GC provocation/detection and stacktrace
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
     * verification for JFR event.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
     * @param bean MX bean for desired GC
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
     * @param memory allocator for desired type of allocations
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
     * @param expectedStack array of expected frames
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
     * @throws Exception
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
    private static boolean allocAndCheck(GarbageCollectorMXBean bean, MemoryAllocator memory,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
            String[] expectedStack) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
        String threadName = Thread.currentThread().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
        String event = EventNames.AllocationRequiringGC;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
        Recording r = new Recording();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
        r.enable(event).withStackTrace();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
        r.start();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
        long prevCollectionCount = bean.getCollectionCount();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
        long collectionCount = -1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
        long iterationCount = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
        do {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
            memory.allocate();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
            collectionCount = bean.getCollectionCount();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
            iterationCount++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
        } while (collectionCount == prevCollectionCount);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
        System.out.println("Allocation num: " + iterationCount);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
        System.out.println("GC detected: " + collectionCount);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
        r.stop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
        List<RecordedEvent> events = Events.fromRecording(r);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
        System.out.println("JFR GC events found: " + events.size());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
        // Find any event that matched the expected stack trace
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
        for (RecordedEvent e : events) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
            System.out.println("Event: " + e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
            RecordedThread thread = e.getThread();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
            String eventThreadName = thread.getJavaName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
            if (!threadName.equals(eventThreadName)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
                continue;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
            if (matchingStackTrace(e.getStackTrace(), expectedStack)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
                return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
    private static boolean matchingStackTrace(RecordedStackTrace stack, String[] expectedStack) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
        if (stack == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
            return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
        List<RecordedFrame> frames = stack.getFrames();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
        int pos = findFramePos(frames, expectedStack[0]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
        if (pos == -1) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
            return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
        for (String expectedFrame : expectedStack) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
            RecordedFrame f = frames.get(pos++);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
            String frame = frameToString(f);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
            if (!frame.equals(expectedFrame)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
                return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
        return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
    private static int findFramePos(List<RecordedFrame> frames, String frame) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
        int pos = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
        for (RecordedFrame f : frames) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
            if (frame.equals(frameToString(f))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
                return pos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   438
            pos++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   439
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   440
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   441
        return -1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   442
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   443
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   444
    private static String frameToString(RecordedFrame f) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
        RecordedMethod m = f.getMethod();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
        String methodName = m.getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
        String className = m.getType().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   448
        return className + "." + methodName;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   449
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
}