8205534: Remove SymbolTable dependency from serviceability agent
authorcoleenp
Tue, 03 Jul 2018 13:41:18 -0400
changeset 50929 ef57cfcd22ff
parent 50928 0e7e4b28c0d9
child 50930 6a5f1195e15f
8205534: Remove SymbolTable dependency from serviceability agent Reviewed-by: gziemski, poonam, jgeorge, hseigel
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/AltHashing.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/SymbolTable.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Field.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Method.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Symbol.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFactoryImpl.java
test/hotspot/jtreg/runtime/SharedArchiveFile/SASymbolTableTestAgent.java
test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java
test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java
test/jdk/sun/tools/jhsdb/LingeredAppWithAltHashing.java
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/CommandProcessor.java	Tue Jul 03 13:41:18 2018 -0400
@@ -50,7 +50,6 @@
 import sun.jvm.hotspot.debugger.OopHandle;
 import sun.jvm.hotspot.classfile.ClassLoaderDataGraph;
 import sun.jvm.hotspot.memory.FileMapInfo;
-import sun.jvm.hotspot.memory.SymbolTable;
 import sun.jvm.hotspot.memory.SystemDictionary;
 import sun.jvm.hotspot.memory.Universe;
 import sun.jvm.hotspot.gc.shared.CollectedHeap;
@@ -628,35 +627,6 @@
                 }
             }
         },
