src/share/vm/classfile/symbolTable.cpp

Mon, 27 May 2013 12:58:42 +0200

author
stefank
date
Mon, 27 May 2013 12:58:42 +0200
changeset 5196
8dbc025ff709
parent 5195
95c00927be11
child 5277
01522ca68fc7
permissions
-rw-r--r--

8015422: Large performance hit when the StringTable is walked twice in Parallel Scavenge
Summary: Combine the calls to StringTable::unlink and StringTable::oops_do in Parallel Scavenge.
Reviewed-by: pliden, coleenp

     1 /*
     2  * Copyright (c) 1997, 2013, 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  */
    25 #include "precompiled.hpp"
    26 #include "classfile/altHashing.hpp"
    27 #include "classfile/javaClasses.hpp"
    28 #include "classfile/symbolTable.hpp"
    29 #include "classfile/systemDictionary.hpp"
    30 #include "gc_interface/collectedHeap.inline.hpp"
    31 #include "memory/allocation.inline.hpp"
    32 #include "memory/filemap.hpp"
    33 #include "memory/gcLocker.inline.hpp"
    34 #include "oops/oop.inline.hpp"
    35 #include "oops/oop.inline2.hpp"
    36 #include "runtime/mutexLocker.hpp"
    37 #include "utilities/hashtable.inline.hpp"
    39 // --------------------------------------------------------------------------
    41 SymbolTable* SymbolTable::_the_table = NULL;
    42 // Static arena for symbols that are not deallocated
    43 Arena* SymbolTable::_arena = NULL;
    44 bool SymbolTable::_needs_rehashing = false;
    46 Symbol* SymbolTable::allocate_symbol(const u1* name, int len, bool c_heap, TRAPS) {
    47   assert (len <= Symbol::max_length(), "should be checked by caller");
    49   Symbol* sym;
    51   if (DumpSharedSpaces) {
    52     // Allocate all symbols to CLD shared metaspace
    53     sym = new (len, ClassLoaderData::the_null_class_loader_data(), THREAD) Symbol(name, len, -1);
    54   } else if (c_heap) {
    55     // refcount starts as 1
    56     sym = new (len, THREAD) Symbol(name, len, 1);
    57     assert(sym != NULL, "new should call vm_exit_out_of_memory if C_HEAP is exhausted");
    58   } else {
    59     // Allocate to global arena
    60     sym = new (len, arena(), THREAD) Symbol(name, len, -1);
    61   }
    62   return sym;
    63 }
    65 void SymbolTable::initialize_symbols(int arena_alloc_size) {
    66   // Initialize the arena for global symbols, size passed in depends on CDS.
    67   if (arena_alloc_size == 0) {
    68     _arena = new (mtSymbol) Arena();
    69   } else {
    70     _arena = new (mtSymbol) Arena(arena_alloc_size);
    71   }
    72 }
    74 // Call function for all symbols in the symbol table.
    75 void SymbolTable::symbols_do(SymbolClosure *cl) {
    76   const int n = the_table()->table_size();
    77   for (int i = 0; i < n; i++) {
    78     for (HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
    79          p != NULL;
    80          p = p->next()) {
    81       cl->do_symbol(p->literal_addr());
    82     }
    83   }
    84 }
    86 int SymbolTable::symbols_removed = 0;
    87 int SymbolTable::symbols_counted = 0;
    89 // Remove unreferenced symbols from the symbol table
    90 // This is done late during GC.
    91 void SymbolTable::unlink() {
    92   int removed = 0;
    93   int total = 0;
    94   size_t memory_total = 0;
    95   for (int i = 0; i < the_table()->table_size(); ++i) {
    96     HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
    97     HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
    98     while (entry != NULL) {
    99       // Shared entries are normally at the end of the bucket and if we run into
   100       // a shared entry, then there is nothing more to remove. However, if we
   101       // have rehashed the table, then the shared entries are no longer at the
   102       // end of the bucket.
   103       if (entry->is_shared() && !use_alternate_hashcode()) {
   104         break;
   105       }
   106       Symbol* s = entry->literal();
   107       memory_total += s->size();
   108       total++;
   109       assert(s != NULL, "just checking");
   110       // If reference count is zero, remove.
   111       if (s->refcount() == 0) {
   112         assert(!entry->is_shared(), "shared entries should be kept live");
   113         delete s;
   114         removed++;
   115         *p = entry->next();
   116         the_table()->free_entry(entry);
   117       } else {
   118         p = entry->next_addr();
   119       }
   120       // get next entry
   121       entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
   122     }
   123   }
   124   symbols_removed += removed;
   125   symbols_counted += total;
   126   // Exclude printing for normal PrintGCDetails because people parse
   127   // this output.
   128   if (PrintGCDetails && Verbose && WizardMode) {
   129     gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", total,
   130                         (memory_total*HeapWordSize)/1024);
   131   }
   132 }
   134 // Create a new table and using alternate hash code, populate the new table
   135 // with the existing strings.   Set flag to use the alternate hash code afterwards.
   136 void SymbolTable::rehash_table() {
   137   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   138   // This should never happen with -Xshare:dump but it might in testing mode.
   139   if (DumpSharedSpaces) return;
   140   // Create a new symbol table
   141   SymbolTable* new_table = new SymbolTable();
   143   the_table()->move_to(new_table);
   145   // Delete the table and buckets (entries are reused in new table).
   146   delete _the_table;
   147   // Don't check if we need rehashing until the table gets unbalanced again.
   148   // Then rehash with a new global seed.
   149   _needs_rehashing = false;
   150   _the_table = new_table;
   151 }
   153 // Lookup a symbol in a bucket.
   155 Symbol* SymbolTable::lookup(int index, const char* name,
   156                               int len, unsigned int hash) {
   157   int count = 0;
   158   for (HashtableEntry<Symbol*, mtSymbol>* e = bucket(index); e != NULL; e = e->next()) {
   159     count++;  // count all entries in this bucket, not just ones with same hash
   160     if (e->hash() == hash) {
   161       Symbol* sym = e->literal();
   162       if (sym->equals(name, len)) {
   163         // something is referencing this symbol now.
   164         sym->increment_refcount();
   165         return sym;
   166       }
   167     }
   168   }
   169   // If the bucket size is too deep check if this hash code is insufficient.
   170   if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
   171     _needs_rehashing = check_rehash_table(count);
   172   }
   173   return NULL;
   174 }
   176 // Pick hashing algorithm.
   177 unsigned int SymbolTable::hash_symbol(const char* s, int len) {
   178   return use_alternate_hashcode() ?
   179            AltHashing::murmur3_32(seed(), (const jbyte*)s, len) :
   180            java_lang_String::hash_code(s, len);
   181 }
   184 // We take care not to be blocking while holding the
   185 // SymbolTable_lock. Otherwise, the system might deadlock, since the
   186 // symboltable is used during compilation (VM_thread) The lock free
   187 // synchronization is simplified by the fact that we do not delete
   188 // entries in the symbol table during normal execution (only during
   189 // safepoints).
   191 Symbol* SymbolTable::lookup(const char* name, int len, TRAPS) {
   192   unsigned int hashValue = hash_symbol(name, len);
   193   int index = the_table()->hash_to_index(hashValue);
   195   Symbol* s = the_table()->lookup(index, name, len, hashValue);
   197   // Found
   198   if (s != NULL) return s;
   200   // Grab SymbolTable_lock first.
   201   MutexLocker ml(SymbolTable_lock, THREAD);
   203   // Otherwise, add to symbol to table
   204   return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL);
   205 }
   207 Symbol* SymbolTable::lookup(const Symbol* sym, int begin, int end, TRAPS) {
   208   char* buffer;
   209   int index, len;
   210   unsigned int hashValue;
   211   char* name;
   212   {
   213     debug_only(No_Safepoint_Verifier nsv;)
   215     name = (char*)sym->base() + begin;
   216     len = end - begin;
   217     hashValue = hash_symbol(name, len);
   218     index = the_table()->hash_to_index(hashValue);
   219     Symbol* s = the_table()->lookup(index, name, len, hashValue);
   221     // Found
   222     if (s != NULL) return s;
   223   }
   225   // Otherwise, add to symbol to table. Copy to a C string first.
   226   char stack_buf[128];
   227   ResourceMark rm(THREAD);
   228   if (len <= 128) {
   229     buffer = stack_buf;
   230   } else {
   231     buffer = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
   232   }
   233   for (int i=0; i<len; i++) {
   234     buffer[i] = name[i];
   235   }
   236   // Make sure there is no safepoint in the code above since name can't move.
   237   // We can't include the code in No_Safepoint_Verifier because of the
   238   // ResourceMark.
   240   // Grab SymbolTable_lock first.
   241   MutexLocker ml(SymbolTable_lock, THREAD);
   243   return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL);
   244 }
   246 Symbol* SymbolTable::lookup_only(const char* name, int len,
   247                                    unsigned int& hash) {
   248   hash = hash_symbol(name, len);
   249   int index = the_table()->hash_to_index(hash);
   251   Symbol* s = the_table()->lookup(index, name, len, hash);
   252   return s;
   253 }
   255 // Look up the address of the literal in the SymbolTable for this Symbol*
   256 // Do not create any new symbols
   257 // Do not increment the reference count to keep this alive
   258 Symbol** SymbolTable::lookup_symbol_addr(Symbol* sym){
   259   unsigned int hash = hash_symbol((char*)sym->bytes(), sym->utf8_length());
   260   int index = the_table()->hash_to_index(hash);
   262   for (HashtableEntry<Symbol*, mtSymbol>* e = the_table()->bucket(index); e != NULL; e = e->next()) {
   263     if (e->hash() == hash) {
   264       Symbol* literal_sym = e->literal();
   265       if (sym == literal_sym) {
   266         return e->literal_addr();
   267       }
   268     }
   269   }
   270   return NULL;
   271 }
   273 // Suggestion: Push unicode-based lookup all the way into the hashing
   274 // and probing logic, so there is no need for convert_to_utf8 until
   275 // an actual new Symbol* is created.
   276 Symbol* SymbolTable::lookup_unicode(const jchar* name, int utf16_length, TRAPS) {
   277   int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length);
   278   char stack_buf[128];
   279   if (utf8_length < (int) sizeof(stack_buf)) {
   280     char* chars = stack_buf;
   281     UNICODE::convert_to_utf8(name, utf16_length, chars);
   282     return lookup(chars, utf8_length, THREAD);
   283   } else {
   284     ResourceMark rm(THREAD);
   285     char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);;
   286     UNICODE::convert_to_utf8(name, utf16_length, chars);
   287     return lookup(chars, utf8_length, THREAD);
   288   }
   289 }
   291 Symbol* SymbolTable::lookup_only_unicode(const jchar* name, int utf16_length,
   292                                            unsigned int& hash) {
   293   int utf8_length = UNICODE::utf8_length((jchar*) name, utf16_length);
   294   char stack_buf[128];
   295   if (utf8_length < (int) sizeof(stack_buf)) {
   296     char* chars = stack_buf;
   297     UNICODE::convert_to_utf8(name, utf16_length, chars);
   298     return lookup_only(chars, utf8_length, hash);
   299   } else {
   300     ResourceMark rm;
   301     char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1);;
   302     UNICODE::convert_to_utf8(name, utf16_length, chars);
   303     return lookup_only(chars, utf8_length, hash);
   304   }
   305 }
   307 void SymbolTable::add(ClassLoaderData* loader_data, constantPoolHandle cp,
   308                       int names_count,
   309                       const char** names, int* lengths, int* cp_indices,
   310                       unsigned int* hashValues, TRAPS) {
   311   // Grab SymbolTable_lock first.
   312   MutexLocker ml(SymbolTable_lock, THREAD);
   314   SymbolTable* table = the_table();
   315   bool added = table->basic_add(loader_data, cp, names_count, names, lengths,
   316                                 cp_indices, hashValues, CHECK);
   317   if (!added) {
   318     // do it the hard way
   319     for (int i=0; i<names_count; i++) {
   320       int index = table->hash_to_index(hashValues[i]);
   321       bool c_heap = !loader_data->is_the_null_class_loader_data();
   322       Symbol* sym = table->basic_add(index, (u1*)names[i], lengths[i], hashValues[i], c_heap, CHECK);
   323       cp->symbol_at_put(cp_indices[i], sym);
   324     }
   325   }
   326 }
   328 Symbol* SymbolTable::new_permanent_symbol(const char* name, TRAPS) {
   329   unsigned int hash;
   330   Symbol* result = SymbolTable::lookup_only((char*)name, (int)strlen(name), hash);
   331   if (result != NULL) {
   332     return result;
   333   }
   334   // Grab SymbolTable_lock first.
   335   MutexLocker ml(SymbolTable_lock, THREAD);
   337   SymbolTable* table = the_table();
   338   int index = table->hash_to_index(hash);
   339   return table->basic_add(index, (u1*)name, (int)strlen(name), hash, false, THREAD);
   340 }
   342 Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len,
   343                                unsigned int hashValue_arg, bool c_heap, TRAPS) {
   344   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
   345          "proposed name of symbol must be stable");
   347   // Don't allow symbols to be created which cannot fit in a Symbol*.
   348   if (len > Symbol::max_length()) {
   349     THROW_MSG_0(vmSymbols::java_lang_InternalError(),
   350                 "name is too long to represent");
   351   }
   353   // Cannot hit a safepoint in this function because the "this" pointer can move.
   354   No_Safepoint_Verifier nsv;
   356   // Check if the symbol table has been rehashed, if so, need to recalculate
   357   // the hash value and index.
   358   unsigned int hashValue;
   359   int index;
   360   if (use_alternate_hashcode()) {
   361     hashValue = hash_symbol((const char*)name, len);
   362     index = hash_to_index(hashValue);
   363   } else {
   364     hashValue = hashValue_arg;
   365     index = index_arg;
   366   }
   368   // Since look-up was done lock-free, we need to check if another
   369   // thread beat us in the race to insert the symbol.
   370   Symbol* test = lookup(index, (char*)name, len, hashValue);
   371   if (test != NULL) {
   372     // A race occurred and another thread introduced the symbol.
   373     assert(test->refcount() != 0, "lookup should have incremented the count");
   374     return test;
   375   }
   377   // Create a new symbol.
   378   Symbol* sym = allocate_symbol(name, len, c_heap, CHECK_NULL);
   379   assert(sym->equals((char*)name, len), "symbol must be properly initialized");
   381   HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
   382   add_entry(index, entry);
   383   return sym;
   384 }
   386 // This version of basic_add adds symbols in batch from the constant pool
   387 // parsing.
   388 bool SymbolTable::basic_add(ClassLoaderData* loader_data, constantPoolHandle cp,
   389                             int names_count,
   390                             const char** names, int* lengths,
   391                             int* cp_indices, unsigned int* hashValues,
   392                             TRAPS) {
   394   // Check symbol names are not too long.  If any are too long, don't add any.
   395   for (int i = 0; i< names_count; i++) {
   396     if (lengths[i] > Symbol::max_length()) {
   397       THROW_MSG_0(vmSymbols::java_lang_InternalError(),
   398                   "name is too long to represent");
   399     }
   400   }
   402   // Cannot hit a safepoint in this function because the "this" pointer can move.
   403   No_Safepoint_Verifier nsv;
   405   for (int i=0; i<names_count; i++) {
   406     // Check if the symbol table has been rehashed, if so, need to recalculate
   407     // the hash value.
   408     unsigned int hashValue;
   409     if (use_alternate_hashcode()) {
   410       hashValue = hash_symbol(names[i], lengths[i]);
   411     } else {
   412       hashValue = hashValues[i];
   413     }
   414     // Since look-up was done lock-free, we need to check if another
   415     // thread beat us in the race to insert the symbol.
   416     int index = hash_to_index(hashValue);
   417     Symbol* test = lookup(index, names[i], lengths[i], hashValue);
   418     if (test != NULL) {
   419       // A race occurred and another thread introduced the symbol, this one
   420       // will be dropped and collected. Use test instead.
   421       cp->symbol_at_put(cp_indices[i], test);
   422       assert(test->refcount() != 0, "lookup should have incremented the count");
   423     } else {
   424       // Create a new symbol.  The null class loader is never unloaded so these
   425       // are allocated specially in a permanent arena.
   426       bool c_heap = !loader_data->is_the_null_class_loader_data();
   427       Symbol* sym = allocate_symbol((const u1*)names[i], lengths[i], c_heap, CHECK_(false));
   428       assert(sym->equals(names[i], lengths[i]), "symbol must be properly initialized");  // why wouldn't it be???
   429       HashtableEntry<Symbol*, mtSymbol>* entry = new_entry(hashValue, sym);
   430       add_entry(index, entry);
   431       cp->symbol_at_put(cp_indices[i], sym);
   432     }
   433   }
   434   return true;
   435 }
   438 void SymbolTable::verify() {
   439   for (int i = 0; i < the_table()->table_size(); ++i) {
   440     HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
   441     for ( ; p != NULL; p = p->next()) {
   442       Symbol* s = (Symbol*)(p->literal());
   443       guarantee(s != NULL, "symbol is NULL");
   444       unsigned int h = hash_symbol((char*)s->bytes(), s->utf8_length());
   445       guarantee(p->hash() == h, "broken hash in symbol table entry");
   446       guarantee(the_table()->hash_to_index(h) == i,
   447                 "wrong index in symbol table");
   448     }
   449   }
   450 }
   452 void SymbolTable::dump(outputStream* st) {
   453   the_table()->dump_table(st, "SymbolTable");
   454 }
   457 //---------------------------------------------------------------------------
   458 // Non-product code
   460 #ifndef PRODUCT
   462 void SymbolTable::print_histogram() {
   463   MutexLocker ml(SymbolTable_lock);
   464   const int results_length = 100;
   465   int results[results_length];
   466   int i,j;
   468   // initialize results to zero
   469   for (j = 0; j < results_length; j++) {
   470     results[j] = 0;
   471   }
   473   int total = 0;
   474   int max_symbols = 0;
   475   int out_of_range = 0;
   476   int memory_total = 0;
   477   int count = 0;
   478   for (i = 0; i < the_table()->table_size(); i++) {
   479     HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
   480     for ( ; p != NULL; p = p->next()) {
   481       memory_total += p->literal()->size();
   482       count++;
   483       int counter = p->literal()->utf8_length();
   484       total += counter;
   485       if (counter < results_length) {
   486         results[counter]++;
   487       } else {
   488         out_of_range++;
   489       }
   490       max_symbols = MAX2(max_symbols, counter);
   491     }
   492   }
   493   tty->print_cr("Symbol Table:");
   494   tty->print_cr("Total number of symbols  %5d", count);
   495   tty->print_cr("Total size in memory     %5dK",
   496           (memory_total*HeapWordSize)/1024);
   497   tty->print_cr("Total counted            %5d", symbols_counted);
   498   tty->print_cr("Total removed            %5d", symbols_removed);
   499   if (symbols_counted > 0) {
   500     tty->print_cr("Percent removed          %3.2f",
   501           ((float)symbols_removed/(float)symbols_counted)* 100);
   502   }
   503   tty->print_cr("Reference counts         %5d", Symbol::_total_count);
   504   tty->print_cr("Symbol arena size        %5d used %5d",
   505                  arena()->size_in_bytes(), arena()->used());
   506   tty->print_cr("Histogram of symbol length:");
   507   tty->print_cr("%8s %5d", "Total  ", total);
   508   tty->print_cr("%8s %5d", "Maximum", max_symbols);
   509   tty->print_cr("%8s %3.2f", "Average",
   510           ((float) total / (float) the_table()->table_size()));
   511   tty->print_cr("%s", "Histogram:");
   512   tty->print_cr(" %s %29s", "Length", "Number chains that length");
   513   for (i = 0; i < results_length; i++) {
   514     if (results[i] > 0) {
   515       tty->print_cr("%6d %10d", i, results[i]);
   516     }
   517   }
   518   if (Verbose) {
   519     int line_length = 70;
   520     tty->print_cr("%s %30s", " Length", "Number chains that length");
   521     for (i = 0; i < results_length; i++) {
   522       if (results[i] > 0) {
   523         tty->print("%4d", i);
   524         for (j = 0; (j < results[i]) && (j < line_length);  j++) {
   525           tty->print("%1s", "*");
   526         }
   527         if (j == line_length) {
   528           tty->print("%1s", "+");
   529         }
   530         tty->cr();
   531       }
   532     }
   533   }
   534   tty->print_cr(" %s %d: %d\n", "Number chains longer than",
   535                     results_length, out_of_range);
   536 }
   538 void SymbolTable::print() {
   539   for (int i = 0; i < the_table()->table_size(); ++i) {
   540     HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
   541     HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
   542     if (entry != NULL) {
   543       while (entry != NULL) {
   544         tty->print(PTR_FORMAT " ", entry->literal());
   545         entry->literal()->print();
   546         tty->print(" %d", entry->literal()->refcount());
   547         p = entry->next_addr();
   548         entry = (HashtableEntry<Symbol*, mtSymbol>*)HashtableEntry<Symbol*, mtSymbol>::make_ptr(*p);
   549       }
   550       tty->cr();
   551     }
   552   }
   553 }
   554 #endif // PRODUCT
   556 // --------------------------------------------------------------------------
   558 #ifdef ASSERT
   559 class StableMemoryChecker : public StackObj {
   560   enum { _bufsize = wordSize*4 };
   562   address _region;
   563   jint    _size;
   564   u1      _save_buf[_bufsize];
   566   int sample(u1* save_buf) {
   567     if (_size <= _bufsize) {
   568       memcpy(save_buf, _region, _size);
   569       return _size;
   570     } else {
   571       // copy head and tail
   572       memcpy(&save_buf[0],          _region,                      _bufsize/2);
   573       memcpy(&save_buf[_bufsize/2], _region + _size - _bufsize/2, _bufsize/2);
   574       return (_bufsize/2)*2;
   575     }
   576   }
   578  public:
   579   StableMemoryChecker(const void* region, jint size) {
   580     _region = (address) region;
   581     _size   = size;
   582     sample(_save_buf);
   583   }
   585   bool verify() {
   586     u1 check_buf[sizeof(_save_buf)];
   587     int check_size = sample(check_buf);
   588     return (0 == memcmp(_save_buf, check_buf, check_size));
   589   }
   591   void set_region(const void* region) { _region = (address) region; }
   592 };
   593 #endif
   596 // --------------------------------------------------------------------------
   597 StringTable* StringTable::_the_table = NULL;
   599 bool StringTable::_needs_rehashing = false;
   601 // Pick hashing algorithm
   602 unsigned int StringTable::hash_string(const jchar* s, int len) {
   603   return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) :
   604                                     java_lang_String::hash_code(s, len);
   605 }
   607 oop StringTable::lookup(int index, jchar* name,
   608                         int len, unsigned int hash) {
   609   int count = 0;
   610   for (HashtableEntry<oop, mtSymbol>* l = bucket(index); l != NULL; l = l->next()) {
   611     count++;
   612     if (l->hash() == hash) {
   613       if (java_lang_String::equals(l->literal(), name, len)) {
   614         return l->literal();
   615       }
   616     }
   617   }
   618   // If the bucket size is too deep check if this hash code is insufficient.
   619   if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) {
   620     _needs_rehashing = check_rehash_table(count);
   621   }
   622   return NULL;
   623 }
   626 oop StringTable::basic_add(int index_arg, Handle string, jchar* name,
   627                            int len, unsigned int hashValue_arg, TRAPS) {
   629   assert(java_lang_String::equals(string(), name, len),
   630          "string must be properly initialized");
   631   // Cannot hit a safepoint in this function because the "this" pointer can move.
   632   No_Safepoint_Verifier nsv;
   634   // Check if the symbol table has been rehashed, if so, need to recalculate
   635   // the hash value and index before second lookup.
   636   unsigned int hashValue;
   637   int index;
   638   if (use_alternate_hashcode()) {
   639     hashValue = hash_string(name, len);
   640     index = hash_to_index(hashValue);
   641   } else {
   642     hashValue = hashValue_arg;
   643     index = index_arg;
   644   }
   646   // Since look-up was done lock-free, we need to check if another
   647   // thread beat us in the race to insert the symbol.
   649   oop test = lookup(index, name, len, hashValue); // calls lookup(u1*, int)
   650   if (test != NULL) {
   651     // Entry already added
   652     return test;
   653   }
   655   HashtableEntry<oop, mtSymbol>* entry = new_entry(hashValue, string());
   656   add_entry(index, entry);
   657   return string();
   658 }
   661 oop StringTable::lookup(Symbol* symbol) {
   662   ResourceMark rm;
   663   int length;
   664   jchar* chars = symbol->as_unicode(length);
   665   return lookup(chars, length);
   666 }
   669 oop StringTable::lookup(jchar* name, int len) {
   670   unsigned int hash = hash_string(name, len);
   671   int index = the_table()->hash_to_index(hash);
   672   return the_table()->lookup(index, name, len, hash);
   673 }
   676 oop StringTable::intern(Handle string_or_null, jchar* name,
   677                         int len, TRAPS) {
   678   unsigned int hashValue = hash_string(name, len);
   679   int index = the_table()->hash_to_index(hashValue);
   680   oop found_string = the_table()->lookup(index, name, len, hashValue);
   682   // Found
   683   if (found_string != NULL) return found_string;
   685   debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
   686   assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
   687          "proposed name of symbol must be stable");
   689   Handle string;
   690   // try to reuse the string if possible
   691   if (!string_or_null.is_null()) {
   692     string = string_or_null;
   693   } else {
   694     string = java_lang_String::create_from_unicode(name, len, CHECK_NULL);
   695   }
   697   // Grab the StringTable_lock before getting the_table() because it could
   698   // change at safepoint.
   699   MutexLocker ml(StringTable_lock, THREAD);
   701   // Otherwise, add to symbol to table
   702   return the_table()->basic_add(index, string, name, len,
   703                                 hashValue, CHECK_NULL);
   704 }
   706 oop StringTable::intern(Symbol* symbol, TRAPS) {
   707   if (symbol == NULL) return NULL;
   708   ResourceMark rm(THREAD);
   709   int length;
   710   jchar* chars = symbol->as_unicode(length);
   711   Handle string;
   712   oop result = intern(string, chars, length, CHECK_NULL);
   713   return result;
   714 }
   717 oop StringTable::intern(oop string, TRAPS)
   718 {
   719   if (string == NULL) return NULL;
   720   ResourceMark rm(THREAD);
   721   int length;
   722   Handle h_string (THREAD, string);
   723   jchar* chars = java_lang_String::as_unicode_string(string, length, CHECK_NULL);
   724   oop result = intern(h_string, chars, length, CHECK_NULL);
   725   return result;
   726 }
   729 oop StringTable::intern(const char* utf8_string, TRAPS) {
   730   if (utf8_string == NULL) return NULL;
   731   ResourceMark rm(THREAD);
   732   int length = UTF8::unicode_length(utf8_string);
   733   jchar* chars = NEW_RESOURCE_ARRAY(jchar, length);
   734   UTF8::convert_to_unicode(utf8_string, chars, length);
   735   Handle string;
   736   oop result = intern(string, chars, length, CHECK_NULL);
   737   return result;
   738 }
   740 void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
   741   // Readers of the table are unlocked, so we should only be removing
   742   // entries at a safepoint.
   743   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   744   for (int i = 0; i < the_table()->table_size(); ++i) {
   745     HashtableEntry<oop, mtSymbol>** p = the_table()->bucket_addr(i);
   746     HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
   747     while (entry != NULL) {
   748       assert(!entry->is_shared(), "CDS not used for the StringTable");
   750       if (is_alive->do_object_b(entry->literal())) {
   751         if (f != NULL) {
   752           f->do_oop((oop*)entry->literal_addr());
   753         }
   754         p = entry->next_addr();
   755       } else {
   756         *p = entry->next();
   757         the_table()->free_entry(entry);
   758       }
   759       entry = *p;
   760     }
   761   }
   762 }
   764 void StringTable::oops_do(OopClosure* f) {
   765   for (int i = 0; i < the_table()->table_size(); ++i) {
   766     HashtableEntry<oop, mtSymbol>* entry = the_table()->bucket(i);
   767     while (entry != NULL) {
   768       assert(!entry->is_shared(), "CDS not used for the StringTable");
   770       f->do_oop((oop*)entry->literal_addr());
   772       entry = entry->next();
   773     }
   774   }
   775 }
   777 void StringTable::verify() {
   778   for (int i = 0; i < the_table()->table_size(); ++i) {
   779     HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
   780     for ( ; p != NULL; p = p->next()) {
   781       oop s = p->literal();
   782       guarantee(s != NULL, "interned string is NULL");
   783       unsigned int h = java_lang_String::hash_string(s);
   784       guarantee(p->hash() == h, "broken hash in string table entry");
   785       guarantee(the_table()->hash_to_index(h) == i,
   786                 "wrong index in string table");
   787     }
   788   }
   789 }
   791 void StringTable::dump(outputStream* st) {
   792   the_table()->dump_table(st, "StringTable");
   793 }
   796 // Create a new table and using alternate hash code, populate the new table
   797 // with the existing strings.   Set flag to use the alternate hash code afterwards.
   798 void StringTable::rehash_table() {
   799   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   800   // This should never happen with -Xshare:dump but it might in testing mode.
   801   if (DumpSharedSpaces) return;
   802   StringTable* new_table = new StringTable();
   804   // Rehash the table
   805   the_table()->move_to(new_table);
   807   // Delete the table and buckets (entries are reused in new table).
   808   delete _the_table;
   809   // Don't check if we need rehashing until the table gets unbalanced again.
   810   // Then rehash with a new global seed.
   811   _needs_rehashing = false;
   812   _the_table = new_table;
   813 }

mercurial