comparison src/share/vm/classfile/systemDictionary.cpp @ 4864:b2cd0ee8f778

7114376: Make system dictionary hashtable bucket array size configurable Summary: 7u4 new experimental flag -XX:PredictedClassLoadedCount=# Reviewed-by: dholmes, phh, dcubed
author acorn
date Mon, 30 Jan 2012 23:27:30 -0500
parents 94ec88ca68e2
children 33df1aeaebbf 8f972594effc
comparison
equal deleted inserted replaced
4863:d96c130c9399 4864:b2cd0ee8f778
1 /* 1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 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.
62 ResolutionErrorTable* SystemDictionary::_resolution_errors = NULL; 62 ResolutionErrorTable* SystemDictionary::_resolution_errors = NULL;
63 SymbolPropertyTable* SystemDictionary::_invoke_method_table = NULL; 63 SymbolPropertyTable* SystemDictionary::_invoke_method_table = NULL;
64 64
65 65
66 int SystemDictionary::_number_of_modifications = 0; 66 int SystemDictionary::_number_of_modifications = 0;
67 int SystemDictionary::_sdgeneration = 0;
68 const int SystemDictionary::_primelist[_prime_array_size] = {1009,2017,4049,5051,10103,
69 20201,40423,99991};
67 70
68 oop SystemDictionary::_system_loader_lock_obj = NULL; 71 oop SystemDictionary::_system_loader_lock_obj = NULL;
69 72
70 klassOop SystemDictionary::_well_known_klasses[SystemDictionary::WKID_LIMIT] 73 klassOop SystemDictionary::_well_known_klasses[SystemDictionary::WKID_LIMIT]
71 = { NULL /*, NULL...*/ }; 74 = { NULL /*, NULL...*/ };
1176 // If there is a shared dictionary, then find the entry for the 1179 // If there is a shared dictionary, then find the entry for the
1177 // given shared system class, if any. 1180 // given shared system class, if any.
1178 1181
1179 klassOop SystemDictionary::find_shared_class(Symbol* class_name) { 1182 klassOop SystemDictionary::find_shared_class(Symbol* class_name) {
1180 if (shared_dictionary() != NULL) { 1183 if (shared_dictionary() != NULL) {
1181 unsigned int d_hash = dictionary()->compute_hash(class_name, Handle()); 1184 unsigned int d_hash = shared_dictionary()->compute_hash(class_name, Handle());
1182 int d_index = dictionary()->hash_to_index(d_hash); 1185 int d_index = shared_dictionary()->hash_to_index(d_hash);
1183 return shared_dictionary()->find_shared_class(d_index, d_hash, class_name); 1186 return shared_dictionary()->find_shared_class(d_index, d_hash, class_name);
1184 } else { 1187 } else {
1185 return NULL; 1188 return NULL;
1186 } 1189 }
1187 } 1190 }
1748 1751
1749 void SystemDictionary::placeholders_do(OopClosure* blk) { 1752 void SystemDictionary::placeholders_do(OopClosure* blk) {
1750 placeholders()->oops_do(blk); 1753 placeholders()->oops_do(blk);
1751 } 1754 }
1752 1755
1753 1756 // Calculate a "good" systemdictionary size based
1757 // on predicted or current loaded classes count
1758 int SystemDictionary::calculate_systemdictionary_size(int classcount) {
1759 int newsize = _old_default_sdsize;
1760 if ((classcount > 0) && !DumpSharedSpaces) {
1761 int desiredsize = classcount/_average_depth_goal;
1762 for (newsize = _primelist[_sdgeneration]; _sdgeneration < _prime_array_size -1;
1763 newsize = _primelist[++_sdgeneration]) {
1764 if (desiredsize <= newsize) {
1765 break;
1766 }
1767 }
1768 }
1769 return newsize;
1770 }
1754 bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) { 1771 bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) {
1755 bool result = dictionary()->do_unloading(is_alive); 1772 bool result = dictionary()->do_unloading(is_alive);
1756 constraints()->purge_loader_constraints(is_alive); 1773 constraints()->purge_loader_constraints(is_alive);
1757 resolution_errors()->purge_resolution_errors(is_alive); 1774 resolution_errors()->purge_resolution_errors(is_alive);
1758 return result; 1775 return result;
1871 1888
1872 void SystemDictionary::initialize(TRAPS) { 1889 void SystemDictionary::initialize(TRAPS) {
1873 // Allocate arrays 1890 // Allocate arrays
1874 assert(dictionary() == NULL, 1891 assert(dictionary() == NULL,
1875 "SystemDictionary should only be initialized once"); 1892 "SystemDictionary should only be initialized once");
1876 _dictionary = new Dictionary(_nof_buckets); 1893 _sdgeneration = 0;
1894 _dictionary = new Dictionary(calculate_systemdictionary_size(PredictedLoadedClassCount));
1877 _placeholders = new PlaceholderTable(_nof_buckets); 1895 _placeholders = new PlaceholderTable(_nof_buckets);
1878 _number_of_modifications = 0; 1896 _number_of_modifications = 0;
1879 _loader_constraints = new LoaderConstraintTable(_loader_constraint_size); 1897 _loader_constraints = new LoaderConstraintTable(_loader_constraint_size);
1880 _resolution_errors = new ResolutionErrorTable(_resolution_error_size); 1898 _resolution_errors = new ResolutionErrorTable(_resolution_error_size);
1881 _invoke_method_table = new SymbolPropertyTable(_invoke_method_size); 1899 _invoke_method_table = new SymbolPropertyTable(_invoke_method_size);