comparison src/share/vm/utilities/hashtable.cpp @ 6162:e9140bf80b4a

7158800: Improve storage of symbol tables Summary: Use an alternate version of hashing algorithm for symbol string tables and after a certain bucket size to improve performance Reviewed-by: pbk, kamg, dlong, kvn, fparain
author coleenp
date Wed, 13 Jun 2012 19:52:59 -0400
parents 436b4a3231bf
children 246d977b51f2
comparison
equal deleted inserted replaced
6129:4d399f013e5a 6162:e9140bf80b4a
1 /* 1 /*
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
83 this, hashValue, (uintptr_t) obj, entry); 83 this, hashValue, (uintptr_t) obj, entry);
84 #endif /* USDT2 */ 84 #endif /* USDT2 */
85 return entry; 85 return entry;
86 } 86 }
87 87
88
89 // Check to see if the hashtable is unbalanced. The caller set a flag to
90 // rehash at the next safepoint. If this bucket is 60 times greater than the
91 // expected average bucket length, it's an unbalanced hashtable.
92 // This is somewhat an arbitrary heuristic but if one bucket gets to
93 // rehash_count which is currently 100, there's probably something wrong.
94
95 bool BasicHashtable::check_rehash_table(int count) {
96 assert(table_size() != 0, "underflow");
97 if (count > (((double)number_of_entries()/(double)table_size())*rehash_multiple)) {
98 // Set a flag for the next safepoint, which should be at some guaranteed
99 // safepoint interval.
100 return true;
101 }
102 return false;
103 }
104
105 // Create a new table and using alternate hash code, populate the new table
106 // with the existing elements. This can be used to change the hash code
107 // and could in the future change the size of the table.
108
109 template <class T> void Hashtable<T>::move_to(Hashtable<T>* new_table) {
110 int saved_entry_count = number_of_entries();
111
112 // Iterate through the table and create a new entry for the new table
113 for (int i = 0; i < new_table->table_size(); ++i) {
114 for (HashtableEntry<T>* p = bucket(i); p != NULL; ) {
115 HashtableEntry<T>* next = p->next();
116 T string = p->literal();
117 // Use alternate hashing algorithm on the symbol in the first table
118 unsigned int hashValue = new_hash(string);
119 // Get a new index relative to the new table (can also change size)
120 int index = new_table->hash_to_index(hashValue);
121 p->set_hash(hashValue);
122 unlink_entry(p);
123 new_table->add_entry(index, p);
124 p = next;
125 }
126 }
127 // give the new table the free list as well
128 new_table->copy_freelist(this);
129 assert(new_table->number_of_entries() == saved_entry_count, "lost entry on dictionary copy?");
130
131 // Destroy memory used by the buckets in the hashtable. The memory
132 // for the elements has been used in a new table and is not
133 // destroyed. The memory reuse will benefit resizing the SystemDictionary
134 // to avoid a memory allocation spike at safepoint.
135 free_buckets();
136 }
88 137
89 // Reverse the order of elements in the hash buckets. 138 // Reverse the order of elements in the hash buckets.
90 139
91 void BasicHashtable::reverse() { 140 void BasicHashtable::reverse() {
92 141