8271014: Refactor HeapShared::is_archived_object()

Reviewed-by: ccheung, minqi
This commit is contained in:
Ioi Lam 2021-07-21 18:49:19 +00:00
parent ddce47cd3c
commit 024c4027d8
8 changed files with 27 additions and 25 deletions

View file

@ -39,6 +39,7 @@
#include "oops/compressedOops.inline.hpp" #include "oops/compressedOops.inline.hpp"
#include "runtime/arguments.hpp" #include "runtime/arguments.hpp"
#include "utilities/bitMap.inline.hpp" #include "utilities/bitMap.inline.hpp"
#include "utilities/formatBuffer.hpp"
CHeapBitMap* ArchivePtrMarker::_ptrmap = NULL; CHeapBitMap* ArchivePtrMarker::_ptrmap = NULL;
VirtualSpace* ArchivePtrMarker::_vs; VirtualSpace* ArchivePtrMarker::_vs;

View file

@ -116,6 +116,14 @@ GrowableArrayCHeap<oop, mtClassShared>* HeapShared::_pending_roots = NULL;
narrowOop HeapShared::_roots_narrow; narrowOop HeapShared::_roots_narrow;
OopHandle HeapShared::_roots; OopHandle HeapShared::_roots;
#ifdef ASSERT
bool HeapShared::is_archived_object_during_dumptime(oop p) {
assert(HeapShared::is_heap_object_archiving_allowed(), "must be");
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
return Universe::heap()->is_archived_object(p);
}
#endif
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// //
// Java heap object archiving support // Java heap object archiving support
@ -873,7 +881,7 @@ class WalkOopAndArchiveClosure: public BasicOopIterateClosure {
template <class T> void do_oop_work(T *p) { template <class T> void do_oop_work(T *p) {
oop obj = RawAccess<>::oop_load(p); oop obj = RawAccess<>::oop_load(p);
if (!CompressedOops::is_null(obj)) { if (!CompressedOops::is_null(obj)) {
assert(!HeapShared::is_archived_object(obj), assert(!HeapShared::is_archived_object_during_dumptime(obj),
"original objects must not point to archived objects"); "original objects must not point to archived objects");
size_t field_delta = pointer_delta(p, _orig_referencing_obj, sizeof(char)); size_t field_delta = pointer_delta(p, _orig_referencing_obj, sizeof(char));
@ -892,7 +900,7 @@ class WalkOopAndArchiveClosure: public BasicOopIterateClosure {
oop archived = HeapShared::archive_reachable_objects_from( oop archived = HeapShared::archive_reachable_objects_from(
_level + 1, _subgraph_info, obj, _is_closed_archive); _level + 1, _subgraph_info, obj, _is_closed_archive);
assert(archived != NULL, "VM should have exited with unarchivable objects for _level > 1"); assert(archived != NULL, "VM should have exited with unarchivable objects for _level > 1");
assert(HeapShared::is_archived_object(archived), "must be"); assert(HeapShared::is_archived_object_during_dumptime(archived), "must be");
if (!_record_klasses_only) { if (!_record_klasses_only) {
// Update the reference in the archived copy of the referencing object. // Update the reference in the archived copy of the referencing object.
@ -948,7 +956,7 @@ oop HeapShared::archive_reachable_objects_from(int level,
oop orig_obj, oop orig_obj,
bool is_closed_archive) { bool is_closed_archive) {
assert(orig_obj != NULL, "must be"); assert(orig_obj != NULL, "must be");
assert(!is_archived_object(orig_obj), "sanity"); assert(!is_archived_object_during_dumptime(orig_obj), "sanity");
if (!JavaClasses::is_supported_for_archiving(orig_obj)) { if (!JavaClasses::is_supported_for_archiving(orig_obj)) {
// This object has injected fields that cannot be supported easily, so we disallow them for now. // This object has injected fields that cannot be supported easily, so we disallow them for now.
@ -1166,10 +1174,10 @@ void HeapShared::verify_reachable_objects_from(oop obj, bool is_archived) {
set_has_been_seen_during_subgraph_recording(obj); set_has_been_seen_during_subgraph_recording(obj);
if (is_archived) { if (is_archived) {
assert(is_archived_object(obj), "must be"); assert(is_archived_object_during_dumptime(obj), "must be");
assert(find_archived_heap_object(obj) == NULL, "must be"); assert(find_archived_heap_object(obj) == NULL, "must be");
} else { } else {
assert(!is_archived_object(obj), "must be"); assert(!is_archived_object_during_dumptime(obj), "must be");
assert(find_archived_heap_object(obj) != NULL, "must be"); assert(find_archived_heap_object(obj) != NULL, "must be");
} }

View file

@ -376,7 +376,7 @@ private:
static void fixup_mapped_regions() NOT_CDS_JAVA_HEAP_RETURN; static void fixup_mapped_regions() NOT_CDS_JAVA_HEAP_RETURN;
inline static bool is_archived_object(oop p) NOT_CDS_JAVA_HEAP_RETURN_(false); static bool is_archived_object_during_dumptime(oop p) NOT_CDS_JAVA_HEAP_RETURN_(false);
static void resolve_classes(JavaThread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; static void resolve_classes(JavaThread* THREAD) NOT_CDS_JAVA_HEAP_RETURN;
static void initialize_from_archived_subgraph(Klass* k, JavaThread* THREAD) NOT_CDS_JAVA_HEAP_RETURN; static void initialize_from_archived_subgraph(Klass* k, JavaThread* THREAD) NOT_CDS_JAVA_HEAP_RETURN;

View file

@ -26,17 +26,11 @@
#define SHARE_CDS_HEAPSHARED_INLINE_HPP #define SHARE_CDS_HEAPSHARED_INLINE_HPP
#include "cds/heapShared.hpp" #include "cds/heapShared.hpp"
#include "gc/shared/collectedHeap.inline.hpp"
#include "oops/compressedOops.inline.hpp" #include "oops/compressedOops.inline.hpp"
#include "utilities/align.hpp" #include "utilities/align.hpp"
#if INCLUDE_CDS_JAVA_HEAP #if INCLUDE_CDS_JAVA_HEAP
bool HeapShared::is_archived_object(oop p) {
return Universe::heap()->is_archived_object(p);
}
inline oop HeapShared::decode_from_archive(narrowOop v) { inline oop HeapShared::decode_from_archive(narrowOop v) {
assert(!CompressedOops::is_null(v), "narrow oop value can never be zero"); assert(!CompressedOops::is_null(v), "narrow oop value can never be zero");
oop result = cast_to_oop((uintptr_t)_narrow_oop_base + ((uintptr_t)v << _narrow_oop_shift)); oop result = cast_to_oop((uintptr_t)_narrow_oop_base + ((uintptr_t)v << _narrow_oop_shift));

View file

@ -40,6 +40,7 @@
#include "code/debugInfo.hpp" #include "code/debugInfo.hpp"
#include "code/dependencyContext.hpp" #include "code/dependencyContext.hpp"
#include "code/pcDesc.hpp" #include "code/pcDesc.hpp"
#include "gc/shared/collectedHeap.inline.hpp"
#include "interpreter/interpreter.hpp" #include "interpreter/interpreter.hpp"
#include "interpreter/linkResolver.hpp" #include "interpreter/linkResolver.hpp"
#include "logging/log.hpp" #include "logging/log.hpp"
@ -816,14 +817,11 @@ static void initialize_static_string_field(fieldDescriptor* fd, Handle mirror, T
static void initialize_static_string_field_for_dump(fieldDescriptor* fd, Handle mirror) { static void initialize_static_string_field_for_dump(fieldDescriptor* fd, Handle mirror) {
DEBUG_ONLY(assert_valid_static_string_field(fd);) DEBUG_ONLY(assert_valid_static_string_field(fd);)
assert(DumpSharedSpaces, "must be"); assert(DumpSharedSpaces, "must be");
if (HeapShared::is_archived_object(mirror())) { assert(HeapShared::is_archived_object_during_dumptime(mirror()), "must be");
// Archive the String field and update the pointer. // Archive the String field and update the pointer.
oop s = mirror()->obj_field(fd->offset()); oop s = mirror()->obj_field(fd->offset());
oop archived_s = StringTable::create_archived_string(s); oop archived_s = StringTable::create_archived_string(s);
mirror()->obj_field_put(fd->offset(), archived_s); mirror()->obj_field_put(fd->offset(), archived_s);
} else {
guarantee(false, "Unexpected");
}
} }
#endif #endif
@ -1342,7 +1340,7 @@ bool java_lang_Class::restore_archived_mirror(Klass *k,
// mirror is archived, restore // mirror is archived, restore
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m)); log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
assert(HeapShared::is_archived_object(m), "must be archived mirror object"); assert(Universe::heap()->is_archived_object(m), "must be archived mirror object");
assert(as_Klass(m) == k, "must be"); assert(as_Klass(m) == k, "must be");
Handle mirror(THREAD, m); Handle mirror(THREAD, m);

View file

@ -720,7 +720,7 @@ oop StringTable::lookup_shared(const jchar* name, int len) {
oop StringTable::create_archived_string(oop s) { oop StringTable::create_archived_string(oop s) {
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump"); assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
assert(java_lang_String::is_instance(s), "sanity"); assert(java_lang_String::is_instance(s), "sanity");
assert(!HeapShared::is_archived_object(s), "sanity"); assert(!HeapShared::is_archived_object_during_dumptime(s), "sanity");
oop new_s = NULL; oop new_s = NULL;
typeArrayOop v = java_lang_String::value_no_keepalive(s); typeArrayOop v = java_lang_String::value_no_keepalive(s);

View file

@ -23,9 +23,10 @@
*/ */
#include "precompiled.hpp" #include "precompiled.hpp"
#include "cds/heapShared.inline.hpp"
#include "classfile/altHashing.hpp" #include "classfile/altHashing.hpp"
#include "classfile/javaClasses.inline.hpp" #include "classfile/javaClasses.inline.hpp"
#include "gc/shared/collectedHeap.inline.hpp"
#include "gc/shared/gc_globals.hpp"
#include "memory/resourceArea.hpp" #include "memory/resourceArea.hpp"
#include "memory/universe.hpp" #include "memory/universe.hpp"
#include "oops/access.inline.hpp" #include "oops/access.inline.hpp"
@ -218,7 +219,7 @@ void oopDesc::release_double_field_put(int offset, jdouble value) { HeapAcce
#ifdef ASSERT #ifdef ASSERT
void oopDesc::verify_forwardee(oop forwardee) { void oopDesc::verify_forwardee(oop forwardee) {
#if INCLUDE_CDS_JAVA_HEAP #if INCLUDE_CDS_JAVA_HEAP
assert(!HeapShared::is_archived_object(forwardee) && !HeapShared::is_archived_object(this), assert(!Universe::heap()->is_archived_object(forwardee) && !Universe::heap()->is_archived_object(this),
"forwarding archive object"); "forwarding archive object");
#endif #endif
} }

View file

@ -1933,7 +1933,7 @@ WB_END
WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj)) WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
oop obj_oop = JNIHandles::resolve(obj); oop obj_oop = JNIHandles::resolve(obj);
return HeapShared::is_archived_object(obj_oop); return Universe::heap()->is_archived_object(obj_oop);
WB_END WB_END
WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz)) WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))