src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
author stuefe
Sun, 10 Feb 2019 09:10:42 +0100
changeset 53970 1ad7c590a6e7
parent 52846 6ed72482de52
child 54437 2ae93028bef3
permissions -rw-r--r--
8218988: Improve metaspace verifications Reviewed-by: zgu, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
51525
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     4
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     7
 * published by the Free Software Foundation.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     8
 *
51525
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    13
 * accompanied this code).
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    14
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    18
 *
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    21
 * questions.
b305378a358c 8209915: Fix license headers
mikael
parents: 51334
diff changeset
    22
 *
50193
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    26
#include "precompiled.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    27
#include "logging/log.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    28
#include "logging/logStream.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    29
#include "memory/metaspace.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
#include "memory/metaspace/chunkManager.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    31
#include "memory/metaspace/metachunk.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    32
#include "memory/metaspace/metaspaceCommon.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
#include "memory/metaspace/virtualSpaceList.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    34
#include "memory/metaspace/virtualSpaceNode.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50193
diff changeset
    35
#include "runtime/orderAccess.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    36
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
#include "runtime/safepoint.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
namespace metaspace {
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
VirtualSpaceList::~VirtualSpaceList() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
    VirtualSpaceNode* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
    delete vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    47
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    48
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    49
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    50
void VirtualSpaceList::inc_reserved_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    51
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    52
  _reserved_words = _reserved_words + v;
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_reserved_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
  _reserved_words = _reserved_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    57
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    58
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    59
#define assert_committed_below_limit()                        \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    60
  assert(MetaspaceUtils::committed_bytes() <= MaxMetaspaceSize, \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    61
         "Too much committed memory. Committed: " SIZE_FORMAT \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    62
         " limit (MaxMetaspaceSize): " SIZE_FORMAT,           \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
          MetaspaceUtils::committed_bytes(), MaxMetaspaceSize);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    64
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    65
void VirtualSpaceList::inc_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    66
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
  _committed_words = _committed_words + v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    69
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
void VirtualSpaceList::dec_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
  _committed_words = _committed_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    75
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    76
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    77
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    78
void VirtualSpaceList::inc_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    79
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
  _virtual_space_count++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    82
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
void VirtualSpaceList::dec_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    85
  _virtual_space_count--;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    86
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
// Walk the list of VirtualSpaceNodes and delete
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
// nodes with a 0 container_count.  Remove Metachunks in
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    90
// the node from their respective freelists.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    91
void VirtualSpaceList::purge(ChunkManager* chunk_manager) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    92
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
  // Don't use a VirtualSpaceListIterator because this
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
  // list is being changed and a straightforward use of an iterator is not safe.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
  VirtualSpaceNode* purged_vsl = NULL;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
  VirtualSpaceNode* prev_vsl = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
  VirtualSpaceNode* next_vsl = prev_vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
  while (next_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
    VirtualSpaceNode* vsl = next_vsl;
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 52846
diff changeset
   100
    DEBUG_ONLY(vsl->verify(false);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
    next_vsl = vsl->next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
    // Don't free the current virtual space since it will likely
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
    // be needed soon.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   104
    if (vsl->container_count() == 0 && vsl != current_virtual_space()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
      log_trace(gc, metaspace, freelist)("Purging VirtualSpaceNode " PTR_FORMAT " (capacity: " SIZE_FORMAT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
                                         ", 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
   107
      DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_purged));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
      // Unlink it from the list
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
      if (prev_vsl == vsl) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   110
        // This is the case of the current node being the first node.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
        assert(vsl == virtual_space_list(), "Expected to be the first node");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
        set_virtual_space_list(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   113
      } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
        prev_vsl->set_next(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
      }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
      vsl->purge(chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
      dec_reserved_words(vsl->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
      dec_committed_words(vsl->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120
      dec_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   121
      purged_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   122
      delete vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   123
    } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   124
      prev_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   125
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   126
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   127
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   128
  if (purged_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
    // List should be stable enough to use an iterator here.
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* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
      assert(vsl != purged_vsl, "Purge of vsl failed");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   135
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   136
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   137
}
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
// This function looks at the mmap regions in the metaspace without locking.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   141
// The chunks are added with store ordering and not deleted except for at
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
// unloading time during a safepoint.
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   143
VirtualSpaceNode* VirtualSpaceList::find_enclosing_space(const void* ptr) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   144
  // List should be stable enough to use an iterator here because removing virtual
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   145
  // space nodes is only allowed at a safepoint.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   146
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   147
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
    VirtualSpaceNode* vsn = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
    if (vsn->contains(ptr)) {
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   150
      return vsn;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   151
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   152
  }
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   153
  return NULL;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   154
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
void VirtualSpaceList::retire_current_virtual_space() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
  VirtualSpaceNode* vsn = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
  ChunkManager* cm = is_class() ? Metaspace::chunk_manager_class() :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
                                  Metaspace::chunk_manager_metadata();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   163
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   164
  vsn->retire(cm);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   165
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   166
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   167
VirtualSpaceList::VirtualSpaceList(size_t word_size) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   168
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   169
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   170
                                   _is_class(false),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   171
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   172
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   173
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   174
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   175
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   176
  create_new_virtual_space(word_size);
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
VirtualSpaceList::VirtualSpaceList(ReservedSpace rs) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   180
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   181
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   182
                                   _is_class(true),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   183
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   184
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   185
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   186
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   187
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   188
  VirtualSpaceNode* class_entry = new VirtualSpaceNode(is_class(), rs);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   189
  bool succeeded = class_entry->initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
  if (succeeded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
    link_vs(class_entry);
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   195
size_t VirtualSpaceList::free_bytes() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   196
  return current_virtual_space()->free_words_in_vs() * BytesPerWord;
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
// Allocate another meta virtual space and add it to the list.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   200
bool VirtualSpaceList::create_new_virtual_space(size_t vs_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   203
  if (is_class()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
    assert(false, "We currently don't support more than one VirtualSpace for"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
                  " the compressed class space. The initialization of the"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   206
                  " CCS uses another code path and should not hit this path.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   207
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   208
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   209
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   210
  if (vs_word_size == 0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
    assert(false, "vs_word_size should always be at least _reserve_alignment large.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   213
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   214
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   215
  // Reserve the space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   216
  size_t vs_byte_size = vs_word_size * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   217
  assert_is_aligned(vs_byte_size, Metaspace::reserve_alignment());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
  // Allocate the meta virtual space and initialize it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   220
  VirtualSpaceNode* new_entry = new VirtualSpaceNode(is_class(), vs_byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
  if (!new_entry->initialize()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   222
    delete new_entry;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   224
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
    assert(new_entry->reserved_words() == vs_word_size,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   226
        "Reserved memory size differs from requested memory size");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   227
    // ensure lock-free iteration sees fully initialized node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   228
    OrderAccess::storestore();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
    link_vs(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
    DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_created));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   231
    return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   232
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   233
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   234
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   235
void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
  if (virtual_space_list() == NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   237
      set_virtual_space_list(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   239
    current_virtual_space()->set_next(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   240
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   241
  set_current_virtual_space(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   242
  inc_reserved_words(new_entry->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   243
  inc_committed_words(new_entry->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
  inc_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   245
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
  new_entry->mangle();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   248
  LogTarget(Trace, gc, metaspace) lt;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   249
  if (lt.is_enabled()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   250
    LogStream ls(lt);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   251
    VirtualSpaceNode* vsl = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
    ResourceMark rm;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   253
    vsl->print_on(&ls);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
  }
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_node_by(VirtualSpaceNode* node,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   258
                                      size_t min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
                                      size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
  size_t before = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
  bool result = node->expand_by(min_words, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   264
  size_t after = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   265
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   266
  // after and before can be the same if the memory was pre-committed.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   267
  assert(after >= before, "Inconsistency");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
  inc_committed_words(after - before);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   270
  return result;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   271
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   272
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   273
bool VirtualSpaceList::expand_by(size_t min_words, size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   274
  assert_is_aligned(min_words,       Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
  assert_is_aligned(preferred_words, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
  assert(min_words <= preferred_words, "Invalid arguments");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
  const char* const class_or_not = (is_class() ? "class" : "non-class");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   280
  if (!MetaspaceGC::can_expand(min_words, this->is_class())) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
    return  false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   284
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   286
  size_t allowed_expansion_words = MetaspaceGC::allowed_expansion();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
  if (allowed_expansion_words < min_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
    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
   289
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   290
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   293
  size_t max_expansion_words = MIN2(preferred_words, allowed_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   294
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
  // Commit more memory from the the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   296
  bool vs_expanded = expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
                                    min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
                                    max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
  if (vs_expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
     log_trace(gc, metaspace, freelist)("Expanded %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
               class_or_not);
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
  log_trace(gc, metaspace, freelist)("%s virtual space list: retire current node.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
            class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
  retire_current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   308
  // Get another virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
  size_t grow_vs_words = MAX2((size_t)VirtualSpaceSize, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   310
  grow_vs_words = align_up(grow_vs_words, Metaspace::reserve_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   311
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
  if (create_new_virtual_space(grow_vs_words)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   313
    if (current_virtual_space()->is_pre_committed()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   314
      // The memory was pre-committed, so we are done here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   315
      assert(min_words <= current_virtual_space()->committed_words(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   316
          "The new VirtualSpace was pre-committed, so it"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   317
          "should be large enough to fit the alloc request.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   318
      return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   319
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   320
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   321
    return expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
                          min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
                          max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   324
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   325
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   326
  return false;
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
// Given a chunk, calculate the largest possible padding space which
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   330
// could be required when allocating it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
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
   332
  const ChunkIndex chunk_type = get_chunk_type_by_size(chunk_word_size, is_class);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   333
  if (chunk_type != HumongousIndex) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   334
    // Normal, non-humongous chunks are allocated at chunk size
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   335
    // boundaries, so the largest padding space required would be that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   336
    // minus the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   337
    const size_t smallest_chunk_size = is_class ? ClassSpecializedChunk : SpecializedChunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
    return chunk_word_size - smallest_chunk_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   340
    // Humongous chunks are allocated at smallest-chunksize
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   341
    // boundaries, so there is no padding required.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   342
    return 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   344
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   345
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   346
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   347
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
   348
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   349
  // Allocate a chunk out of the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
  Metachunk* next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   351
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   352
  if (next != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   353
    return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   354
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   355
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   356
  // The expand amount is currently only determined by the requested sizes
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   357
  // and not how much committed memory is left in the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   358
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   359
  // We must have enough space for the requested size and any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   360
  // additional reqired padding chunks.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   361
  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
   362
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   363
  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
   364
  size_t preferred_word_size = align_up(suggested_commit_granularity, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   365
  if (min_word_size >= preferred_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   366
    // Can happen when humongous chunks are allocated.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   367
    preferred_word_size = min_word_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   368
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
  bool expanded = expand_by(min_word_size, preferred_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   371
  if (expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   372
    next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   373
    assert(next != NULL, "The allocation was expected to succeed after the expansion");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   374
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   375
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
   return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   378
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   379
void VirtualSpaceList::print_on(outputStream* st, size_t scale) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   380
  st->print_cr(SIZE_FORMAT " nodes, current node: " PTR_FORMAT,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   381
      _virtual_space_count, p2i(_current_virtual_space));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   382
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   383
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
    st->cr();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   385
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   386
    node->print_on(st, scale);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   387
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   388
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   389
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   390
void VirtualSpaceList::print_map(outputStream* st) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   391
  VirtualSpaceNode* list = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   392
  VirtualSpaceListIterator iter(list);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   393
  unsigned i = 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   394
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   395
    st->print_cr("Node %u:", i);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   396
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   397
    node->print_map(st, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   398
    i ++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   399
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   400
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   401
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   402
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   403