| /* |
| * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package jdk.jfr.cmd; |
| |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.util.Arrays; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import jdk.jfr.Configuration; |
| import jdk.jfr.Event; |
| import jdk.jfr.Recording; |
| import jdk.test.lib.process.OutputAnalyzer; |
| import jdk.test.lib.process.ProcessTools;; |
| |
| final class ExecuteHelper { |
| |
| public static Object[] array; |
| |
| static class CustomEvent extends Event { |
| int intValue; |
| long longValue; |
| double doubliValue; |
| float floatValue; |
| String stringValue; |
| Short shortValue; |
| boolean booleanValue; |
| char charValue; |
| double trickyDouble; |
| } |
| |
| public static OutputAnalyzer run(String... args) { |
| String[] array = new String[args.length + 1]; |
| System.arraycopy(args, 0, array, 1, args.length); |
| array[0] = "jdk.jfr.internal.cmd.Execute"; |
| try { |
| return ProcessTools.executeTestJava(array); |
| } catch (Exception e) { |
| String message = String.format("Caught exception while executing '%s'", Arrays.asList(array)); |
| throw new RuntimeException(message, e); |
| } |
| } |
| |
| public static void emitCustomEvents() { |
| // Custom events with potentially tricky values |
| CustomEvent event1 = new CustomEvent(); |
| event1.trickyDouble = Double.NaN; |
| event1.intValue = Integer.MIN_VALUE; |
| event1.longValue = Long.MIN_VALUE; |
| event1.doubliValue = Double.MIN_VALUE; |
| event1.floatValue = Float.MIN_VALUE; |
| StringBuilder sb = new StringBuilder(); |
| for (int i = 0; i < 512; i++) { |
| sb.append((char) i); |
| } |
| sb.append("\u2324"); |
| event1.stringValue = sb.toString(); |
| event1.shortValue = Short.MIN_VALUE; |
| event1.booleanValue = true; |
| event1.booleanValue = false; |
| event1.charValue = '\b'; |
| event1.commit(); |
| |
| CustomEvent event2 = new CustomEvent(); |
| event2.trickyDouble = Double.NEGATIVE_INFINITY; |
| event2.intValue = Integer.MAX_VALUE; |
| event2.longValue = Long.MAX_VALUE; |
| event2.doubliValue = Double.MAX_VALUE; |
| event2.floatValue = Float.MAX_VALUE; |
| event2.stringValue = null; |
| event2.shortValue = Short.MAX_VALUE; |
| event2.booleanValue = false; |
| event2.charValue = 0; |
| event2.commit(); |
| } |
| |
| public static Path createProfilingRecording() throws Exception { |
| Path file = Files.createTempFile("recording", ".jfr"); |
| // Create a recording with some data |
| try (Recording r = new Recording(Configuration.getConfiguration("profile"))) { |
| r.start(); |
| |
| // Allocation event |
| array = new Object[1000000]; |
| array = null; |
| |
| // Class loading event etc |
| provokeClassLoading(); |
| |
| // GC events |
| System.gc(); |
| |
| // ExecutionSample |
| long t = System.currentTimeMillis(); |
| while (System.currentTimeMillis() - t < 50) { |
| // do nothing |
| } |
| |
| // Other periodic events, i.e CPU load |
| Thread.sleep(1000); |
| |
| r.stop(); |
| r.dump(file); |
| } |
| |
| return file; |
| } |
| |
| private static void provokeClassLoading() { |
| // Matching a string with regexp |
| // is expected to load some classes and generate some VM events |
| Pattern p = Pattern.compile("a*b"); |
| Matcher m = p.matcher("aaaaab"); |
| m.matches(); |
| } |
| } |