< prev index next >
src/hotspot/share/memory/filemap.hpp
Print this page
@@ -86,10 +86,15 @@
void set_manifest(Array<u1>* manifest) {
_manifest = manifest;
}
};
+struct ArchiveHeapOopmapInfo {
+ address _oopmap; // bitmap for relocating embedded oops
+ size_t _oopmap_size_in_bits;
+};
+
struct FileMapHeader : public CDSFileMapHeaderBase {
size_t _alignment; // how shared archive should be aligned
int _obj_alignment; // value of ObjectAlignmentInBytes
address _narrow_oop_base; // compressed oop encoding base
int _narrow_oop_shift; // compressed oop encoding shift
@@ -102,10 +107,11 @@
char* _read_only_tables_start;
address _cds_i2i_entry_code_buffers;
size_t _cds_i2i_entry_code_buffers_size;
size_t _core_spaces_size; // number of bytes allocated by the core spaces
// (mc, md, ro, rw and od).
+ MemRegion _heap_reserved; // reserved region for the entire heap at dump time.
// The following fields are all sanity checks for whether this archive
// will function correctly with this JVM and the bootclasspath it's
// invoked with.
char _jvm_ident[JVM_IDENT_MAX]; // identifier for jvm
@@ -150,17 +156,19 @@
}
bool has_platform_or_app_classes() { return _has_platform_or_app_classes; }
jshort max_used_path_index() { return _max_used_path_index; }
jshort app_module_paths_start_index() { return _app_module_paths_start_index; }
- char* region_addr(int idx);
-
bool validate();
void populate(FileMapInfo* info, size_t alignment);
int compute_crc();
-};
+ CDSFileMapRegion* space_at(int i) {
+ assert(i >= 0 && i < NUM_CDS_REGIONS, "invalid region");
+ return &_space[i];
+ }
+};
class FileMapInfo : public CHeapObj<mtInternal> {
private:
friend class ManifestStream;
friend class VMStructs;
@@ -192,10 +200,11 @@
const char* _full_path;
char* _paths_misc_info;
static FileMapInfo* _current_info;
+ static bool _heap_pointers_need_patching;
bool init_from_file(int fd);
void align_file_position();
bool validate_header_impl();
static void metaspace_pointers_do(MetaspaceClosure* it);
@@ -251,16 +260,23 @@
void open_for_write();
void write_header();
void write_region(int region, char* base, size_t size,
bool read_only, bool allow_exec);
size_t write_archive_heap_regions(GrowableArray<MemRegion> *heap_mem,
+ GrowableArray<ArchiveHeapOopmapInfo> *oopmaps,
int first_region_id, int max_num_regions);
void write_bytes(const void* buffer, size_t count);
void write_bytes_aligned(const void* buffer, size_t count);
char* map_region(int i, char** top_ret);
+ void map_heap_regions_impl() NOT_CDS_JAVA_HEAP_RETURN;
void map_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
void fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
+ void patch_archived_heap_embedded_pointers() NOT_CDS_JAVA_HEAP_RETURN;
+ void patch_archived_heap_embedded_pointers(MemRegion* ranges, int num_ranges,
+ int first_region_idx) NOT_CDS_JAVA_HEAP_RETURN;
+ bool has_heap_regions() NOT_CDS_JAVA_HEAP_RETURN_(false);
+ MemRegion get_heap_regions_range_with_current_oop_encoding_mode() NOT_CDS_JAVA_HEAP_RETURN_(MemRegion());
void unmap_region(int i);
bool verify_region_checksum(int i);
void close();
bool is_open() { return _file_open; }
ReservedSpace reserve_shared_memory();
@@ -272,11 +288,10 @@
// Errors.
static void fail_stop(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
static void fail_continue(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
- void print_shared_spaces() NOT_CDS_RETURN;
// Stop CDS sharing and unmap CDS regions.
static void stop_sharing_and_unmap(const char* msg);
static void allocate_shared_path_table();
@@ -301,18 +316,35 @@
static int get_number_of_shared_paths() {
return _shared_path_table_size;
}
+ char* region_addr(int idx);
+
private:
bool map_heap_data(MemRegion **heap_mem, int first, int max, int* num,
bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false);
bool verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false);
void dealloc_archive_heap_regions(MemRegion* regions, int num, bool is_open) NOT_CDS_JAVA_HEAP_RETURN;
CDSFileMapRegion* space_at(int i) {
- assert(i >= 0 && i < NUM_CDS_REGIONS, "invalid region");
- return &_header->_space[i];
+ return _header->space_at(i);
}
+
+ narrowOop offset_of_space(CDSFileMapRegion* spc) {
+ return (narrowOop)(spc->_addr._offset);
+ }
+
+ // The starting address of spc, as calculated with CompressedOop::decode_non_null()
+ address start_address_with_current_oop_encoding_mode(CDSFileMapRegion* spc) {
+ return decode_start_address(spc, true);
+ }
+
+ // The starting address of spc, as calculated with HeapShared::decode_with_archived_oop_encoding_mode()
+ address start_address_with_archived_oop_encoding_mode(CDSFileMapRegion* spc) {
+ return decode_start_address(spc, false);
+ }
+
+ address decode_start_address(CDSFileMapRegion* spc, bool with_current_oop_encoding_mode);
};
#endif // SHARE_VM_MEMORY_FILEMAP_HPP
< prev index next >