src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
author coleenp
Wed, 06 Jun 2018 10:45:40 -0400
changeset 50429 83aec1d357d4
parent 50193 49c3e91c424f
child 51334 cc2c79d22508
permissions -rw-r--r--
8204301: Make OrderAccess functions available to hpp rather than inline.hpp files Summary: move orderAccess.inline.hpp into orderAccess.hpp and remove os.hpp inclusion and conditional os::is_MP() for fence on x86 platforms Reviewed-by: dholmes, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     2
 * virtualSpaceList.cpp
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     3
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     4
 *  Created on: May 6, 2018
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     5
 *      Author: thomas
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     6
 */
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     7
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     8
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     9
#include "precompiled.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    10
#include "logging/log.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    11
#include "logging/logStream.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    12
#include "memory/metaspace.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    13
#include "memory/metaspace/chunkManager.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    14
#include "memory/metaspace/metachunk.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    15
#include "memory/metaspace/metaspaceCommon.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    16
#include "memory/metaspace/virtualSpaceList.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    17
#include "memory/metaspace/virtualSpaceNode.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50193
diff changeset
    18
#include "runtime/orderAccess.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    19
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    20
#include "runtime/safepoint.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    21
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    22
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    23
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    24
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    25
VirtualSpaceList::~VirtualSpaceList() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    26
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    27
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    28
    VirtualSpaceNode* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    29
    delete vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    31
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    32
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
void VirtualSpaceList::inc_reserved_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    34
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    35
  _reserved_words = _reserved_words + v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    36
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
void VirtualSpaceList::dec_reserved_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
  _reserved_words = _reserved_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    40
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
#define assert_committed_below_limit()                        \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
  assert(MetaspaceUtils::committed_bytes() <= MaxMetaspaceSize, \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
         "Too much committed memory. Committed: " SIZE_FORMAT \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
         " limit (MaxMetaspaceSize): " SIZE_FORMAT,           \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
          MetaspaceUtils::committed_bytes(), MaxMetaspaceSize);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    47
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    48
void VirtualSpaceList::inc_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    49
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    50
  _committed_words = _committed_words + v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    51
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    52
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    53
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    54
void VirtualSpaceList::dec_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    55
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    56
  _committed_words = _committed_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    57
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    58
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    59
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    60
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    61
void VirtualSpaceList::inc_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    62
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
  _virtual_space_count++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    64
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    65
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    66
void VirtualSpaceList::dec_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
  _virtual_space_count--;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    69
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
// Walk the list of VirtualSpaceNodes and delete
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
// nodes with a 0 container_count.  Remove Metachunks in
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
// the node from their respective freelists.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
void VirtualSpaceList::purge(ChunkManager* chunk_manager) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    75
  assert(SafepointSynchronize::is_at_safepoint(), "must be called at safepoint for contains to work");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    76
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    77
  // Don't use a VirtualSpaceListIterator because this
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    78
  // list is being changed and a straightforward use of an iterator is not safe.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    79
  VirtualSpaceNode* purged_vsl = NULL;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
  VirtualSpaceNode* prev_vsl = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
  VirtualSpaceNode* next_vsl = prev_vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    82
  while (next_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
    VirtualSpaceNode* vsl = next_vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
    DEBUG_ONLY(vsl->verify_container_count();)
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    85
    next_vsl = vsl->next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    86
    // Don't free the current virtual space since it will likely
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
    // be needed soon.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
    if (vsl->container_count() == 0 && vsl != current_virtual_space()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
      log_trace(gc, metaspace, freelist)("Purging VirtualSpaceNode " PTR_FORMAT " (capacity: " SIZE_FORMAT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    90
                                         ", used: " SIZE_FORMAT ").", p2i(vsl), vsl->capacity_words_in_vs(), vsl->used_words_in_vs());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    91
      DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_purged));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    92
      // Unlink it from the list
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
      if (prev_vsl == vsl) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
        // This is the case of the current node being the first node.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
        assert(vsl == virtual_space_list(), "Expected to be the first node");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
        set_virtual_space_list(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
      } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
        prev_vsl->set_next(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
      }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   100
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
      vsl->purge(chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
      dec_reserved_words(vsl->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
      dec_committed_words(vsl->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   104
      dec_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
      purged_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
      delete vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   107
    } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
      prev_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   110
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
  if (purged_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   113
    // List should be stable enough to use an iterator here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
    VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
    while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
      VirtualSpaceNode* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
      assert(vsl != purged_vsl, "Purge of vsl failed");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   121
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   122
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   123
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   124
// This function looks at the mmap regions in the metaspace without locking.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   125
// The chunks are added with store ordering and not deleted except for at
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   126
// unloading time during a safepoint.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   127
bool VirtualSpaceList::contains(const void* ptr) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   128
  // List should be stable enough to use an iterator here because removing virtual
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
  // space nodes is only allowed at a safepoint.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   130
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   131
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   132
    VirtualSpaceNode* vsn = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
    if (vsn->contains(ptr)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
      return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   135
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   136
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   137
  return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   138
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   139
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   140
void VirtualSpaceList::retire_current_virtual_space() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   141
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   143
  VirtualSpaceNode* vsn = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   144
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   145
  ChunkManager* cm = is_class() ? Metaspace::chunk_manager_class() :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   146
                                  Metaspace::chunk_manager_metadata();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   147
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
  vsn->retire(cm);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   150
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   151
VirtualSpaceList::VirtualSpaceList(size_t word_size) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   152
                                   _is_class(false),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   153
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   154
                                   _current_virtual_space(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
  create_new_virtual_space(word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   163
VirtualSpaceList::VirtualSpaceList(ReservedSpace rs) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   164
                                   _is_class(true),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   165
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   166
                                   _current_virtual_space(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   167
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   168
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   169
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   170
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   171
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   172
  VirtualSpaceNode* class_entry = new VirtualSpaceNode(is_class(), rs);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   173
  bool succeeded = class_entry->initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   174
  if (succeeded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   175
    link_vs(class_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   176
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   177
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   178
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   179
size_t VirtualSpaceList::free_bytes() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   180
  return current_virtual_space()->free_words_in_vs() * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   181
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   182
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   183
// Allocate another meta virtual space and add it to the list.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   184
bool VirtualSpaceList::create_new_virtual_space(size_t vs_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   185
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   186
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   187
  if (is_class()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   188
    assert(false, "We currently don't support more than one VirtualSpace for"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   189
                  " the compressed class space. The initialization of the"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
                  " CCS uses another code path and should not hit this path.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   192
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   194
  if (vs_word_size == 0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   195
    assert(false, "vs_word_size should always be at least _reserve_alignment large.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   196
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   197
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   198
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   199
  // Reserve the space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   200
  size_t vs_byte_size = vs_word_size * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
  assert_is_aligned(vs_byte_size, Metaspace::reserve_alignment());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   203
  // Allocate the meta virtual space and initialize it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
  VirtualSpaceNode* new_entry = new VirtualSpaceNode(is_class(), vs_byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
  if (!new_entry->initialize()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   206
    delete new_entry;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   207
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   208
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   209
    assert(new_entry->reserved_words() == vs_word_size,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   210
        "Reserved memory size differs from requested memory size");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
    // ensure lock-free iteration sees fully initialized node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
    OrderAccess::storestore();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   213
    link_vs(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   214
    DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_created));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   215
    return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   216
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   217
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   220
  if (virtual_space_list() == NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
      set_virtual_space_list(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   222
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
    current_virtual_space()->set_next(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   224
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
  set_current_virtual_space(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   226
  inc_reserved_words(new_entry->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   227
  inc_committed_words(new_entry->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   228
  inc_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
  new_entry->mangle();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   231
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   232
  LogTarget(Trace, gc, metaspace) lt;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   233
  if (lt.is_enabled()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   234
    LogStream ls(lt);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   235
    VirtualSpaceNode* vsl = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
    ResourceMark rm;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   237
    vsl->print_on(&ls);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   239
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   240
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   241
bool VirtualSpaceList::expand_node_by(VirtualSpaceNode* node,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   242
                                      size_t min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   243
                                      size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
  size_t before = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   245
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
  bool result = node->expand_by(min_words, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   248
  size_t after = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   249
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   250
  // after and before can be the same if the memory was pre-committed.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   251
  assert(after >= before, "Inconsistency");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
  inc_committed_words(after - before);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   253
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
  return result;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   255
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   256
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   257
bool VirtualSpaceList::expand_by(size_t min_words, size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   258
  assert_is_aligned(min_words,       Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
  assert_is_aligned(preferred_words, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
  assert(min_words <= preferred_words, "Invalid arguments");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
  const char* const class_or_not = (is_class() ? "class" : "non-class");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   264
  if (!MetaspaceGC::can_expand(min_words, this->is_class())) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   265
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   266
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   267
    return  false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   270
  size_t allowed_expansion_words = MetaspaceGC::allowed_expansion();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   271
  if (allowed_expansion_words < min_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   272
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list (must try gc first).",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   273
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   274
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
  size_t max_expansion_words = MIN2(preferred_words, allowed_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
  // Commit more memory from the the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   280
  bool vs_expanded = expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
                                    min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
                                    max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
  if (vs_expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   284
     log_trace(gc, metaspace, freelist)("Expanded %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
               class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   286
     return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
  log_trace(gc, metaspace, freelist)("%s virtual space list: retire current node.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   289
            class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   290
  retire_current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
  // Get another virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   293
  size_t grow_vs_words = MAX2((size_t)VirtualSpaceSize, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   294
  grow_vs_words = align_up(grow_vs_words, Metaspace::reserve_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   296
  if (create_new_virtual_space(grow_vs_words)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
    if (current_virtual_space()->is_pre_committed()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
      // The memory was pre-committed, so we are done here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
      assert(min_words <= current_virtual_space()->committed_words(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
          "The new VirtualSpace was pre-committed, so it"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
          "should be large enough to fit the alloc request.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
      return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   303
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   304
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
    return expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
                          min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
                          max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   308
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   310
  return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   311
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   313
// Given a chunk, calculate the largest possible padding space which
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   314
// could be required when allocating it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   315
static size_t largest_possible_padding_size_for_chunk(size_t chunk_word_size, bool is_class) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   316
  const ChunkIndex chunk_type = get_chunk_type_by_size(chunk_word_size, is_class);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   317
  if (chunk_type != HumongousIndex) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   318
    // Normal, non-humongous chunks are allocated at chunk size
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   319
    // boundaries, so the largest padding space required would be that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   320
    // minus the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   321
    const size_t smallest_chunk_size = is_class ? ClassSpecializedChunk : SpecializedChunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
    return chunk_word_size - smallest_chunk_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   324
    // Humongous chunks are allocated at smallest-chunksize
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   325
    // boundaries, so there is no padding required.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   326
    return 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   327
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   328
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   329
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   330
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
Metachunk* VirtualSpaceList::get_new_chunk(size_t chunk_word_size, size_t suggested_commit_granularity) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   332
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   333
  // Allocate a chunk out of the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   334
  Metachunk* next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   335
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   336
  if (next != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   337
    return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   340
  // The expand amount is currently only determined by the requested sizes
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   341
  // and not how much committed memory is left in the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   342
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
  // We must have enough space for the requested size and any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   344
  // additional reqired padding chunks.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   345
  const size_t size_for_padding = largest_possible_padding_size_for_chunk(chunk_word_size, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   346
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   347
  size_t min_word_size       = align_up(chunk_word_size + size_for_padding, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
  size_t preferred_word_size = align_up(suggested_commit_granularity, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   349
  if (min_word_size >= preferred_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
    // Can happen when humongous chunks are allocated.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   351
    preferred_word_size = min_word_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   352
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   353
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   354
  bool expanded = expand_by(min_word_size, preferred_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   355
  if (expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   356
    next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   357
    assert(next != NULL, "The allocation was expected to succeed after the expansion");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   358
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   359
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   360
   return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   361
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   362
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   363
void VirtualSpaceList::print_on(outputStream* st, size_t scale) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   364
  st->print_cr(SIZE_FORMAT " nodes, current node: " PTR_FORMAT,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   365
      _virtual_space_count, p2i(_current_virtual_space));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   366
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   367
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   368
    st->cr();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
    node->print_on(st, scale);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   371
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   372
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   373
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   374
void VirtualSpaceList::print_map(outputStream* st) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   375
  VirtualSpaceNode* list = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
  VirtualSpaceListIterator iter(list);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
  unsigned i = 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   378
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   379
    st->print_cr("Node %u:", i);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   380
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   381
    node->print_map(st, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   382
    i ++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   383
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   385
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   386
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   387