--- /dev/null 2018-03-08 15:11:46.002676589 -0800 +++ new/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorVMEventsTest.java 2018-04-11 14:33:24.737154416 -0700 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018, Google 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. + * + * 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 MyPackage; + +import java.util.ArrayList; +import java.util.List; + +/** + * @test + * @summary Verifies that when the VM event is sent, no sampled events are collected. + * @build Frame HeapMonitor + * @compile HeapMonitorVMEventsTest.java + * @run main/othervm/native -agentlib:HeapMonitorTest MyPackage.HeapMonitorVMEventsTest + */ + +public class HeapMonitorVMEventsTest implements Cloneable { + private static native boolean enableVMEvents(); + private static native boolean vmStorageContained(Frame[] frames); + private static native int sampledEvents(); + private static native int vmEvents(); + private static Object[] array; + + private static void cloneObjects(int iterations) { + HeapMonitorVMEventsTest object = new HeapMonitorVMEventsTest(); + for (int i = 0; i < iterations; i++) { + try { + array[i] = object.clone(); + } catch (Exception e) { + // Nop. + } + } + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public static void main(String[] args) { + final int iterations = 1 << 10; + array = new Object[iterations]; + + if (!HeapMonitor.eventStorageIsEmpty()) { + throw new RuntimeException("Storage is not empty at test start..."); + } + + HeapMonitor.enableSamplingEvents(); + HeapMonitor.setSamplingRate(0); + // Heat up the tlab to start sampling at the right rate. + for (int i = 0; i < 100; i++) { + cloneObjects(iterations); + } + + HeapMonitor.resetEventStorage(); + cloneObjects(iterations); + + int onlySampleCount = sampledEvents(); + + HeapMonitor.disableSamplingEvents(); + enableVMEvents(); + HeapMonitor.resetEventStorage(); + if (!HeapMonitor.eventStorageIsEmpty()) { + throw new RuntimeException("Storage is not empty after reset."); + } + + HeapMonitor.enableSamplingEvents(); + cloneObjects(iterations); + + int sampleCount = sampledEvents(); + int vmCount = vmEvents(); + + double diff = Math.abs(onlySampleCount - sampleCount - vmCount) * 100; + diff /= onlySampleCount; + + // Accept a 10% error rate. + if (diff > 10) { + throw new RuntimeException("Error rate is over the accepted rate."); + } + } +}