< prev index next >
src/hotspot/share/memory/metaspaceShared.hpp
Print this page
*** 35,44 ****
--- 35,51 ----
#include "utilities/resourceHash.hpp"
#define MAX_SHARED_DELTA (0x7FFFFFFF)
class FileMapInfo;
+ class CHeapBitMap;
+
+ enum MapArchiveResult {
+ MAP_ARCHIVE_SUCCESS,
+ MAP_ARCHIVE_MMAP_FAILURE,
+ MAP_ARCHIVE_OTHER_FAILURE
+ };
class MetaspaceSharedStats {
public:
MetaspaceSharedStats() {
memset(this, 0, sizeof(*this));
*** 60,76 ****
DumpRegion(const char* name) : _name(name), _base(NULL), _top(NULL), _end(NULL), _is_packed(false) {}
char* expand_top_to(char* newtop);
char* allocate(size_t num_bytes, size_t alignment=BytesPerWord);
! void append_intptr_t(intptr_t n) {
! assert(is_aligned(_top, sizeof(intptr_t)), "bad alignment");
! intptr_t *p = (intptr_t*)_top;
! char* newtop = _top + sizeof(intptr_t);
! expand_top_to(newtop);
! *p = n;
! }
char* base() const { return _base; }
char* top() const { return _top; }
char* end() const { return _end; }
size_t reserved() const { return _end - _base; }
--- 67,77 ----
DumpRegion(const char* name) : _name(name), _base(NULL), _top(NULL), _end(NULL), _is_packed(false) {}
char* expand_top_to(char* newtop);
char* allocate(size_t num_bytes, size_t alignment=BytesPerWord);
! void append_intptr_t(intptr_t n, bool need_to_mark = false);
char* base() const { return _base; }
char* top() const { return _top; }
char* end() const { return _end; }
size_t reserved() const { return _end - _base; }
*** 115,143 ****
WriteClosure(DumpRegion* r) {
_dump_region = r;
}
void do_ptr(void** p) {
! _dump_region->append_intptr_t((intptr_t)*p);
}
void do_u4(u4* p) {
! void* ptr = (void*)(uintx(*p));
! do_ptr(&ptr);
}
void do_bool(bool *p) {
! void* ptr = (void*)(uintx(*p));
! do_ptr(&ptr);
}
void do_tag(int tag) {
_dump_region->append_intptr_t((intptr_t)tag);
}
void do_oop(oop* o);
void do_region(u_char* start, size_t size);
bool reading() const { return false; }
};
--- 116,144 ----
WriteClosure(DumpRegion* r) {
_dump_region = r;
}
void do_ptr(void** p) {
! _dump_region->append_intptr_t((intptr_t)*p, true);
}
void do_u4(u4* p) {
! _dump_region->append_intptr_t((intptr_t)(*p));
}
void do_bool(bool *p) {
! _dump_region->append_intptr_t((intptr_t)(*p));
}
void do_tag(int tag) {
_dump_region->append_intptr_t((intptr_t)tag);
}
void do_oop(oop* o);
+ void do_mirror_oop(oop* o) { do_oop(o); }
+
void do_region(u_char* start, size_t size);
bool reading() const { return false; }
};
*** 163,178 ****
void do_tag(int tag);
void do_oop(oop *p);
void do_region(u_char* start, size_t size);
bool reading() const { return true; }
};
! #endif
// Class Data Sharing Support
class MetaspaceShared : AllStatic {
// CDS support
--- 164,181 ----
void do_tag(int tag);
void do_oop(oop *p);
+ void do_mirror_oop(oop* o);
+
void do_region(u_char* start, size_t size);
bool reading() const { return true; }
};
! #endif // INCLUDE_CDS
// Class Data Sharing Support
class MetaspaceShared : AllStatic {
// CDS support
*** 185,206 ****
static bool _remapped_readwrite;
static address _i2i_entry_code_buffers;
static size_t _i2i_entry_code_buffers_size;
static size_t _core_spaces_size;
static void* _shared_metaspace_static_top;
public:
enum {
// core archive spaces
mc = 0, // miscellaneous code for method trampolines
rw = 1, // read-write shared space in the heap
ro = 2, // read-only shared space in the heap
md = 3, // miscellaneous data for initializing tables, etc.
! num_core_spaces = 4, // number of non-string regions
! num_non_heap_spaces = 4,
// mapped java heap regions
! first_closed_archive_heap_region = md + 1,
max_closed_archive_heap_region = 2,
last_closed_archive_heap_region = first_closed_archive_heap_region + max_closed_archive_heap_region - 1,
first_open_archive_heap_region = last_closed_archive_heap_region + 1,
max_open_archive_heap_region = 2,
last_open_archive_heap_region = first_open_archive_heap_region + max_open_archive_heap_region - 1,
--- 188,211 ----
static bool _remapped_readwrite;
static address _i2i_entry_code_buffers;
static size_t _i2i_entry_code_buffers_size;
static size_t _core_spaces_size;
static void* _shared_metaspace_static_top;
+ static intx _mapping_delta; // FIXME rename
public:
enum {
// core archive spaces
mc = 0, // miscellaneous code for method trampolines
rw = 1, // read-write shared space in the heap
ro = 2, // read-only shared space in the heap
md = 3, // miscellaneous data for initializing tables, etc.
! bm = 4, // relocation bitmaps (freed after file mapping is finished)
! num_core_region = 4,
! num_non_heap_spaces = 5,
// mapped java heap regions
! first_closed_archive_heap_region = bm + 1,
max_closed_archive_heap_region = 2,
last_closed_archive_heap_region = first_closed_archive_heap_region + max_closed_archive_heap_region - 1,
first_open_archive_heap_region = last_closed_archive_heap_region + 1,
max_open_archive_heap_region = 2,
last_open_archive_heap_region = first_open_archive_heap_region + max_open_archive_heap_region - 1,
*** 218,237 ****
static ReservedSpace* shared_rs() {
CDS_ONLY(return &_shared_rs);
NOT_CDS(return NULL);
}
! static void commit_shared_space_to(char* newtop) NOT_CDS_RETURN;
! static size_t core_spaces_size() {
! assert(DumpSharedSpaces || UseSharedSpaces, "sanity");
! assert(_core_spaces_size != 0, "sanity");
! return _core_spaces_size;
}
static void initialize_dumptime_shared_and_meta_spaces() NOT_CDS_RETURN;
static void initialize_runtime_shared_and_meta_spaces() NOT_CDS_RETURN;
- static char* initialize_dynamic_runtime_shared_spaces(
- char* static_start, char* static_end) NOT_CDS_RETURN_(NULL);
static void post_initialize(TRAPS) NOT_CDS_RETURN;
// Delta of this object from SharedBaseAddress
static uintx object_delta_uintx(void* obj);
--- 223,240 ----
static ReservedSpace* shared_rs() {
CDS_ONLY(return &_shared_rs);
NOT_CDS(return NULL);
}
!
! static void set_shared_rs(ReservedSpace rs) {
! CDS_ONLY(_shared_rs = rs);
}
+
+ static void commit_shared_space_to(char* newtop) NOT_CDS_RETURN;
static void initialize_dumptime_shared_and_meta_spaces() NOT_CDS_RETURN;
static void initialize_runtime_shared_and_meta_spaces() NOT_CDS_RETURN;
static void post_initialize(TRAPS) NOT_CDS_RETURN;
// Delta of this object from SharedBaseAddress
static uintx object_delta_uintx(void* obj);
*** 243,268 ****
}
static void set_archive_loading_failed() {
_archive_loading_failed = true;
}
static bool map_shared_spaces(FileMapInfo* mapinfo) NOT_CDS_RETURN_(false);
static void initialize_shared_spaces() NOT_CDS_RETURN;
// Return true if given address is in the shared metaspace regions (i.e., excluding any
// mapped shared heap regions.)
static bool is_in_shared_metaspace(const void* p) {
! // If no shared metaspace regions are mapped, MetaspceObj::_shared_metaspace_{base,top} will
! // both be NULL and all values of p will be rejected quickly.
! return (p < MetaspaceObj::shared_metaspace_top() && p >= MetaspaceObj::shared_metaspace_base());
}
static address shared_metaspace_top() {
return (address)MetaspaceObj::shared_metaspace_top();
}
! static void set_shared_metaspace_range(void* base, void* top) NOT_CDS_RETURN;
// Return true if given address is in the shared region corresponding to the idx
static bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
static bool is_in_trampoline_frame(address addr) NOT_CDS_RETURN_(false);
--- 246,274 ----
}
static void set_archive_loading_failed() {
_archive_loading_failed = true;
}
+ static bool is_in_output_space(void* ptr) {
+ assert(DumpSharedSpaces, "must be");
+ return shared_rs()->contains(ptr);
+ }
+
static bool map_shared_spaces(FileMapInfo* mapinfo) NOT_CDS_RETURN_(false);
static void initialize_shared_spaces() NOT_CDS_RETURN;
// Return true if given address is in the shared metaspace regions (i.e., excluding any
// mapped shared heap regions.)
static bool is_in_shared_metaspace(const void* p) {
! return MetaspaceObj::is_shared((const MetaspaceObj*)p);
}
static address shared_metaspace_top() {
return (address)MetaspaceObj::shared_metaspace_top();
}
! static void set_shared_metaspace_range(void* base, void *static_top, void* top) NOT_CDS_RETURN;
// Return true if given address is in the shared region corresponding to the idx
static bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
static bool is_in_trampoline_frame(address addr) NOT_CDS_RETURN_(false);
*** 296,307 ****
static bool try_link_class(InstanceKlass* ik, TRAPS);
static void link_and_cleanup_shared_classes(TRAPS);
#if INCLUDE_CDS
! static ReservedSpace* reserve_shared_rs(size_t size, size_t alignment,
! bool large, char* requested_address);
static void init_shared_dump_space(DumpRegion* first_space, address first_space_bottom = NULL);
static DumpRegion* misc_code_dump_space();
static DumpRegion* read_write_dump_space();
static DumpRegion* read_only_dump_space();
static void pack_dump_space(DumpRegion* current, DumpRegion* next,
--- 302,313 ----
static bool try_link_class(InstanceKlass* ik, TRAPS);
static void link_and_cleanup_shared_classes(TRAPS);
#if INCLUDE_CDS
! static ReservedSpace reserve_shared_space(size_t size, char* requested_address = NULL);
! static size_t reserved_space_alignment();
static void init_shared_dump_space(DumpRegion* first_space, address first_space_bottom = NULL);
static DumpRegion* misc_code_dump_space();
static DumpRegion* read_write_dump_space();
static DumpRegion* read_only_dump_space();
static void pack_dump_space(DumpRegion* current, DumpRegion* next,
*** 340,352 ****
static size_t i2i_entry_code_buffers_size() {
return _i2i_entry_code_buffers_size;
}
static void relocate_klass_ptr(oop o);
! static Klass* get_relocated_klass(Klass *k);
static intptr_t* fix_cpp_vtable_for_dynamic_archive(MetaspaceObj::Type msotype, address obj);
!
private:
static void read_extra_data(const char* filename, TRAPS) NOT_CDS_RETURN;
};
#endif // SHARE_MEMORY_METASPACESHARED_HPP
--- 346,380 ----
static size_t i2i_entry_code_buffers_size() {
return _i2i_entry_code_buffers_size;
}
static void relocate_klass_ptr(oop o);
! static Klass* get_relocated_klass(Klass *k, bool is_final=false); // FIXME name
static intptr_t* fix_cpp_vtable_for_dynamic_archive(MetaspaceObj::Type msotype, address obj);
! static void initialize_ptr_marker(CHeapBitMap* ptrmap);
! static intx mapping_delta() { return _mapping_delta; } // FIXME rename
! static intx final_delta(); // FIXME rename
! static bool use_windows_memory_mapping() {
! const bool is_windows = (NOT_WINDOWS(false) WINDOWS_ONLY(true));
! //const bool is_windows = true; // enable this to allow testing the windows mmap semantics on Linux, etc.
! return is_windows;
! }
private:
static void read_extra_data(const char* filename, TRAPS) NOT_CDS_RETURN;
+ static FileMapInfo* open_static_archive();
+ static FileMapInfo* open_dynamic_archive();
+ static MapArchiveResult map_archives(FileMapInfo* static_mapinfo, FileMapInfo* dynamic_mapinfo,
+ bool use_requested_addr);
+ static char* reserve_address_space_for_archives(FileMapInfo* static_mapinfo,
+ FileMapInfo* dynamic_mapinfo,
+ bool use_requested_addr,
+ ReservedSpace& main_rs,
+ ReservedSpace& archive_space_rs,
+ ReservedSpace& class_space_rs);
+ static void release_reserved_spaces(ReservedSpace& main_rs,
+ ReservedSpace& archive_space_rs,
+ ReservedSpace& class_space_rs);
+ static MapArchiveResult map_archive(FileMapInfo* mapinfo, char* mapped_base_address, ReservedSpace rs);
+ static void unmap_archive(FileMapInfo* mapinfo);
};
#endif // SHARE_MEMORY_METASPACESHARED_HPP
< prev index next >