< prev index next >
src/hotspot/share/memory/metaspaceShared.cpp
Print this page
@@ -62,10 +62,11 @@
#include "runtime/vmThread.hpp"
#include "runtime/vm_operations.hpp"
#include "utilities/align.hpp"
#include "utilities/bitMap.hpp"
#include "utilities/defaultStream.hpp"
+#include "utilities/hashtable.hpp"
#if INCLUDE_G1GC
#include "gc/g1/g1CollectedHeap.hpp"
#endif
ReservedSpace MetaspaceShared::_shared_rs;
@@ -1068,27 +1069,18 @@
class ArchiveCompactor : AllStatic {
static DumpAllocStats* _alloc_stats;
static SortedSymbolClosure* _ssc;
- static unsigned my_hash(const address& a) {
- return primitive_hash<address>(a);
- }
- static bool my_equals(const address& a0, const address& a1) {
- return primitive_equals<address>(a0, a1);
- }
- typedef ResourceHashtable<
- address, address,
- ArchiveCompactor::my_hash, // solaris compiler doesn't like: primitive_hash<address>
- ArchiveCompactor::my_equals, // solaris compiler doesn't like: primitive_equals<address>
- 16384, ResourceObj::C_HEAP> RelocationTable;
+ typedef KVHashtable<
+ address, address> RelocationTable;
static RelocationTable* _new_loc_table;
public:
static void initialize() {
_alloc_stats = new(ResourceObj::C_HEAP, mtInternal)DumpAllocStats;
- _new_loc_table = new(ResourceObj::C_HEAP, mtInternal)RelocationTable;
+ _new_loc_table = new RelocationTable(8087);
}
static DumpAllocStats* alloc_stats() {
return _alloc_stats;
}
@@ -1134,19 +1126,21 @@
}
p = _rw_region.allocate(bytes, alignment);
newtop = _rw_region.top();
}
memcpy(p, obj, bytes);
- bool isnew = _new_loc_table->put(obj, (address)p);
+ assert(_new_loc_table->lookup(obj) == NULL, "each object can be relocated at most once");
+ _new_loc_table->add(obj, (address)p);
log_trace(cds)("Copy: " PTR_FORMAT " ==> " PTR_FORMAT " %d", p2i(obj), p2i(p), bytes);
- assert(isnew, "must be");
-
+ if (_new_loc_table->maybe_grow()) {
+ log_info(cds, hashtables)("Expanded _new_loc_table to %d", _new_loc_table->table_size());
+ }
_alloc_stats->record(ref->msotype(), int(newtop - oldtop), read_only);
}
static address get_new_loc(MetaspaceClosure::Ref* ref) {
- address* pp = _new_loc_table->get(ref->obj());
+ address* pp = _new_loc_table->lookup(ref->obj());
assert(pp != NULL, "must be");
return *pp;
}
private:
@@ -1286,11 +1280,11 @@
vmSymbols::metaspace_pointers_do(it);
}
static Klass* get_relocated_klass(Klass* orig_klass) {
assert(DumpSharedSpaces, "dump time only");
- address* pp = _new_loc_table->get((address)orig_klass);
+ address* pp = _new_loc_table->lookup((address)orig_klass);
assert(pp != NULL, "must be");
Klass* klass = (Klass*)(*pp);
assert(klass->is_klass(), "must be");
return klass;
}
< prev index next >