< prev index next >

src/hotspot/share/memory/metaspace.cpp

Print this page
*** 536,10 ***
--- 536,12 ---
  }
  
  //////  Metaspace methods /////
  
  const MetaspaceTracer* Metaspace::_tracer = nullptr;
+ const void* Metaspace::_class_space_start = nullptr;
+ const void* Metaspace::_class_space_end = nullptr;
  
  bool Metaspace::initialized() {
    return metaspace::MetaspaceContext::context_nonclass() != nullptr
        LP64_ONLY(&& (using_class_space() ? Metaspace::class_space_is_initialized() : true));
  }

*** 568,10 ***
--- 570,12 ---
    assert(is_aligned(rs.base(), Metaspace::reserve_alignment()) &&
           is_aligned(rs.size(), Metaspace::reserve_alignment()),
           "wrong alignment");
  
    MetaspaceContext::initialize_class_space_context(rs);
+   _class_space_start = rs.base();
+   _class_space_end = rs.end();
  }
  
  // Returns true if class space has been setup (initialize_class_space).
  bool Metaspace::class_space_is_initialized() {
    return MetaspaceContext::context_class() != nullptr;

*** 772,10 ***
--- 776,11 ---
  
      // Initialize space
      Metaspace::initialize_class_space(rs);
  
      // Set up compressed class pointer encoding.
+     // In CDS=off mode, we give the JVM some leeway to choose a favorable base/shift combination.
      CompressedKlassPointers::initialize((address)rs.base(), rs.size());
    }
  
  #endif
  

*** 840,13 ***
  
    // Try to allocate metadata.
    MetaWord* result = loader_data->metaspace_non_null()->allocate(word_size, mdtype);
  
    if (result != nullptr) {
      // Zero initialize.
      Copy::fill_to_words((HeapWord*)result, word_size, 0);
- 
      log_trace(metaspace)("Metaspace::allocate: type %d return " PTR_FORMAT ".", (int)type, p2i(result));
    }
  
    return result;
  }
--- 845,21 ---
  
    // Try to allocate metadata.
    MetaWord* result = loader_data->metaspace_non_null()->allocate(word_size, mdtype);
  
    if (result != nullptr) {
+ #ifdef ASSERT
+     if (using_class_space() && mdtype == ClassType) {
+       assert(is_in_class_space(result) &&
+              is_aligned(result, CompressedKlassPointers::klass_alignment_in_bytes()), "Sanity");
+     } else {
+       assert((is_in_class_space(result) || is_in_nonclass_metaspace(result)) &&
+              is_aligned(result, Metaspace::min_allocation_alignment_bytes), "Sanity");
+     }
+ #endif
      // Zero initialize.
      Copy::fill_to_words((HeapWord*)result, word_size, 0);
      log_trace(metaspace)("Metaspace::allocate: type %d return " PTR_FORMAT ".", (int)type, p2i(result));
    }
  
    return result;
  }

*** 975,19 ***
    // classes have been unloaded. However, this call is required for the code
    // in MetaspaceCriticalAllocation::try_allocate_critical to work.
    MetaspaceCriticalAllocation::process();
  }
  
! bool Metaspace::contains(const void* ptr) {
!   if (MetaspaceShared::is_in_shared_metaspace(ptr)) {
!     return true;
!   }
-   return contains_non_shared(ptr);
  }
  
! bool Metaspace::contains_non_shared(const void* ptr) {
!   if (using_class_space() && VirtualSpaceList::vslist_class()->contains((MetaWord*)ptr)) {
-      return true;
-   }
- 
    return VirtualSpaceList::vslist_nonclass()->contains((MetaWord*)ptr);
  }
--- 988,15 ---
    // classes have been unloaded. However, this call is required for the code
    // in MetaspaceCriticalAllocation::try_allocate_critical to work.
    MetaspaceCriticalAllocation::process();
  }
  
! // Returns true if pointer points into one of the metaspace regions, or
! // into the class space.
! bool Metaspace::is_in_shared_metaspace(const void* ptr) {
!   return MetaspaceShared::is_in_shared_metaspace(ptr);
  }
  
! // Returns true if pointer points into one of the non-class-space metaspace regions.
! bool Metaspace::is_in_nonclass_metaspace(const void* ptr) {
    return VirtualSpaceList::vslist_nonclass()->contains((MetaWord*)ptr);
  }
< prev index next >