--- a/src/hotspot/share/memory/metaspaceShared.cpp Tue Oct 09 12:36:51 2018 -0700
+++ b/src/hotspot/share/memory/metaspaceShared.cpp Tue Oct 09 15:58:07 2018 -0400
@@ -75,8 +75,6 @@
bool MetaspaceShared::_has_error_classes;
bool MetaspaceShared::_archive_loading_failed = false;
bool MetaspaceShared::_remapped_readwrite = false;
-bool MetaspaceShared::_open_archive_heap_region_mapped = false;
-bool MetaspaceShared::_archive_heap_region_fixed = false;
address MetaspaceShared::_cds_i2i_entry_code_buffers = NULL;
size_t MetaspaceShared::_cds_i2i_entry_code_buffers_size = 0;
size_t MetaspaceShared::_core_spaces_size = 0;
@@ -108,7 +106,7 @@
// [5] C++ vtables are copied into the md region.
// [6] Original class files are copied into the od region.
//
-// The s0/s1 and oa0/oa1 regions are populated inside MetaspaceShared::dump_java_heap_objects.
+// The s0/s1 and oa0/oa1 regions are populated inside HeapShared::archive_java_heap_objects.
// Their layout is independent of the other 5 regions.
class DumpRegion {
@@ -454,6 +452,10 @@
// is run at a safepoint just before exit, this is the entire set of classes.
static GrowableArray<Klass*>* _global_klass_objects;
+GrowableArray<Klass*>* MetaspaceShared::collected_klasses() {
+ return _global_klass_objects;
+}
+
static void collect_array_classes(Klass* k) {
_global_klass_objects->append_if_missing(k);
if (k->is_array_klass()) {
@@ -512,7 +514,7 @@
}
static void clear_basic_type_mirrors() {
- assert(!MetaspaceShared::is_heap_object_archiving_allowed(), "Sanity");
+ assert(!HeapShared::is_heap_object_archiving_allowed(), "Sanity");
Universe::set_int_mirror(NULL);
Universe::set_float_mirror(NULL);
Universe::set_double_mirror(NULL);
@@ -850,7 +852,7 @@
if (*o == NULL) {
_dump_region->append_intptr_t(0);
} else {
- assert(MetaspaceShared::is_heap_object_archiving_allowed(),
+ assert(HeapShared::is_heap_object_archiving_allowed(),
"Archiving heap object is not allowed");
_dump_region->append_intptr_t(
(intptr_t)CompressedOops::encode_not_null(*o));
@@ -1329,7 +1331,7 @@
SystemDictionary::reorder_dictionary_for_sharing();
tty->print("Removing java_mirror ... ");
- if (!MetaspaceShared::is_heap_object_archiving_allowed()) {
+ if (!HeapShared::is_heap_object_archiving_allowed()) {
clear_basic_type_mirrors();
}
remove_java_mirror_in_classes();
@@ -1798,47 +1800,18 @@
#if INCLUDE_CDS_JAVA_HEAP
void VM_PopulateDumpSharedSpace::dump_java_heap_objects() {
- if (!MetaspaceShared::is_heap_object_archiving_allowed()) {
- if (log_is_enabled(Info, cds)) {
- log_info(cds)(
- "Archived java heap is not supported as UseG1GC, "
- "UseCompressedOops and UseCompressedClassPointers are required."
- "Current settings: UseG1GC=%s, UseCompressedOops=%s, UseCompressedClassPointers=%s.",
- BOOL_TO_STR(UseG1GC), BOOL_TO_STR(UseCompressedOops),
- BOOL_TO_STR(UseCompressedClassPointers));
- }
- return;
- }
-
- {
- NoSafepointVerifier nsv;
-
- // Cache for recording where the archived objects are copied to
- MetaspaceShared::create_archive_object_cache();
-
- tty->print_cr("Dumping objects to closed archive heap region ...");
- NOT_PRODUCT(StringTable::verify());
- // The closed space has maximum two regions. See FileMapInfo::write_archive_heap_regions() for details.
- _closed_archive_heap_regions = new GrowableArray<MemRegion>(2);
- MetaspaceShared::dump_closed_archive_heap_objects(_closed_archive_heap_regions);
-
- tty->print_cr("Dumping objects to open archive heap region ...");
- _open_archive_heap_regions = new GrowableArray<MemRegion>(2);
- MetaspaceShared::dump_open_archive_heap_objects(_open_archive_heap_regions);
-
- MetaspaceShared::destroy_archive_object_cache();
- }
-
- G1HeapVerifier::verify_archive_regions();
-
- {
- ArchiveCompactor::OtherROAllocMark mark;
- HeapShared::write_subgraph_info_table();
- }
+ // The closed and open archive heap space has maximum two regions.
+ // See FileMapInfo::write_archive_heap_regions() for details.
+ _closed_archive_heap_regions = new GrowableArray<MemRegion>(2);
+ _open_archive_heap_regions = new GrowableArray<MemRegion>(2);
+ HeapShared::archive_java_heap_objects(_closed_archive_heap_regions,
+ _open_archive_heap_regions);
+ ArchiveCompactor::OtherROAllocMark mark;
+ HeapShared::write_subgraph_info_table();
}
void VM_PopulateDumpSharedSpace::dump_archive_heap_oopmaps() {
- if (MetaspaceShared::is_heap_object_archiving_allowed()) {
+ if (HeapShared::is_heap_object_archiving_allowed()) {
_closed_archive_heap_oopmaps = new GrowableArray<ArchiveHeapOopmapInfo>(2);
dump_archive_heap_oopmaps(_closed_archive_heap_regions, _closed_archive_heap_oopmaps);
@@ -1866,124 +1839,6 @@
oopmaps->append(info);
}
}
-
-void MetaspaceShared::dump_closed_archive_heap_objects(
- GrowableArray<MemRegion> * closed_archive) {
- assert(is_heap_object_archiving_allowed(), "Cannot dump java heap objects");
-
- Thread* THREAD = Thread::current();
- G1CollectedHeap::heap()->begin_archive_alloc_range();
-
- // Archive interned string objects
- StringTable::write_to_archive();
-
- G1CollectedHeap::heap()->end_archive_alloc_range(closed_archive,
- os::vm_allocation_granularity());
-}
-
-void MetaspaceShared::dump_open_archive_heap_objects(
- GrowableArray<MemRegion> * open_archive) {
- assert(UseG1GC, "Only support G1 GC");
- assert(UseCompressedOops && UseCompressedClassPointers,
- "Only support UseCompressedOops and UseCompressedClassPointers enabled");
-
- Thread* THREAD = Thread::current();
- G1CollectedHeap::heap()->begin_archive_alloc_range(true /* open */);
-
- java_lang_Class::archive_basic_type_mirrors(THREAD);
-
- MetaspaceShared::archive_klass_objects(THREAD);
-
- HeapShared::archive_static_fields(THREAD);
-
- G1CollectedHeap::heap()->end_archive_alloc_range(open_archive,
- os::vm_allocation_granularity());
-}
-
-unsigned MetaspaceShared::obj_hash(oop const& p) {
- assert(!p->mark()->has_bias_pattern(),
- "this object should never have been locked"); // so identity_hash won't safepoint
- unsigned hash = (unsigned)p->identity_hash();
- return hash;
-}
-
-MetaspaceShared::ArchivedObjectCache* MetaspaceShared::_archive_object_cache = NULL;
-oop MetaspaceShared::find_archived_heap_object(oop obj) {
- assert(DumpSharedSpaces, "dump-time only");
- ArchivedObjectCache* cache = MetaspaceShared::archive_object_cache();
- oop* p = cache->get(obj);
- if (p != NULL) {
- return *p;
- } else {
- return NULL;
- }
-}
-
-oop MetaspaceShared::archive_heap_object(oop obj, Thread* THREAD) {
- assert(DumpSharedSpaces, "dump-time only");
-
- oop ao = find_archived_heap_object(obj);
- if (ao != NULL) {
- // already archived
- return ao;
- }
-
- int len = obj->size();
- if (G1CollectedHeap::heap()->is_archive_alloc_too_large(len)) {
- log_debug(cds, heap)("Cannot archive, object (" PTR_FORMAT ") is too large: " SIZE_FORMAT,
- p2i(obj), (size_t)obj->size());
- return NULL;
- }
-
- int hash = obj->identity_hash();
- oop archived_oop = (oop)G1CollectedHeap::heap()->archive_mem_allocate(len);
- if (archived_oop != NULL) {
- Copy::aligned_disjoint_words((HeapWord*)obj, (HeapWord*)archived_oop, len);
- relocate_klass_ptr(archived_oop);
- ArchivedObjectCache* cache = MetaspaceShared::archive_object_cache();
- cache->put(obj, archived_oop);
- log_debug(cds, heap)("Archived heap object " PTR_FORMAT " ==> " PTR_FORMAT,
- p2i(obj), p2i(archived_oop));
- } else {
- log_error(cds, heap)(
- "Cannot allocate space for object " PTR_FORMAT " in archived heap region",
- p2i(obj));
- vm_exit(1);
- }
- return archived_oop;
-}
-
-oop MetaspaceShared::materialize_archived_object(narrowOop v) {
- assert(archive_heap_region_fixed(),
- "must be called after archive heap regions are fixed");
- if (!CompressedOops::is_null(v)) {
- oop obj = HeapShared::decode_from_archive(v);
- return G1CollectedHeap::heap()->materialize_archived_object(obj);
- }
- return NULL;
-}
-
-void MetaspaceShared::archive_klass_objects(Thread* THREAD) {
- int i;
- for (i = 0; i < _global_klass_objects->length(); i++) {
- Klass* k = _global_klass_objects->at(i);
-
- // archive mirror object
- java_lang_Class::archive_mirror(k, CHECK);
-
- // archive the resolved_referenes array
- if (k->is_instance_klass()) {
- InstanceKlass* ik = InstanceKlass::cast(k);
- ik->constants()->archive_resolved_references(THREAD);
- }
- }
-}
-
-void MetaspaceShared::fixup_mapped_heap_regions() {
- FileMapInfo *mapinfo = FileMapInfo::current_info();
- mapinfo->fixup_mapped_heap_regions();
- set_archive_heap_region_fixed();
-}
#endif // INCLUDE_CDS_JAVA_HEAP
// Closure for serializing initialization data in from a data area
@@ -2023,12 +1878,12 @@
void do_oop(oop *p) {
narrowOop o = (narrowOop)nextPtr();
- if (o == 0 || !MetaspaceShared::open_archive_heap_region_mapped()) {
+ if (o == 0 || !HeapShared::open_archive_heap_region_mapped()) {
p = NULL;
} else {
- assert(MetaspaceShared::is_heap_object_archiving_allowed(),
+ assert(HeapShared::is_heap_object_archiving_allowed(),
"Archived heap object is not allowed");
- assert(MetaspaceShared::open_archive_heap_region_mapped(),
+ assert(HeapShared::open_archive_heap_region_mapped(),
"Open archive heap region is not mapped");
*p = HeapShared::decode_from_archive(o);
}