/* * Copyright (c) 2016, 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. * * 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. */ import sun.jvm.hotspot.memory.SymbolTable; import sun.jvm.hotspot.oops.Symbol; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.tools.Tool; /** * This class is launched in a sub-process by the main test, * SASymbolTableTest.java. * * It uses SA to connect to another JVM process, whose PID is specified in args[]. * The purpose of the test is to validate that we can walk the SymbolTable * and CompactHashTable of the other process. Everything should work regardless * of whether the other process runs in CDS mode or not. * * Note: CompactHashTable is used only when CDS is enabled. */ public class SASymbolTableTestAgent extends Tool { public SASymbolTableTestAgent() { super(); } public static void main(String args[]) { SASymbolTableTestAgent tool = new SASymbolTableTestAgent(); tool.execute(args); } static String[] commonNames = { "java/lang/Object", "java/lang/String", "java/lang/Class", "java/lang/Cloneable", "java/lang/ClassLoader", "java/io/Serializable", "java/lang/System", "java/lang/Throwable", "java/lang/Error", "java/lang/ThreadDeath", "java/lang/Exception", "java/lang/RuntimeException", "java/lang/SecurityManager", "java/security/ProtectionDomain", "java/security/AccessControlContext", "java/security/SecureClassLoader", "java/lang/ClassNotFoundException", "java/lang/NoClassDefFoundError", "java/lang/LinkageError", "java/lang/ClassCastException", "java/lang/ArrayStoreException", "java/lang/VirtualMachineError", "java/lang/OutOfMemoryError", "java/lang/StackOverflowError", "java/lang/IllegalMonitorStateException", "java/lang/ref/Reference", "java/lang/ref/SoftReference", "java/lang/ref/WeakReference", "java/lang/ref/FinalReference", "java/lang/ref/PhantomReference", "java/lang/ref/Finalizer", "java/lang/Thread", "java/lang/ThreadGroup", "java/util/Properties", "java/lang/reflect/AccessibleObject", "java/lang/reflect/Field", "java/lang/reflect/Method", "java/lang/reflect/Constructor", "java/lang/invoke/MethodHandle", "java/lang/invoke/MemberName", "java/lang/invoke/MethodHandleNatives", "java/lang/invoke/MethodType", "java/lang/BootstrapMethodError", "java/lang/invoke/CallSite", "java/lang/invoke/ConstantCallSite", "java/lang/invoke/MutableCallSite", "java/lang/invoke/VolatileCallSite", "java/lang/StringBuffer", "java/lang/StringBuilder", "java/io/ByteArrayInputStream", "java/io/File", "java/net/URLClassLoader", "java/net/URL", "java/util/jar/Manifest", "java/security/CodeSource", }; static String[] badNames = { "java/lang/badbadbad", "java/io/badbadbadbad", "this*symbol*must*not*exist" }; public void run() { System.out.println("SASymbolTableTestAgent: starting"); try { VM vm = VM.getVM(); SymbolTable table = vm.getSymbolTable(); // (a) These are names that are likely to exist in the symbol table // of a JVM after start-up. They were taken from vmSymbols.hpp // during the middle of JDK9 development. // // The purpose is not to check that each name must exist (a future // version of JDK may not preload some of the classes). // // The purpose of this loops is to ensure that we check a lot of symbols, // so we will (most likely) hit on both VALUE_ONLY_BUCKET_TYPE and normal bucket type // in CompactHashTable.probe(). for (String n : commonNames) { Symbol s = table.probe(n); System.out.format("%-40s = %s\n", n, s); } System.out.println("======================================================================"); // (b) Also test a few strings that are known to not exist in the table. This will // both the compact table (if it exists) and the regular table to be walked. for (String n : badNames) { Symbol s = table.probe(n); System.out.format("%-40s = %s\n", n, s); } } catch (NullPointerException e) { System.out.println("connected too early -- please try again"); } } }