< prev index next >
src/hotspot/share/memory/heapShared.cpp
Print this page
*** 22,31 ****
--- 22,32 ----
*
*/
#include "precompiled.hpp"
#include "classfile/javaClasses.inline.hpp"
+ #include "classfile/symbolTable.hpp"
#include "classfile/vmSymbols.hpp"
#include "logging/log.hpp"
#include "logging/logMessage.hpp"
#include "logging/logStream.hpp"
#include "memory/heapShared.hpp"
*** 34,43 ****
--- 35,45 ----
#include "memory/metaspaceClosure.hpp"
#include "memory/metaspaceShared.hpp"
#include "memory/resourceArea.hpp"
#include "oops/compressedOops.inline.hpp"
#include "oops/oop.inline.hpp"
+ #include "runtime/fieldDescriptor.hpp"
#if INCLUDE_CDS_JAVA_HEAP
KlassSubGraphInfo* HeapShared::_subgraph_info_list = NULL;
int HeapShared::_num_archived_subgraph_info_records = 0;
Array<ArchivedKlassSubGraphInfoRecord>* HeapShared::_archived_subgraph_info_records = NULL;
*** 463,473 ****
oop archived_m = MetaspaceShared::find_archived_heap_object(m);
if (CompressedOops::is_null(archived_m)) {
return;
}
! if (field_type == T_OBJECT) {
// obtain k's subGraph Info
KlassSubGraphInfo* subgraph_info = get_subgraph_info(k);
// get the object referenced by the field
oop f = m->obj_field(field_offset);
--- 465,475 ----
oop archived_m = MetaspaceShared::find_archived_heap_object(m);
if (CompressedOops::is_null(archived_m)) {
return;
}
! if (field_type == T_OBJECT || field_type == T_ARRAY) {
// obtain k's subGraph Info
KlassSubGraphInfo* subgraph_info = get_subgraph_info(k);
// get the object referenced by the field
oop f = m->obj_field(field_offset);
*** 500,519 ****
} else {
ShouldNotReachHere();
}
}
! #define do_module_object_graph(archive_object_graph_do) \
! archive_object_graph_do(SystemDictionary::ArchivedModuleGraph_klass(), jdk_internal_module_ArchivedModuleGraph::archivedSystemModules_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ArchivedModuleGraph_klass(), jdk_internal_module_ArchivedModuleGraph::archivedModuleFinder_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ArchivedModuleGraph_klass(), jdk_internal_module_ArchivedModuleGraph::archivedMainModule_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ArchivedModuleGraph_klass(), jdk_internal_module_ArchivedModuleGraph::archivedConfiguration_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ImmutableCollections_ListN_klass(), java_util_ImmutableCollections_ListN::EMPTY_LIST_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ImmutableCollections_MapN_klass(), java_util_ImmutableCollections_MapN::EMPTY_MAP_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::ImmutableCollections_SetN_klass(), java_util_ImmutableCollections_SetN::EMPTY_SET_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::Integer_IntegerCache_klass(), java_lang_Integer_IntegerCache::archivedCache_offset(), T_OBJECT, CHECK); \
! archive_object_graph_do(SystemDictionary::Configuration_klass(), java_lang_module_Configuration::EMPTY_CONFIGURATION_offset(), T_OBJECT, CHECK)
void HeapShared::archive_module_graph_objects(Thread* THREAD) {
! do_module_object_graph(archive_reachable_objects_from_static_field);
}
#endif // INCLUDE_CDS_JAVA_HEAP
--- 502,580 ----
} else {
ShouldNotReachHere();
}
}
! struct ArchivableStaticFieldInfo {
! const char* class_name;
! const char* field_name;
! InstanceKlass* klass;
! int offset;
! BasicType type;
! };
!
! // If you add new entries to this table, you should know what you're doing!
! static ArchivableStaticFieldInfo archivable_static_fields[] = {
! {"jdk/internal/module/ArchivedModuleGraph", "archivedSystemModules"},
! {"jdk/internal/module/ArchivedModuleGraph", "archivedModuleFinder"},
! {"jdk/internal/module/ArchivedModuleGraph", "archivedMainModule"},
! {"jdk/internal/module/ArchivedModuleGraph", "archivedConfiguration"},
! {"java/util/ImmutableCollections$ListN", "EMPTY_LIST"},
! {"java/util/ImmutableCollections$MapN", "EMPTY_MAP"},
! {"java/util/ImmutableCollections$SetN", "EMPTY_SET"},
! {"java/lang/Integer$IntegerCache", "archivedCache"},
! {"java/lang/module/Configuration", "EMPTY_CONFIGURATION"},
! };
!
! const static int num_archivable_static_fields = sizeof(archivable_static_fields) / sizeof(ArchivableStaticFieldInfo);
!
! class ArchivableStaticFieldFinder: public FieldClosure {
! InstanceKlass* _ik;
! Symbol* _field_name;
! bool _found;
! int _offset;
! BasicType _type;
! public:
! ArchivableStaticFieldFinder(InstanceKlass* ik, Symbol* field_name) :
! _ik(ik), _field_name(field_name), _found(false), _offset(-1), _type(T_ILLEGAL) {}
!
! virtual void do_field(fieldDescriptor* fd) {
! if (fd->name() == _field_name) {
! assert(!_found, "fields cannot be overloaded");
! _found = true;
! _offset = fd->offset();
! _type = fd->field_type();
! assert(_type == T_OBJECT || _type == T_ARRAY, "can archive only obj or array fields");
! }
! }
! bool found() { return _found; }
! int offset() { return _offset; }
! BasicType type() { return _type; }
! };
!
! void HeapShared::init_archivable_static_fields(Thread* THREAD) {
! for (int i = 0; i < num_archivable_static_fields; i++) {
! ArchivableStaticFieldInfo* info = &archivable_static_fields[i];
! TempNewSymbol class_name = SymbolTable::new_symbol(info->class_name, THREAD);
! TempNewSymbol field_name = SymbolTable::new_symbol(info->field_name, THREAD);
!
! Klass* k = SystemDictionary::resolve_or_null(class_name, THREAD);
! assert(k != NULL && !HAS_PENDING_EXCEPTION, "class must exist");
! InstanceKlass* ik = InstanceKlass::cast(k);
!
! ArchivableStaticFieldFinder finder(ik, field_name);
! ik->do_local_static_fields(&finder);
! assert(finder.found(), "field must exist");
!
! info->klass = ik;
! info->offset = finder.offset();
! info->type = finder.type();
! }
! }
void HeapShared::archive_module_graph_objects(Thread* THREAD) {
! for (int i = 0; i < num_archivable_static_fields; i++) {
! ArchivableStaticFieldInfo* info = &archivable_static_fields[i];
! archive_reachable_objects_from_static_field(info->klass, info->offset, info->type, CHECK);
! }
}
#endif // INCLUDE_CDS_JAVA_HEAP
< prev index next >