1 /*
   2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import sun.jvm.hotspot.memory.SymbolTable;
  25 import sun.jvm.hotspot.oops.Symbol;
  26 import sun.jvm.hotspot.runtime.VM;
  27 import sun.jvm.hotspot.tools.Tool;
  28 
  29 /**
  30  * This class is launched in a sub-process by the main test,
  31  * SASymbolTableTest.java.
  32  *
  33  * It uses SA to connect to another JVM process, whose PID is specified in args[].
  34  * The purpose of the test is to validate that we can walk the SymbolTable
  35  * and CompactHashTable of the other process. Everything should work regardless
  36  * of whether the other process runs in CDS mode or not.
  37  *
  38  * Note: CompactHashTable is used only when CDS is enabled.
  39  */
  40 public class SASymbolTableTestAgent extends Tool {
  41     public SASymbolTableTestAgent() {
  42         super();
  43     }
  44     public static void main(String args[]) {
  45         SASymbolTableTestAgent tool = new SASymbolTableTestAgent();
  46         tool.execute(args);
  47     }
  48 
  49     static String[] commonNames = {
  50         "java/lang/Object",
  51         "java/lang/String",
  52         "java/lang/Class",
  53         "java/lang/Cloneable",
  54         "java/lang/ClassLoader",
  55         "java/io/Serializable",
  56         "java/lang/System",
  57         "java/lang/Throwable",
  58         "java/lang/Error",
  59         "java/lang/ThreadDeath",
  60         "java/lang/Exception",
  61         "java/lang/RuntimeException",
  62         "java/lang/SecurityManager",
  63         "java/security/ProtectionDomain",
  64         "java/security/AccessControlContext",
  65         "java/security/SecureClassLoader",
  66         "java/lang/ClassNotFoundException",
  67         "java/lang/NoClassDefFoundError",
  68         "java/lang/LinkageError",
  69         "java/lang/ClassCastException",
  70         "java/lang/ArrayStoreException",
  71         "java/lang/VirtualMachineError",
  72         "java/lang/OutOfMemoryError",
  73         "java/lang/StackOverflowError",
  74         "java/lang/IllegalMonitorStateException",
  75         "java/lang/ref/Reference",
  76         "java/lang/ref/SoftReference",
  77         "java/lang/ref/WeakReference",
  78         "java/lang/ref/FinalReference",
  79         "java/lang/ref/PhantomReference",
  80         "java/lang/ref/Finalizer",
  81         "java/lang/Thread",
  82         "java/lang/ThreadGroup",
  83         "java/util/Properties",
  84         "java/lang/reflect/AccessibleObject",
  85         "java/lang/reflect/Field",
  86         "java/lang/reflect/Method",
  87         "java/lang/reflect/Constructor",
  88         "java/lang/invoke/MethodHandle",
  89         "java/lang/invoke/MemberName",
  90         "java/lang/invoke/MethodHandleNatives",
  91         "java/lang/invoke/MethodType",
  92         "java/lang/BootstrapMethodError",
  93         "java/lang/invoke/CallSite",
  94         "java/lang/invoke/ConstantCallSite",
  95         "java/lang/invoke/MutableCallSite",
  96         "java/lang/invoke/VolatileCallSite",
  97         "java/lang/StringBuffer",
  98         "java/lang/StringBuilder",
  99         "java/io/ByteArrayInputStream",
 100         "java/io/File",
 101         "java/net/URLClassLoader",
 102         "java/net/URL",
 103         "java/util/jar/Manifest",
 104         "java/security/CodeSource",
 105     };
 106 
 107     static String[] badNames = {
 108         "java/lang/badbadbad",
 109         "java/io/badbadbadbad",
 110         "this*symbol*must*not*exist"
 111     };
 112 
 113     public void run() {
 114         System.out.println("SASymbolTableTestAgent: starting");
 115         try {
 116             VM vm = VM.getVM();
 117             SymbolTable table = vm.getSymbolTable();
 118 
 119             // (a) These are names that are likely to exist in the symbol table
 120             //     of a JVM after start-up. They were taken from vmSymbols.hpp
 121             //     during the middle of JDK9 development.
 122             //
 123             //     The purpose is not to check that each name must exist (a future
 124             //     version of JDK may not preload some of the classes).
 125             //
 126             //     The purpose of this loops is to ensure that we check a lot of symbols,
 127             //     so we will (most likely) hit on both VALUE_ONLY_BUCKET_TYPE and normal bucket type
 128             //     in CompactHashTable.probe().
 129             for (String n : commonNames) {
 130                 Symbol s = table.probe(n);
 131                 System.out.format("%-40s = %s\n", n, s);
 132             }
 133 
 134             System.out.println("======================================================================");
 135 
 136             // (b) Also test a few strings that are known to not exist in the table. This will
 137             //     both the compact table (if it exists) and the regular table to be walked.
 138             for (String n : badNames) {
 139                 Symbol s = table.probe(n);
 140                 System.out.format("%-40s = %s\n", n, s);
 141             }
 142         } catch (NullPointerException e) {
 143             System.out.println("connected too early -- please try again");
 144         }
 145     }
 146 }