-        new Command("symboltable", "symboltable name", false) {
-            public void doit(Tokens t) {
-                if (t.countTokens() != 1) {
-                    usage();
-                } else {
-                    out.println(SymbolTable.getTheTable().probe(t.nextToken()));
-                }
-            }
-        },
-        new Command("symboldump", "symboldump", false) {
-            public void doit(Tokens t) {
-                SymbolTable theTable = SymbolTable.getTheTable();
-                theTable.symbolsDo(new SymbolTable.SymbolVisitor() {
-                        public void visit(Symbol sym) {
-                            sym.printValueOn(out);
-                            out.println();
-                        }
-                    });
-                CompactHashTable sharedTable = theTable.getSharedTable();
-                if (sharedTable != null) {
-                    sharedTable.symbolsDo(new CompactHashTable.SymbolVisitor() {
-                            public void visit(Symbol sym) {
-                                sym.printValueOn(out);
-                                out.println();
-                            }
-                        });
-                }
-            }
-        },
         new Command("flags", "flags [ flag | -nd ]", false) {
             public void doit(Tokens t) {
                 int tokens = t.countTokens();
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java	Tue Jul 03 13:41:18 2018 -0400
@@ -92,9 +92,9 @@
   public Klass getKlasses()    { return (Klass)klassesField.getValue(this);  }
 
   /** Lookup an already loaded class. If not found null is returned. */
-  public Klass find(Symbol className) {
+  public Klass find(String className) {
     for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
-        if (className.equals(l.getName())) {
+        if (l.getName().equals(className)) {
             return l;
         }
     }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -55,10 +55,8 @@
 
   /** Lookup an already loaded class in any class loader. */
   public Klass find(String className) {
-    Symbol sym = VM.getVM().getSymbolTable().probe(className);
-    if (sym == null) return null;
     for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) {
-        Klass k = cld.find(sym);
+        Klass k = cld.find(className);
         if (k != null) {
             return k;
         }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/AltHashing.java	Tue Jul 03 18:46:51 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2017, 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.
- *
- */
-
-package sun.jvm.hotspot.memory;
-
-public class AltHashing {
-    public static long murmur3_32(long seed, byte[] data) {
-      long h1 = seed;
-      int len = data.length;
-      int count = len;
-
-      int offset = 0;
-
-      // body
-      while (count >= 4) {
-          long k1 = (data[offset] & 0x0FF)
-              | (data[offset + 1] & 0x0FF) << 8
-              | (data[offset + 2] & 0x0FF) << 16
-              | data[offset + 3] << 24;
-
-          count -= 4;
-          offset += 4;
-
-          k1 *= 0xcc9e2d51;
-          k1 = Integer.rotateLeft((int)k1, 15);
-          k1 *= 0x1b873593;
-          k1 &= 0xFFFFFFFFL;
-
-          h1 ^= k1;
-          h1 = Integer.rotateLeft((int)h1, 13);
-          h1 = h1 * 5 + 0xe6546b64;
-          h1 &= 0xFFFFFFFFL;
-      }
-
-      //tail
-      if (count > 0) {
-          long k1 = 0;
-
-          switch (count) {
-              case 3:
-                  k1 ^= (data[offset + 2] & 0xff) << 16;
-                  // fall through
-              case 2:
-                  k1 ^= (data[offset + 1] & 0xff) << 8;
-                  // fall through
-              case 1:
-                  k1 ^= (data[offset] & 0xff);
-                  // fall through
-              default:
-                  k1 *= 0xcc9e2d51;
-                  k1 = Integer.rotateLeft((int)k1, 15);
-                  k1 *= 0x1b873593;
-                  k1 &= 0xFFFFFFFFL;
-                  h1 ^= k1;
-                  h1 &= 0xFFFFFFFFL;
-          }
-      }
-
-      // finalization
-      h1 ^= len;
-
-      // finalization mix force all bits of a hash block to avalanche
-      h1 ^= h1 >> 16;
-      h1 *= 0x85ebca6b;
-      h1 &= 0xFFFFFFFFL;
-      h1 ^= h1 >> 13;
-      h1 *= 0xc2b2ae35;
-      h1 &= 0xFFFFFFFFL;
-      h1 ^= h1 >> 16;
-
-      return h1 & 0xFFFFFFFFL;
-  }
-}
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/SymbolTable.java	Tue Jul 03 18:46:51 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2001, 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.
- *
- * 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 sun.jvm.hotspot.memory;
-
-import java.io.*;
-import java.util.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.oops.*;
-import sun.jvm.hotspot.types.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.utilities.*;
-
-public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
-  static {
-    VM.registerVMInitializedObserver(new Observer() {
-        public void update(Observable o, Object data) {
-          initialize(VM.getVM().getTypeDataBase());
-        }
-      });
-  }
-
-  private static synchronized void initialize(TypeDataBase db) {
-    Type type = db.lookupType("SymbolTable");
-    theTableField  = type.getAddressField("_the_table");
-    sharedTableField = type.getAddressField("_shared_table");
-    type = db.lookupType("RehashableSymbolHashtable");
-    seedField = type.getCIntegerField("_seed");
-  }
-
-  // Fields
-  private static AddressField theTableField;
-  private static AddressField sharedTableField;
-  private static CIntegerField seedField;
-
-  private CompactHashTable sharedTable;
-
-  // Accessors
-  public static SymbolTable getTheTable() {
-    Address tmp = theTableField.getValue();
-    SymbolTable table = (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
-    Address shared = sharedTableField.getStaticFieldAddress();
-    table.sharedTable = (CompactHashTable)VMObjectFactory.newObject(CompactHashTable.class, shared);
-    return table;
-  }
-
-  public CompactHashTable getSharedTable() {
-      return sharedTable;
-  }
-
-  public static long getSeed() {
-      return (long) seedField.getValue();
-  }
-
-  public static boolean useAlternateHashcode() {
-      if (getSeed() != 0) {
-          return true;
-      }
-      return false;
-  }
-
-  public SymbolTable(Address addr) {
-    super(addr);
-  }
-
-  /** Clone of VM's "temporary" probe routine, as the SA currently
-      does not support mutation so lookup() would have no effect
-      anyway. Returns null if the given string is not in the symbol
-      table. */
-  public Symbol probe(String name) {
-    try {
-      return probe(toModifiedUTF8Bytes(name));
-    } catch (IOException e) {
-      return null;
-    }
-  }
-
-  /** Clone of VM's "temporary" probe routine, as the SA currently
-      does not support mutation so lookup() would have no effect
-      anyway. Searches the regular symbol table and the shared symbol
-      table. Null is returned if the given name is not found in both
-      tables. */
-  public Symbol probe(byte[] name) {
-    long hashValue = hashSymbol(name);
-
-    // shared table does not use alternate hashing algorithm,
-    // it always uses the same original hash code.
-    Symbol s = sharedTable.probe(name, hashValue);
-    if (s != null) {
-      return s;
-    }
-
-    if (useAlternateHashcode()) {
-        hashValue = AltHashing.murmur3_32(getSeed(), name);
-    }
-
-    for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
-      if (e.hash() == hashValue) {
-         Symbol sym = Symbol.create(e.literalValue());
-         if (sym.equals(name)) {
-           return sym;
-         }
-      }
-    }
-
-    return null;
-  }
-
-  public interface SymbolVisitor {
-    public void visit(Symbol sym);
-  }
-
-  public void symbolsDo(SymbolVisitor visitor) {
-    int numBuckets = tableSize();
-    for (int i = 0; i < numBuckets; i++) {
-      for (HashtableEntry e = (HashtableEntry) bucket(i); e != null;
-           e = (HashtableEntry) e.next()) {
-        visitor.visit(Symbol.create(e.literalValue()));
-      }
-    }
-  }
-
-  private static byte[] toModifiedUTF8Bytes(String name) throws IOException {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    DataOutputStream dos = new DataOutputStream(baos);
-    dos.writeUTF(name);
-    dos.flush();
-    byte[] buf = baos.toByteArray();
-    byte[] res = new byte[buf.length - 2];
-    // skip the length part
-    System.arraycopy(buf, 2, res, 0, res.length);
-    return res;
-  }
-}
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java	Tue Jul 03 13:41:18 2018 -0400
@@ -72,27 +72,27 @@
   public Klass getLowerDimension()  { return (Klass) lowerDimension.getValue(this); }
 
   // constant class names - javaLangCloneable, javaIoSerializable, javaLangObject
-  // Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and SymbolTable
-  private static Symbol javaLangCloneableName;
-  private static Symbol javaLangObjectName;
-  private static Symbol javaIoSerializableName;
-  private static Symbol javaLangCloneableName() {
+  // Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and String
+  private static String javaLangCloneableName;
+  private static String javaLangObjectName;
+  private static String javaIoSerializableName;
+  private static String javaLangCloneableName() {
     if (javaLangCloneableName == null) {
-      javaLangCloneableName = VM.getVM().getSymbolTable().probe("java/lang/Cloneable");
+      javaLangCloneableName = "java/lang/Cloneable";
     }
     return javaLangCloneableName;
   }
 
-  private static Symbol javaLangObjectName() {
+  private static String javaLangObjectName() {
     if (javaLangObjectName == null) {
-      javaLangObjectName = VM.getVM().getSymbolTable().probe("java/lang/Object");
+      javaLangObjectName = "java/lang/Object";
     }
     return javaLangObjectName;
   }
 
-  private static Symbol javaIoSerializableName() {
+  private static String javaIoSerializableName() {
     if (javaIoSerializableName == null) {
-      javaIoSerializableName = VM.getVM().getSymbolTable().probe("java/io/Serializable");
+      javaIoSerializableName = "java/io/Serializable";
     }
     return javaIoSerializableName;
   }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java	Tue Jul 03 13:41:18 2018 -0400
@@ -355,7 +355,7 @@
     if (klass.isArrayKlass()) {
        klass = klass.getJavaSuper();
     }
-    return ((InstanceKlass)klass).findMethod(name, sig);
+    return ((InstanceKlass)klass).findMethod(name.asString(), sig.asString());
   }
 
   // returns null, if not resolved.
@@ -364,7 +364,7 @@
     if (klass == null) return null;
     Symbol name = getNameRefAt(which);
     Symbol sig  = getSignatureRefAt(which);
-    return klass.findField(name, sig);
+    return klass.findField(name.asString(), sig.asString());
   }
 
   public int getNameAndTypeRefIndexAt(int index) {
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Field.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Field.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -47,7 +47,7 @@
     offset               = holder.getFieldOffset(fieldIndex);
     genericSignature     = holder.getFieldGenericSignature(fieldIndex);
 
-    Symbol name          = holder.getFieldName(fieldIndex);
+    name                 = holder.getFieldName(fieldIndex);
     id          = new NamedFieldIdentifier(name.asString());
 
     signature            = holder.getFieldSignature(fieldIndex);
@@ -57,6 +57,7 @@
     accessFlags = new AccessFlags(access);
   }
 
+  private Symbol          name;
   private long            offset;
   private FieldIdentifier id;
   private boolean         isVMField;
@@ -74,6 +75,8 @@
   /** Returns the identifier of the field */
   public FieldIdentifier getID() { return id; }
 
+  public Symbol getName() { return name; }
+
   /** Indicates whether this is a VM field */
   public boolean isVMField() { return isVMField; }
 
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -729,12 +729,12 @@
   }
 
   /** Field access by name. */
-  public Field findLocalField(Symbol name, Symbol sig) {
+  public Field findLocalField(String name, String sig) {
     int length = getJavaFieldsCount();
     for (int i = 0; i < length; i++) {
       Symbol f_name = getFieldName(i);
       Symbol f_sig  = getFieldSignature(i);
-      if (name.equals(f_name) && sig.equals(f_sig)) {
+      if (f_name.equals(name) && f_sig.equals(sig)) {
         return newField(i);
       }
     }
@@ -743,14 +743,14 @@
   }
 
   /** Find field in direct superinterfaces. */
-  public Field findInterfaceField(Symbol name, Symbol sig) {
+  public Field findInterfaceField(String name, String sig) {
     KlassArray interfaces = getLocalInterfaces();
     int n = interfaces.length();
     for (int i = 0; i < n; i++) {
       InstanceKlass intf1 = (InstanceKlass) interfaces.getAt(i);
       if (Assert.ASSERTS_ENABLED) {
         Assert.that(intf1.isInterface(), "just checking type");
-      }
+     }
       // search for field in current interface
       Field f = intf1.findLocalField(name, sig);
       if (f != null) {
@@ -769,7 +769,7 @@
 
   /** Find field according to JVM spec 5.4.3.2, returns the klass in
       which the field is defined. */
-  public Field findField(Symbol name, Symbol sig) {
+  public Field findField(String name, String sig) {
     // search order according to newest JVM spec (5.4.3.2, p.167).
     // 1) search for field in current klass
     Field f = findLocalField(name, sig);
@@ -788,18 +788,6 @@
   }
 
   /** Find field according to JVM spec 5.4.3.2, returns the klass in
-      which the field is defined (convenience routine) */
-  public Field findField(String name, String sig) {
-    SymbolTable symbols = VM.getVM().getSymbolTable();
-    Symbol nameSym = symbols.probe(name);
-    Symbol sigSym  = symbols.probe(sig);
-    if (nameSym == null || sigSym == null) {
-      return null;
-    }
-    return findField(nameSym, sigSym);
-  }
-
-  /** Find field according to JVM spec 5.4.3.2, returns the klass in
       which the field is defined (retained only for backward
       compatibility with jdbx) */
   public Field findFieldDbg(String name, String sig) {
@@ -932,20 +920,8 @@
      return "L" + super.signature() + ";";
   }
 
-  /** Convenience routine taking Strings; lookup is done in
-      SymbolTable. */
+  /** Find method in vtable. */
   public Method findMethod(String name, String sig) {
-    SymbolTable syms = VM.getVM().getSymbolTable();
-    Symbol nameSym = syms.probe(name);
-    Symbol sigSym  = syms.probe(sig);
-    if (nameSym == null || sigSym == null) {
-      return null;
-    }
-    return findMethod(nameSym, sigSym);
-  }
-
-  /** Find method in vtable. */
-  public Method findMethod(Symbol name, Symbol sig) {
     return findMethod(getMethods(), name, sig);
   }
 
@@ -1055,56 +1031,16 @@
     throw new RuntimeException("Illegal field type at index " + index);
   }
 
-  private static Method findMethod(MethodArray methods, Symbol name, Symbol signature) {
-    int len = methods.length();
-    // methods are sorted, so do binary search
-    int l = 0;
-    int h = len - 1;
-    while (l <= h) {
-      int mid = (l + h) >> 1;
-      Method m = methods.at(mid);
-      long res = m.getName().fastCompare(name);
-      if (res == 0) {
-        // found matching name; do linear search to find matching signature
-        // first, quick check for common case
-        if (m.getSignature().equals(signature)) return m;
-        // search downwards through overloaded methods
-        int i;
-        for (i = mid - 1; i >= l; i--) {
-          Method m1 = methods.at(i);
-          if (!m1.getName().equals(name)) break;
-          if (m1.getSignature().equals(signature)) return m1;
-        }
-        // search upwards
-        for (i = mid + 1; i <= h; i++) {
-          Method m1 = methods.at(i);
-          if (!m1.getName().equals(name)) break;
-          if (m1.getSignature().equals(signature)) return m1;
-        }
-        // not found
-        if (Assert.ASSERTS_ENABLED) {
-          int index = linearSearch(methods, name, signature);
-          if (index != -1) {
-            throw new DebuggerException("binary search bug: should have found entry " + index);
-          }
-        }
-        return null;
-      } else if (res < 0) {
-        l = mid + 1;
-      } else {
-        h = mid - 1;
-      }
+  private static Method findMethod(MethodArray methods, String name, String signature) {
+    int index = linearSearch(methods, name, signature);
+    if (index != -1) {
+      return methods.at(index);
+    } else {
+      return null;
     }
-    if (Assert.ASSERTS_ENABLED) {
-      int index = linearSearch(methods, name, signature);
-      if (index != -1) {
-        throw new DebuggerException("binary search bug: should have found entry " + index);
-      }
-    }
-    return null;
   }
 
-  private static int linearSearch(MethodArray methods, Symbol name, Symbol signature) {
+  private static int linearSearch(MethodArray methods, String name, String signature) {
     int len = (int) methods.length();
     for (int index = 0; index < len; index++) {
       Method m = methods.at(index);
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Method.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Method.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -93,18 +93,18 @@
 
 
   // constant method names - <init>, <clinit>
-  // Initialized lazily to avoid initialization ordering dependencies between Method and SymbolTable
-  private static Symbol objectInitializerName;
-  private static Symbol classInitializerName;
-  private static Symbol objectInitializerName() {
+  // Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and String
+  private static String objectInitializerName;
+  private static String classInitializerName;
+  private static String objectInitializerName() {
     if (objectInitializerName == null) {
-      objectInitializerName = VM.getVM().getSymbolTable().probe("<init>");
+      objectInitializerName = "<init>";
     }
     return objectInitializerName;
   }
-  private static Symbol classInitializerName() {
+  private static String classInitializerName() {
     if (classInitializerName == null) {
-      classInitializerName = VM.getVM().getSymbolTable().probe("<clinit>");
+      classInitializerName = "<clinit>";
     }
     return classInitializerName;
   }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Symbol.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Symbol.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -106,6 +106,10 @@
     return true;
   }
 
+  public boolean equals(String string) {
+    return asString().equals(string);
+  }
+
   public byte[] asByteArray() {
     int length = (int) getLength();
     byte [] result = new byte [length];
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java	Tue Jul 03 13:41:18 2018 -0400
@@ -78,7 +78,6 @@
   private long         logAddressSize;
   private Universe     universe;
   private ObjectHeap   heap;
-  private SymbolTable  symbols;
   private SystemDictionary dict;
   private ClassLoaderDataGraph cldGraph;
   private Threads      threads;
@@ -647,13 +646,6 @@
     return heap;
   }
 
-  public SymbolTable getSymbolTable() {
-    if (symbols == null) {
-      symbols = SymbolTable.getTheTable();
-    }
-    return symbols;
-  }
-
   public SystemDictionary getSystemDictionary() {
     if (dict == null) {
       dict = new SystemDictionary();
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java	Tue Jul 03 13:41:18 2018 -0400
@@ -43,10 +43,9 @@
 public abstract class AbstractHeapGraphWriter implements HeapGraphWriter {
     // the function iterates heap and calls Oop type specific writers
     protected void write() throws IOException {
-        SymbolTable symTbl = VM.getVM().getSymbolTable();
-        javaLangClass = symTbl.probe("java/lang/Class");
-        javaLangString = symTbl.probe("java/lang/String");
-        javaLangThread = symTbl.probe("java/lang/Thread");
+        javaLangClass = "java/lang/Class";
+        javaLangString = "java/lang/String";
+        javaLangThread = "java/lang/Thread";
         ObjectHeap heap = VM.getVM().getObjectHeap();
         try {
             heap.iterate(new DefaultHeapVisitor() {
@@ -458,7 +457,7 @@
         }
     }
 
-    protected Symbol javaLangClass;
-    protected Symbol javaLangString;
-    protected Symbol javaLangThread;
+    protected String javaLangClass;
+    protected String javaLangString;
+    protected String javaLangThread;
 }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -309,6 +309,9 @@
 
 public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
 
+    // Record which Symbol names have been dumped already.
+    private HashSet<Symbol> names;
+
     private static final long HPROF_SEGMENTED_HEAP_DUMP_THRESHOLD = 2L * 0x40000000;
 
     // The approximate size of a heap segment. Used to calculate when to create
@@ -381,6 +384,7 @@
 
     public HeapHprofBinWriter() {
         this.KlassMap = new ArrayList<Klass>();
+        this.names = new HashSet<Symbol>();
     }
 
     public synchronized void write(String fileName) throws IOException {
@@ -391,7 +395,6 @@
         VM vm = VM.getVM();
         dbg = vm.getDebugger();
         objectHeap = vm.getObjectHeap();
-        symTbl = vm.getSymbolTable();
 
         OBJ_ID_SIZE = (int) vm.getOopSize();
 
@@ -745,6 +748,11 @@
         } else {
             lineNumber = m.getLineNumberFromBCI(bci);
         }
+        // First dump UTF8 if needed
+        writeSymbol(m.getName());                              // method's name
+        writeSymbol(m.getSignature());                         // method's signature
+        writeSymbol(m.getMethodHolder().getSourceFileName());  // source file name
+        // Then write FRAME descriptor
         writeHeader(HPROF_FRAME, 4 * (int)VM.getVM().getOopSize() + 2 * (int)INT_SIZE);
         writeObjectID(frameSN);                                  // frame serial number
         writeSymbolID(m.getName());                              // method's name
@@ -955,7 +963,7 @@
         out.writeShort((short) fields.size());
         for (Iterator itr = fields.iterator(); itr.hasNext();) {
             Field field = (Field) itr.next();
-            Symbol name = symTbl.probe(field.getID().getName());
+            Symbol name = field.getName();
             writeSymbolID(name);
             char typeCode = (char) field.getSignature().getByteAt(0);
             int kind = signatureToHprofKind(typeCode);
@@ -1049,27 +1057,44 @@
         out.writeInt(0);
     }
 
+    private void writeClassSymbols(Klass k) throws IOException {
+        writeSymbol(k.getName());
+        if (k instanceof InstanceKlass) {
+            InstanceKlass ik = (InstanceKlass) k;
+            List declaredFields = ik.getImmediateFields();
+            for (Iterator itr = declaredFields.iterator(); itr.hasNext();) {
+                Field field = (Field) itr.next();
+                writeSymbol(field.getName());
+            }
+        }
+    }
+
     private void writeSymbols() throws IOException {
+        // Write all the symbols that are used by the classes
+        ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
         try {
-            symTbl.symbolsDo(new SymbolTable.SymbolVisitor() {
-                    public void visit(Symbol sym) {
-                        try {
-                            writeSymbol(sym);
-                        } catch (IOException exp) {
-                            throw new RuntimeException(exp);
-                        }
-                    }
-                });
+             cldGraph.classesDo(new ClassLoaderDataGraph.ClassVisitor() {
+                            public void visit(Klass k) {
+                                try {
+                                    writeClassSymbols(k);
+                                } catch (IOException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            }
+                        });
         } catch (RuntimeException re) {
             handleRuntimeException(re);
         }
     }
 
     private void writeSymbol(Symbol sym) throws IOException {
-        byte[] buf = sym.asString().getBytes("UTF-8");
-        writeHeader(HPROF_UTF8, buf.length + OBJ_ID_SIZE);
-        writeSymbolID(sym);
-        out.write(buf);
+        // If name is already written don't write it again.
+        if (names.add(sym)) {
+            byte[] buf = sym.asString().getBytes("UTF-8");
+            writeHeader(HPROF_UTF8, buf.length + OBJ_ID_SIZE);
+            writeSymbolID(sym);
+            out.write(buf);
+        }
     }
 
     private void writeClasses() throws IOException {
@@ -1118,6 +1143,7 @@
     }
 
     private void writeSymbolID(Symbol sym) throws IOException {
+        assert names.contains(sym);
         writeObjectID(getAddressValue(sym.getAddress()));
     }
 
@@ -1195,7 +1221,6 @@
     private FileOutputStream fos;
     private Debugger dbg;
     private ObjectHeap objectHeap;
-    private SymbolTable symTbl;
     private ArrayList<Klass> KlassMap;
 
     // oopSize of the debuggee
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -135,39 +135,35 @@
       }
    }
 
-   protected Symbol javaLangString;
-   protected Symbol javaUtilHashtableEntry;
-   protected Symbol javaUtilHashtable;
-   protected Symbol javaUtilProperties;
+   protected String javaLangString;
+   protected String javaUtilHashtableEntry;
+   protected String javaUtilHashtable;
+   protected String javaUtilProperties;
 
-   protected Symbol getVMSymbol(String name) {
-      return VM.getVM().getSymbolTable().probe(name);
-   }
-
-   protected Symbol javaLangString() {
+   protected String javaLangString() {
       if (javaLangString == null) {
-         javaLangString = getVMSymbol("java/lang/String");
+         javaLangString = "java/lang/String";
       }
       return javaLangString;
    }
 
-   protected Symbol javaUtilHashtableEntry() {
+   protected String javaUtilHashtableEntry() {
       if (javaUtilHashtableEntry == null) {
-         javaUtilHashtableEntry = getVMSymbol("java/util/Hashtable$Entry");
+         javaUtilHashtableEntry = "java/util/Hashtable$Entry";
       }
       return javaUtilHashtableEntry;
    }
 
-   protected Symbol javaUtilHashtable() {
+   protected String javaUtilHashtable() {
       if (javaUtilHashtable == null) {
-         javaUtilHashtable = getVMSymbol("java/util/Hashtable");
+         javaUtilHashtable = "java/util/Hashtable";
       }
       return javaUtilHashtable;
    }
 
-   protected Symbol javaUtilProperties() {
+   protected String javaUtilProperties() {
       if (javaUtilProperties == null) {
-         javaUtilProperties = getVMSymbol("java/util/Properties");
+         javaUtilProperties = "java/util/Properties";
       }
       return javaUtilProperties;
    }
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFactoryImpl.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFactoryImpl.java	Tue Jul 03 13:41:18 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -127,31 +127,27 @@
    }
 
    // -- Internals only below this point
-   private Symbol javaLangString() {
+   private String javaLangString() {
       if (javaLangString == null) {
-         javaLangString = getSymbol("java/lang/String");
+         javaLangString = "java/lang/String";
       }
       return javaLangString;
    }
 
-   private Symbol javaLangThread() {
+   private String javaLangThread() {
       if (javaLangThread == null) {
-         javaLangThread = getSymbol("java/lang/Thread");
+         javaLangThread = "java/lang/Thread";
       }
       return javaLangThread;
    }
 
-   private Symbol javaLangClass() {
+   private String javaLangClass() {
       if (javaLangClass == null) {
-         javaLangClass = getSymbol("java/lang/Class");
+         javaLangClass = "java/lang/Class";
       }
       return javaLangClass;
    }
 
-   private Symbol getSymbol(String str) {
-      return VM.getVM().getSymbolTable().probe(str);
-   }
-
    private JSJavaObject newJavaInstance(Instance instance) {
       // look for well-known classes
       Symbol className = instance.getKlass().getName();
@@ -196,7 +192,7 @@
 
    // Map<Oop, SoftReference<JSJavaObject>>
    private Map om = new HashMap();
-   private Symbol javaLangString;
-   private Symbol javaLangThread;
-   private Symbol javaLangClass;
+   private String javaLangString;
+   private String javaLangThread;
+   private String javaLangClass;
 }
--- a/test/hotspot/jtreg/runtime/SharedArchiveFile/SASymbolTableTestAgent.java	Tue Jul 03 18:46:51 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*
- * 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");
-        }
-    }
-}
--- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintStatics.java	Tue Jul 03 13:41:18 2018 -0400
@@ -57,7 +57,7 @@
             expStrMap.put("printstatics", List.of(
                     "All known static fields",
                     "Abstract_VM_Version::_vm_major_version",
-                    "ClassLoaderDataGraph::_head", "SymbolTable::_the_table",
+                    "ClassLoaderDataGraph::_head",
                     "JNIHandles::_weak_global_handles", "PerfMemory::_top",
                     "ObjectSynchronizer::gBlockList",
                     "java_lang_Class::_oop_size_offset",
--- a/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java	Tue Jul 03 18:46:51 2018 +0200
+++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbSource.java	Tue Jul 03 13:41:18 2018 -0400
@@ -66,8 +66,7 @@
                     "Available commands:",
                     "attach pid | exec core",
                     "intConstant [ name [ value ] ]",
-                    "type [ type [ name super isOop isInteger isUnsigned size ] ]",
-                    "symboltable name"));
+                    "type [ type [ name super isOop isInteger isUnsigned size ] ]"));
 
             Map<String, List<String>> unExpStrMap = new HashMap<>();
             unExpStrMap.put("source clhsdb_cmd_file", List.of(
--- a/test/jdk/sun/tools/jhsdb/LingeredAppWithAltHashing.java	Tue Jul 03 18:46:51 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2017, 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 jdk.test.lib.apps.LingeredApp;
-
-public class LingeredAppWithAltHashing extends LingeredApp {
-
-    public static void main(String args[]) {
-        LingeredApp.main(args);
-    }
-
-    // Following strings generate the same hashcode
-
-    static final String str1 = "AaAaAaAaAaAaAa";
-    static final String str2 = "AaAaAaAaAaAaBB";
-    static final String str3 = "AaAaAaAaAaBBAa";
-    static final String str4 = "AaAaAaAaAaBBBB";
-    static final String str5 = "AaAaAaAaBBAaAa";
-    static final String str6 = "AaAaAaAaBBAaBB";
-    static final String str7 = "AaAaAaAaBBBBAa";
-    static final String str8 = "AaAaAaAaBBBBBB";
-    static final String str9 = "AaAaAaBBAaAaAa";
-    static final String str10 = "AaAaAaBBAaAaBB";
-    static final String str11 = "AaAaAaBBAaBBAa";
-    static final String str12 = "AaAaAaBBAaBBBB";
-    static final String str13 = "AaAaAaBBBBAaAa";
-    static final String str14 = "AaAaAaBBBBAaBB";
-    static final String str15 = "AaAaAaBBBBBBAa";
-    static final String str16 = "AaAaAaBBBBBBBB";
-    static final String str17 = "AaAaBBAaAaAaAa";
-    static final String str18 = "AaAaBBAaAaAaBB";
-    static final String str19 = "AaAaBBAaAaBBAa";
-    static final String str20 = "AaAaBBAaAaBBBB";
-    static final String str21 = "AaAaBBAaBBAaAa";
-    static final String str22 = "AaAaBBAaBBAaBB";
-    static final String str23 = "AaAaBBAaBBBBAa";
-    static final String str24 = "AaAaBBAaBBBBBB";
-    static final String str25 = "AaAaBBBBAaAaAa";
-    static final String str26 = "AaAaBBBBAaAaBB";
-    static final String str27 = "AaAaBBBBAaBBAa";
-    static final String str28 = "AaAaBBBBAaBBBB";
-    static final String str29 = "AaAaBBBBBBAaAa";
-    static final String str30 = "AaAaBBBBBBAaBB";
-    static final String str31 = "AaAaBBBBBBBBAa";
-    static final String str32 = "AaAaBBBBBBBBBB";
-    static final String str33 = "AaBBAaAaAaAaAa";
-    static final String str34 = "AaBBAaAaAaAaBB";
-    static final String str35 = "AaBBAaAaAaBBAa";
-    static final String str36 = "AaBBAaAaAaBBBB";
-    static final String str37 = "AaBBAaAaBBAaAa";
-    static final String str38 = "AaBBAaAaBBAaBB";
-    static final String str39 = "AaBBAaAaBBBBAa";
-    static final String str40 = "AaBBAaAaBBBBBB";
-    static final String str41 = "AaBBAaBBAaAaAa";
-    static final String str42 = "AaBBAaBBAaAaBB";
-    static final String str43 = "AaBBAaBBAaBBAa";
-    static final String str44 = "AaBBAaBBAaBBBB";
-    static final String str45 = "AaBBAaBBBBAaAa";
-    static final String str46 = "AaBBAaBBBBAaBB";
-    static final String str47 = "AaBBAaBBBBBBAa";
-    static final String str48 = "AaBBAaBBBBBBBB";
-    static final String str49 = "AaBBBBAaAaAaAa";
-    static final String str50 = "AaBBBBAaAaAaBB";
-    static final String str51 = "AaBBBBAaAaBBAa";
-    static final String str52 = "AaBBBBAaAaBBBB";
-    static final String str53 = "AaBBBBAaBBAaAa";
-    static final String str54 = "AaBBBBAaBBAaBB";
-    static final String str55 = "AaBBBBAaBBBBAa";
-    static final String str56 = "AaBBBBAaBBBBBB";
-    static final String str57 = "AaBBBBBBAaAaAa";
-    static final String str58 = "AaBBBBBBAaAaBB";
-    static final String str59 = "AaBBBBBBAaBBAa";
-    static final String str60 = "AaBBBBBBAaBBBB";
-    static final String str61 = "AaBBBBBBBBAaAa";
-    static final String str62 = "AaBBBBBBBBAaBB";
-    static final String str63 = "AaBBBBBBBBBBAa";
-    static final String str64 = "AaBBBBBBBBBBBB";
-    static final String str65 = "BBAaAaAaAaAaAa";
-    static final String str66 = "BBAaAaAaAaAaBB";
-    static final String str67 = "BBAaAaAaAaBBAa";
-    static final String str68 = "BBAaAaAaAaBBBB";
-    static final String str69 = "BBAaAaAaBBAaAa";
-    static final String str70 = "BBAaAaAaBBAaBB";
-    static final String str71 = "BBAaAaAaBBBBAa";
-    static final String str72 = "BBAaAaAaBBBBBB";
-    static final String str73 = "BBAaAaBBAaAaAa";
-    static final String str74 = "BBAaAaBBAaAaBB";
-    static final String str75 = "BBAaAaBBAaBBAa";
-    static final String str76 = "BBAaAaBBAaBBBB";
-    static final String str77 = "BBAaAaBBBBAaAa";
-    static final String str78 = "BBAaAaBBBBAaBB";
-    static final String str79 = "BBAaAaBBBBBBAa";
-    static final String str80 = "BBAaAaBBBBBBBB";
-    static final String str81 = "BBAaBBAaAaAaAa";
-    static final String str82 = "BBAaBBAaAaAaBB";
-    static final String str83 = "BBAaBBAaAaBBAa";
-    static final String str84 = "BBAaBBAaAaBBBB";
-    static final String str85 = "BBAaBBAaBBAaAa";
-    static final String str86 = "BBAaBBAaBBAaBB";
-    static final String str87 = "BBAaBBAaBBBBAa";
-    static final String str88 = "BBAaBBAaBBBBBB";
-    static final String str89 = "BBAaBBBBAaAaAa";
-    static final String str90 = "BBAaBBBBAaAaBB";
-    static final String str91 = "BBAaBBBBAaBBAa";
-    static final String str92 = "BBAaBBBBAaBBBB";
-    static final String str93 = "BBAaBBBBBBAaAa";
-    static final String str94 = "BBAaBBBBBBAaBB";
-    static final String str95 = "BBAaBBBBBBBBAa";
-    static final String str96 = "BBAaBBBBBBBBBB";
-    static final String str97 = "BBBBAaAaAaAaAa";
-    static final String str98 = "BBBBAaAaAaAaBB";
-    static final String str99 = "BBBBAaAaAaBBAa";
-    static final String str100 = "BBBBAaAaAaBBBB";
-    static final String str101 = "BBBBAaAaBBAaAa";
-    static final String str102 = "BBBBAaAaBBAaBB";
-    static final String str103 = "BBBBAaAaBBBBAa";
-    static final String str104 = "BBBBAaAaBBBBBB";
-    static final String str105 = "BBBBAaBBAaAaAa";
-    static final String str106 = "BBBBAaBBAaAaBB";
-    static final String str107 = "BBBBAaBBAaBBAa";
-    static final String str108 = "BBBBAaBBAaBBBB";
-    static final String str109 = "BBBBAaBBBBAaAa";
-    static final String str110 = "BBBBAaBBBBAaBB";
-    static final String str111 = "BBBBAaBBBBBBAa";
-    static final String str112 = "BBBBAaBBBBBBBB";
-    static final String str113 = "BBBBBBAaAaAaAa";
-    static final String str114 = "BBBBBBAaAaAaBB";
-    static final String str115 = "BBBBBBAaAaBBAa";
-    static final String str116 = "BBBBBBAaAaBBBB";
-    static final String str117 = "BBBBBBAaBBAaAa";
-    static final String str118 = "BBBBBBAaBBAaBB";
-    static final String str119 = "BBBBBBAaBBBBAa";
-    static final String str120 = "BBBBBBAaBBBBBB";
-    static final String str121 = "BBBBBBBBAaAaAa";
-    static final String str122 = "BBBBBBBBAaAaBB";
-    static final String str123 = "BBBBBBBBAaBBAa";
-    static final String str124 = "BBBBBBBBAaBBBB";
-    static final String str125 = "BBBBBBBBBBAaAa";
-    static final String str126 = "BBBBBBBBBBAaBB";
-    static final String str127 = "BBBBBBBBBBBBAa";
-    static final String str128 = "BBBBBBBBBBBBBB";
- }