1 /* 2 * Copyright (c) 2018, Red Hat, Inc. All rights reserved. 3 * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 /* @test id=aggressive-verify 27 * @summary Test JNI Global Refs with Shenandoah 28 * @requires vm.gc.Shenandoah 29 * 30 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions 31 * -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive 32 * -XX:+ShenandoahVerify 33 * TestJNIGlobalRefs 34 */ 35 36 /* @test id=aggressive 37 * @summary Test JNI Global Refs with Shenandoah 38 * @requires vm.gc.Shenandoah 39 * 40 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions 41 * -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive 42 * TestJNIGlobalRefs 43 */ 44 45 /* @test id=generational-verify 46 * @summary Test JNI Global Refs with Shenandoah 47 * @requires vm.gc.Shenandoah 48 * 49 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions 50 * -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational 51 * -XX:+ShenandoahVerify 52 * TestJNIGlobalRefs 53 */ 54 55 /* @test id=generational 56 * @summary Test JNI Global Refs with Shenandoah 57 * @requires vm.gc.Shenandoah 58 * 59 * @run main/othervm/native -Xmx1g -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions 60 * -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational 61 * TestJNIGlobalRefs 62 */ 63 64 import java.util.Arrays; 65 import java.util.Random; 66 67 public class TestJNIGlobalRefs { 68 static { 69 System.loadLibrary("TestJNIGlobalRefs"); 70 } 71 72 private static final long TIME_NSEC = 120L * 1_000_000_000L; 73 private static final int ARRAY_SIZE = 10000; 74 75 private static native void makeGlobalRef(Object o); 76 private static native void makeWeakGlobalRef(Object o); 77 private static native Object readGlobalRef(); 78 private static native Object readWeakGlobalRef(); 79 80 public static void main(String[] args) throws Throwable { 81 seedGlobalRef(); 82 seedWeakGlobalRef(); 83 long startNanos = System.nanoTime(); 84 long currentNanos = startNanos; 85 while (currentNanos - startNanos < TIME_NSEC) { 86 testGlobal(); 87 testWeakGlobal(); 88 Thread.sleep(1); 89 currentNanos = System.nanoTime(); 90 } 91 } 92 93 private static void seedGlobalRef() { 94 int[] a = new int[ARRAY_SIZE]; 95 fillArray(a, 1337); 96 makeGlobalRef(a); 97 } 98 99 private static void seedWeakGlobalRef() { 100 int[] a = new int[ARRAY_SIZE]; 101 fillArray(a, 8080); 102 makeWeakGlobalRef(a); 103 } 104 105 private static void testGlobal() { 106 int[] a = (int[]) readGlobalRef(); 107 checkArray(a, 1337); 108 } 109 110 private static void testWeakGlobal() { 111 int[] a = (int[]) readWeakGlobalRef(); 112 if (a != null) { 113 checkArray(a, 8080); 114 } else { 115 // weak reference is cleaned, recreate: 116 seedWeakGlobalRef(); 117 } 118 } 119 120 private static void fillArray(int[] array, int seed) { 121 Random r = new Random(seed); 122 for (int i = 0; i < ARRAY_SIZE; i++) { 123 array[i] = r.nextInt(); 124 } 125 } 126 127 private static void checkArray(int[] array, int seed) { 128 Random r = new Random(seed); 129 if (array.length != ARRAY_SIZE) { 130 throw new IllegalStateException("Illegal array length: " + array.length + ", but expected " + ARRAY_SIZE); 131 } 132 for (int i = 0; i < ARRAY_SIZE; i++) { 133 int actual = array[i]; 134 int expected = r.nextInt(); 135 if (actual != expected) { 136 throw new IllegalStateException("Incorrect array data: " + actual + ", but expected " + expected); 137 } 138 } 139 } 140 }