mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8178351: Simplify MetaspaceShared::is_in_shared_space and MetaspaceObj::is_shared
Use a single range check with MetaspaceObj::_shared_metaspace_{base,top} Reviewed-by: jiangli, redestad, shade
This commit is contained in:
parent
dcb4e73a38
commit
a3cb6e9204
15 changed files with 93 additions and 90 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "memory/filemap.hpp"
|
#include "memory/metaspaceShared.hpp"
|
||||||
#include "runtime/arguments.hpp"
|
#include "runtime/arguments.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -153,8 +153,7 @@ void VMError::check_failing_cds_access(outputStream* st, const void* siginfo) {
|
||||||
if (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) {
|
if (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) {
|
||||||
const void* const fault_addr = si->si_addr;
|
const void* const fault_addr = si->si_addr;
|
||||||
if (fault_addr != NULL) {
|
if (fault_addr != NULL) {
|
||||||
FileMapInfo* const mapinfo = FileMapInfo::current_info();
|
if (MetaspaceShared::is_in_shared_metaspace(fault_addr)) {
|
||||||
if (mapinfo->is_in_shared_space(fault_addr)) {
|
|
||||||
st->print("Error accessing class data sharing archive. "
|
st->print("Error accessing class data sharing archive. "
|
||||||
"Mapped file inaccessible during execution, possible disk/network problem.");
|
"Mapped file inaccessible during execution, possible disk/network problem.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "memory/filemap.hpp"
|
#include "memory/metaspaceShared.hpp"
|
||||||
#include "runtime/arguments.hpp"
|
#include "runtime/arguments.hpp"
|
||||||
#include "runtime/os.hpp"
|
#include "runtime/os.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -58,8 +58,7 @@ void VMError::check_failing_cds_access(outputStream* st, const void* siginfo) {
|
||||||
er->NumberParameters >= 2) {
|
er->NumberParameters >= 2) {
|
||||||
const void* const fault_addr = (const void*) er->ExceptionInformation[1];
|
const void* const fault_addr = (const void*) er->ExceptionInformation[1];
|
||||||
if (fault_addr != NULL) {
|
if (fault_addr != NULL) {
|
||||||
FileMapInfo* const mapinfo = FileMapInfo::current_info();
|
if (MetaspaceShared::is_in_shared_metaspace(fault_addr)) {
|
||||||
if (mapinfo->is_in_shared_space(fault_addr)) {
|
|
||||||
st->print("Error accessing class data sharing archive. "
|
st->print("Error accessing class data sharing archive. "
|
||||||
"Mapped file inaccessible during execution, possible disk/network problem.");
|
"Mapped file inaccessible during execution, possible disk/network problem.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -28,7 +28,6 @@
|
||||||
#include "interpreter/interpreter.hpp"
|
#include "interpreter/interpreter.hpp"
|
||||||
#include "interpreter/rewriter.hpp"
|
#include "interpreter/rewriter.hpp"
|
||||||
#include "memory/metadataFactory.hpp"
|
#include "memory/metadataFactory.hpp"
|
||||||
#include "memory/metaspaceShared.hpp"
|
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
#include "oops/generateOopMap.hpp"
|
#include "oops/generateOopMap.hpp"
|
||||||
#include "prims/methodHandles.hpp"
|
#include "prims/methodHandles.hpp"
|
||||||
|
@ -556,7 +555,7 @@ void Rewriter::rewrite_bytecodes(TRAPS) {
|
||||||
|
|
||||||
void Rewriter::rewrite(InstanceKlass* klass, TRAPS) {
|
void Rewriter::rewrite(InstanceKlass* klass, TRAPS) {
|
||||||
if (!DumpSharedSpaces) {
|
if (!DumpSharedSpaces) {
|
||||||
assert(!MetaspaceShared::is_in_shared_space(klass), "archive methods must not be rewritten at run time");
|
assert(!klass->is_shared(), "archive methods must not be rewritten at run time");
|
||||||
}
|
}
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
Rewriter rw(klass, klass->constants(), klass->methods(), CHECK);
|
Rewriter rw(klass, klass->constants(), klass->methods(), CHECK);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -37,6 +37,9 @@
|
||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
|
|
||||||
|
void* MetaspaceObj::_shared_metaspace_base = NULL;
|
||||||
|
void* MetaspaceObj::_shared_metaspace_top = NULL;
|
||||||
|
|
||||||
void* StackObj::operator new(size_t size) throw() { ShouldNotCallThis(); return 0; }
|
void* StackObj::operator new(size_t size) throw() { ShouldNotCallThis(); return 0; }
|
||||||
void StackObj::operator delete(void* p) { ShouldNotCallThis(); }
|
void StackObj::operator delete(void* p) { ShouldNotCallThis(); }
|
||||||
void* StackObj::operator new [](size_t size) throw() { ShouldNotCallThis(); return 0; }
|
void* StackObj::operator new [](size_t size) throw() { ShouldNotCallThis(); return 0; }
|
||||||
|
@ -54,10 +57,6 @@ void* MetaspaceObj::operator new(size_t size, ClassLoaderData* loader_data,
|
||||||
return Metaspace::allocate(loader_data, word_size, type, THREAD);
|
return Metaspace::allocate(loader_data, word_size, type, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MetaspaceObj::is_shared() const {
|
|
||||||
return MetaspaceShared::is_in_shared_space(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MetaspaceObj::is_metaspace_object() const {
|
bool MetaspaceObj::is_metaspace_object() const {
|
||||||
return Metaspace::contains((void*)this);
|
return Metaspace::contains((void*)this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -227,9 +227,23 @@ class ClassLoaderData;
|
||||||
class MetaspaceClosure;
|
class MetaspaceClosure;
|
||||||
|
|
||||||
class MetaspaceObj {
|
class MetaspaceObj {
|
||||||
|
friend class MetaspaceShared;
|
||||||
|
// When CDS is enabled, all shared metaspace objects are mapped
|
||||||
|
// into a single contiguous memory block, so we can use these
|
||||||
|
// two pointers to quickly determine if something is in the
|
||||||
|
// shared metaspace.
|
||||||
|
//
|
||||||
|
// When CDS is not enabled, both pointers are set to NULL.
|
||||||
|
static void* _shared_metaspace_base; // (inclusive) low address
|
||||||
|
static void* _shared_metaspace_top; // (exclusive) high address
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool is_metaspace_object() const;
|
bool is_metaspace_object() const;
|
||||||
bool is_shared() const;
|
bool is_shared() const {
|
||||||
|
// If no shared metaspace regions are mapped, _shared_metaspace_{base,top} will
|
||||||
|
// both be NULL and all values of p will be rejected quickly.
|
||||||
|
return (((void*)this) < _shared_metaspace_top && ((void*)this) >= _shared_metaspace_base);
|
||||||
|
}
|
||||||
void print_address_on(outputStream* st) const; // nonvirtual address printing
|
void print_address_on(outputStream* st) const; // nonvirtual address printing
|
||||||
|
|
||||||
#define METASPACE_OBJ_TYPES_DO(f) \
|
#define METASPACE_OBJ_TYPES_DO(f) \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -659,7 +659,7 @@ ReservedSpace FileMapInfo::reserve_shared_memory() {
|
||||||
static const char* shared_region_name[] = { "MiscData", "ReadWrite", "ReadOnly", "MiscCode", "OptionalData",
|
static const char* shared_region_name[] = { "MiscData", "ReadWrite", "ReadOnly", "MiscCode", "OptionalData",
|
||||||
"String1", "String2", "OpenArchive1", "OpenArchive2" };
|
"String1", "String2", "OpenArchive1", "OpenArchive2" };
|
||||||
|
|
||||||
char* FileMapInfo::map_region(int i) {
|
char* FileMapInfo::map_region(int i, char** top_ret) {
|
||||||
assert(!MetaspaceShared::is_heap_region(i), "sanity");
|
assert(!MetaspaceShared::is_heap_region(i), "sanity");
|
||||||
struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
|
struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
|
||||||
size_t used = si->_used;
|
size_t used = si->_used;
|
||||||
|
@ -686,6 +686,12 @@ char* FileMapInfo::map_region(int i) {
|
||||||
MemTracker::record_virtual_memory_type((address)base, mtClassShared);
|
MemTracker::record_virtual_memory_type((address)base, mtClassShared);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (!verify_region_checksum(i)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*top_ret = base + size;
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1040,27 +1046,6 @@ bool FileMapInfo::validate_header() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following method is provided to see whether a given pointer
|
|
||||||
// falls in the mapped shared metadata space.
|
|
||||||
// Param:
|
|
||||||
// p, The given pointer
|
|
||||||
// Return:
|
|
||||||
// True if the p is within the mapped shared space, otherwise, false.
|
|
||||||
bool FileMapInfo::is_in_shared_space(const void* p) {
|
|
||||||
for (int i = 0; i < MetaspaceShared::num_non_heap_spaces; i++) {
|
|
||||||
char *base;
|
|
||||||
if (_header->_space[i]._used == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
base = _header->region_addr(i);
|
|
||||||
if (p >= base && p < base + _header->_space[i]._used) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if a given address is within one of the shared regions
|
// Check if a given address is within one of the shared regions
|
||||||
bool FileMapInfo::is_in_shared_region(const void* p, int idx) {
|
bool FileMapInfo::is_in_shared_region(const void* p, int idx) {
|
||||||
assert(idx == MetaspaceShared::ro ||
|
assert(idx == MetaspaceShared::ro ||
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -248,7 +248,7 @@ public:
|
||||||
int first_region_id, int max_num_regions);
|
int first_region_id, int max_num_regions);
|
||||||
void write_bytes(const void* buffer, int count);
|
void write_bytes(const void* buffer, int count);
|
||||||
void write_bytes_aligned(const void* buffer, int count);
|
void write_bytes_aligned(const void* buffer, int count);
|
||||||
char* map_region(int i);
|
char* map_region(int i, char** top_ret);
|
||||||
void map_heap_regions() 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 fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
|
||||||
void unmap_region(int i);
|
void unmap_region(int i);
|
||||||
|
@ -265,8 +265,6 @@ public:
|
||||||
static void fail_stop(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
|
static void fail_stop(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
|
||||||
static void fail_continue(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
|
static void fail_continue(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
|
||||||
|
|
||||||
// Return true if given address is in the mapped shared space.
|
|
||||||
bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false);
|
|
||||||
bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
|
bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
|
||||||
void print_shared_spaces() NOT_CDS_RETURN;
|
void print_shared_spaces() NOT_CDS_RETURN;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -4070,7 +4070,7 @@ void Metaspace::print_on(outputStream* out) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Metaspace::contains(const void* ptr) {
|
bool Metaspace::contains(const void* ptr) {
|
||||||
if (UseSharedSpaces && MetaspaceShared::is_in_shared_space(ptr)) {
|
if (MetaspaceShared::is_in_shared_metaspace(ptr)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return contains_non_shared(ptr);
|
return contains_non_shared(ptr);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -746,7 +746,7 @@ void MetaspaceShared::patch_cpp_vtable_pointers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MetaspaceShared::is_valid_shared_method(const Method* m) {
|
bool MetaspaceShared::is_valid_shared_method(const Method* m) {
|
||||||
assert(is_in_shared_space(m), "must be");
|
assert(is_in_shared_metaspace(m), "must be");
|
||||||
return CppVtableCloner<Method>::is_valid_shared_object(m);
|
return CppVtableCloner<Method>::is_valid_shared_object(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1819,11 +1819,6 @@ public:
|
||||||
bool reading() const { return true; }
|
bool reading() const { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return true if given address is in the mapped shared space.
|
|
||||||
bool MetaspaceShared::is_in_shared_space(const void* p) {
|
|
||||||
return UseSharedSpaces && FileMapInfo::current_info()->is_in_shared_space(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return true if given address is in the misc data region
|
// Return true if given address is in the misc data region
|
||||||
bool MetaspaceShared::is_in_shared_region(const void* p, int idx) {
|
bool MetaspaceShared::is_in_shared_region(const void* p, int idx) {
|
||||||
return UseSharedSpaces && FileMapInfo::current_info()->is_in_shared_region(p, idx);
|
return UseSharedSpaces && FileMapInfo::current_info()->is_in_shared_region(p, idx);
|
||||||
|
@ -1857,35 +1852,46 @@ bool MetaspaceShared::map_shared_spaces(FileMapInfo* mapinfo) {
|
||||||
|
|
||||||
assert(!DumpSharedSpaces, "Should not be called with DumpSharedSpaces");
|
assert(!DumpSharedSpaces, "Should not be called with DumpSharedSpaces");
|
||||||
|
|
||||||
char* _ro_base = NULL;
|
char* ro_base = NULL; char* ro_top;
|
||||||
char* _rw_base = NULL;
|
char* rw_base = NULL; char* rw_top;
|
||||||
char* _mc_base = NULL;
|
char* mc_base = NULL; char* mc_top;
|
||||||
char* _md_base = NULL;
|
char* md_base = NULL; char* md_top;
|
||||||
char* _od_base = NULL;
|
char* od_base = NULL; char* od_top;
|
||||||
|
|
||||||
// Map each shared region
|
// Map each shared region
|
||||||
if ((_mc_base = mapinfo->map_region(mc)) != NULL &&
|
if ((mc_base = mapinfo->map_region(mc, &mc_top)) != NULL &&
|
||||||
mapinfo->verify_region_checksum(mc) &&
|
(rw_base = mapinfo->map_region(rw, &rw_top)) != NULL &&
|
||||||
(_rw_base = mapinfo->map_region(rw)) != NULL &&
|
(ro_base = mapinfo->map_region(ro, &ro_top)) != NULL &&
|
||||||
mapinfo->verify_region_checksum(rw) &&
|
(md_base = mapinfo->map_region(md, &md_top)) != NULL &&
|
||||||
(_ro_base = mapinfo->map_region(ro)) != NULL &&
|
(od_base = mapinfo->map_region(od, &od_top)) != NULL &&
|
||||||
mapinfo->verify_region_checksum(ro) &&
|
|
||||||
(_md_base = mapinfo->map_region(md)) != NULL &&
|
|
||||||
mapinfo->verify_region_checksum(md) &&
|
|
||||||
(_od_base = mapinfo->map_region(od)) != NULL &&
|
|
||||||
mapinfo->verify_region_checksum(od) &&
|
|
||||||
(image_alignment == (size_t)os::vm_allocation_granularity()) &&
|
(image_alignment == (size_t)os::vm_allocation_granularity()) &&
|
||||||
mapinfo->validate_classpath_entry_table()) {
|
mapinfo->validate_classpath_entry_table()) {
|
||||||
// Success (no need to do anything)
|
// Success -- set up MetaspaceObj::_shared_metaspace_{base,top} for
|
||||||
|
// fast checking in MetaspaceShared::is_in_shared_metaspace() and
|
||||||
|
// MetaspaceObj::is_shared().
|
||||||
|
//
|
||||||
|
// We require that mc->rw->ro->md->od to be laid out consecutively, with no
|
||||||
|
// gaps between them. That way, we can ensure that the OS won't be able to
|
||||||
|
// allocate any new memory spaces inside _shared_metaspace_{base,top}, which
|
||||||
|
// would mess up the simple comparision in MetaspaceShared::is_in_shared_metaspace().
|
||||||
|
assert(mc_base < ro_base && mc_base < rw_base && mc_base < md_base && mc_base < od_base, "must be");
|
||||||
|
assert(od_top > ro_top && od_top > rw_top && od_top > md_top && od_top > mc_top , "must be");
|
||||||
|
assert(mc_top == rw_base, "must be");
|
||||||
|
assert(rw_top == ro_base, "must be");
|
||||||
|
assert(ro_top == md_base, "must be");
|
||||||
|
assert(md_top == od_base, "must be");
|
||||||
|
|
||||||
|
MetaspaceObj::_shared_metaspace_base = (void*)mc_base;
|
||||||
|
MetaspaceObj::_shared_metaspace_top = (void*)od_top;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
// If there was a failure in mapping any of the spaces, unmap the ones
|
// If there was a failure in mapping any of the spaces, unmap the ones
|
||||||
// that succeeded
|
// that succeeded
|
||||||
if (_ro_base != NULL) mapinfo->unmap_region(ro);
|
if (ro_base != NULL) mapinfo->unmap_region(ro);
|
||||||
if (_rw_base != NULL) mapinfo->unmap_region(rw);
|
if (rw_base != NULL) mapinfo->unmap_region(rw);
|
||||||
if (_mc_base != NULL) mapinfo->unmap_region(mc);
|
if (mc_base != NULL) mapinfo->unmap_region(mc);
|
||||||
if (_md_base != NULL) mapinfo->unmap_region(md);
|
if (md_base != NULL) mapinfo->unmap_region(md);
|
||||||
if (_od_base != NULL) mapinfo->unmap_region(od);
|
if (od_base != NULL) mapinfo->unmap_region(od);
|
||||||
#ifndef _WINDOWS
|
#ifndef _WINDOWS
|
||||||
// Release the entire mapped region
|
// Release the entire mapped region
|
||||||
shared_rs.release();
|
shared_rs.release();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -164,8 +164,13 @@ class MetaspaceShared : AllStatic {
|
||||||
static bool map_shared_spaces(FileMapInfo* mapinfo) NOT_CDS_RETURN_(false);
|
static bool map_shared_spaces(FileMapInfo* mapinfo) NOT_CDS_RETURN_(false);
|
||||||
static void initialize_shared_spaces() NOT_CDS_RETURN;
|
static void initialize_shared_spaces() NOT_CDS_RETURN;
|
||||||
|
|
||||||
// Return true if given address is in the mapped shared space.
|
// Return true if given address is in the shared metaspace regions (i.e., excluding any
|
||||||
static bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false);
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
// Return true if given address is in the shared region corresponding to the idx
|
// 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_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
|
||||||
|
|
|
@ -2229,7 +2229,7 @@ void InstanceKlass::release_C_heap_structures() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// deallocate the cached class file
|
// deallocate the cached class file
|
||||||
if (_cached_class_file != NULL && !MetaspaceShared::is_in_shared_space(_cached_class_file)) {
|
if (_cached_class_file != NULL && !MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) {
|
||||||
os::free(_cached_class_file);
|
os::free(_cached_class_file);
|
||||||
_cached_class_file = NULL;
|
_cached_class_file = NULL;
|
||||||
}
|
}
|
||||||
|
@ -3732,7 +3732,7 @@ Method* InstanceKlass::method_with_orig_idnum(int idnum, int version) {
|
||||||
|
|
||||||
#if INCLUDE_JVMTI
|
#if INCLUDE_JVMTI
|
||||||
JvmtiCachedClassFileData* InstanceKlass::get_cached_class_file() {
|
JvmtiCachedClassFileData* InstanceKlass::get_cached_class_file() {
|
||||||
if (MetaspaceShared::is_in_shared_space(_cached_class_file)) {
|
if (MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) {
|
||||||
// Ignore the archived class stream data
|
// Ignore the archived class stream data
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3754,7 +3754,7 @@ JvmtiCachedClassFileData* InstanceKlass::get_archived_class_data() {
|
||||||
return _cached_class_file;
|
return _cached_class_file;
|
||||||
} else {
|
} else {
|
||||||
assert(this->is_shared(), "class should be shared");
|
assert(this->is_shared(), "class should be shared");
|
||||||
if (MetaspaceShared::is_in_shared_space(_cached_class_file)) {
|
if (MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) {
|
||||||
return _cached_class_file;
|
return _cached_class_file;
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -1040,7 +1040,7 @@ void itableMethodEntry::initialize(Method* m) {
|
||||||
if (m == NULL) return;
|
if (m == NULL) return;
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
if (MetaspaceShared::is_in_shared_space((void*)&_method) &&
|
if (MetaspaceShared::is_in_shared_metaspace((void*)&_method) &&
|
||||||
!MetaspaceShared::remapped_readwrite()) {
|
!MetaspaceShared::remapped_readwrite()) {
|
||||||
// At runtime initialize_itable is rerun as part of link_class_impl()
|
// At runtime initialize_itable is rerun as part of link_class_impl()
|
||||||
// for a shared class loaded by the non-boot loader.
|
// for a shared class loaded by the non-boot loader.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -2180,7 +2180,7 @@ bool Method::is_valid_method() const {
|
||||||
} else if ((intptr_t(this) & (wordSize-1)) != 0) {
|
} else if ((intptr_t(this) & (wordSize-1)) != 0) {
|
||||||
// Quick sanity check on pointer.
|
// Quick sanity check on pointer.
|
||||||
return false;
|
return false;
|
||||||
} else if (MetaspaceShared::is_in_shared_space(this)) {
|
} else if (is_shared()) {
|
||||||
return MetaspaceShared::is_valid_shared_method(this);
|
return MetaspaceShared::is_valid_shared_method(this);
|
||||||
} else if (Metaspace::contains_non_shared(this)) {
|
} else if (Metaspace::contains_non_shared(this)) {
|
||||||
return has_method_vptr((const void*)this);
|
return has_method_vptr((const void*)this);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -1702,7 +1702,7 @@ WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
|
||||||
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))
|
||||||
return (jboolean)MetaspaceShared::is_in_shared_space(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
|
return (jboolean)MetaspaceShared::is_in_shared_metaspace(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
|
||||||
WB_END
|
WB_END
|
||||||
|
|
||||||
WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
|
WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include "classfile/protectionDomainCache.hpp"
|
#include "classfile/protectionDomainCache.hpp"
|
||||||
#include "classfile/stringTable.hpp"
|
#include "classfile/stringTable.hpp"
|
||||||
#include "memory/allocation.inline.hpp"
|
#include "memory/allocation.inline.hpp"
|
||||||
#include "memory/filemap.hpp"
|
#include "memory/metaspaceShared.hpp"
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "runtime/safepoint.hpp"
|
#include "runtime/safepoint.hpp"
|
||||||
|
@ -161,8 +161,7 @@ template <MEMFLAGS F> void BasicHashtable<F>::free_buckets() {
|
||||||
if (NULL != _buckets) {
|
if (NULL != _buckets) {
|
||||||
// Don't delete the buckets in the shared space. They aren't
|
// Don't delete the buckets in the shared space. They aren't
|
||||||
// allocated by os::malloc
|
// allocated by os::malloc
|
||||||
if (!UseSharedSpaces ||
|
if (!MetaspaceShared::is_in_shared_metaspace(_buckets)) {
|
||||||
!FileMapInfo::current_info()->is_in_shared_space(_buckets)) {
|
|
||||||
FREE_C_HEAP_ARRAY(HashtableBucket, _buckets);
|
FREE_C_HEAP_ARRAY(HashtableBucket, _buckets);
|
||||||
}
|
}
|
||||||
_buckets = NULL;
|
_buckets = NULL;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue