src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
author mdoerr
Thu, 04 Oct 2018 16:39:07 +0200
changeset 52014 1aa9beac610e
parent 51525 b305378a358c
child 52846 6ed72482de52
permissions -rw-r--r--
8210754: print_location is not reliable enough (printing register info) Reviewed-by: stuefe, 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(SafepointSynchronize::is_at_safepoint(), "must be called at safepoint for contains to work");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
  // Don't use a VirtualSpaceListIterator because this
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
  // list is being changed and a straightforward use of an iterator is not safe.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
  VirtualSpaceNode* purged_vsl = NULL;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
  VirtualSpaceNode* prev_vsl = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
  VirtualSpaceNode* next_vsl = prev_vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
  while (next_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   100
    VirtualSpaceNode* vsl = next_vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
    DEBUG_ONLY(vsl->verify_container_count();)
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
    next_vsl = vsl->next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
    // Don't free the current virtual space since it will likely
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   104
    // be needed soon.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
    if (vsl->container_count() == 0 && vsl != current_virtual_space()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
      log_trace(gc, metaspace, freelist)("Purging VirtualSpaceNode " PTR_FORMAT " (capacity: " SIZE_FORMAT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   107
                                         ", 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
   108
      DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_purged));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
      // Unlink it from the list
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   110
      if (prev_vsl == vsl) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
        // This is the case of the current node being the first node.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
        assert(vsl == virtual_space_list(), "Expected to be the first node");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   113
        set_virtual_space_list(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
      } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
        prev_vsl->set_next(vsl->next());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
      }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
      vsl->purge(chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
      dec_reserved_words(vsl->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120
      dec_committed_words(vsl->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   121
      dec_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   122
      purged_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   123
      delete vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   124
    } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   125
      prev_vsl = vsl;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   126
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   127
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   128
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
  if (purged_vsl != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   130
    // List should be stable enough to use an iterator here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   131
    VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   132
    while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
      VirtualSpaceNode* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
      assert(vsl != purged_vsl, "Purge of vsl failed");
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
#endif
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   141
// This function looks at the mmap regions in the metaspace without locking.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
// The chunks are added with store ordering and not deleted except for at
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   143
// unloading time during a safepoint.
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   144
VirtualSpaceNode* VirtualSpaceList::find_enclosing_space(const void* ptr) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   145
  // List should be stable enough to use an iterator here because removing virtual
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   146
  // space nodes is only allowed at a safepoint.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   147
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
    VirtualSpaceNode* vsn = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   150
    if (vsn->contains(ptr)) {
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   151
      return vsn;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   152
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   153
  }
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   154
  return NULL;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
void VirtualSpaceList::retire_current_virtual_space() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
  VirtualSpaceNode* vsn = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
  ChunkManager* cm = is_class() ? Metaspace::chunk_manager_class() :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   163
                                  Metaspace::chunk_manager_metadata();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   164
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   165
  vsn->retire(cm);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   166
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   167
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   168
VirtualSpaceList::VirtualSpaceList(size_t word_size) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   169
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   170
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   171
                                   _is_class(false),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   172
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   173
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   174
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   175
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   176
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   177
  create_new_virtual_space(word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   178
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   179
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   180
VirtualSpaceList::VirtualSpaceList(ReservedSpace rs) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   181
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   182
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   183
                                   _is_class(true),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   184
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   185
                                   _committed_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   186
                                   _virtual_space_count(0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   187
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   188
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   189
  VirtualSpaceNode* class_entry = new VirtualSpaceNode(is_class(), rs);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
  bool succeeded = class_entry->initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
  if (succeeded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   192
    link_vs(class_entry);
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   196
size_t VirtualSpaceList::free_bytes() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   197
  return current_virtual_space()->free_words_in_vs() * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   198
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   199
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   200
// Allocate another meta virtual space and add it to the list.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
bool VirtualSpaceList::create_new_virtual_space(size_t vs_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   203
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
  if (is_class()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
    assert(false, "We currently don't support more than one VirtualSpace for"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   206
                  " the compressed class space. The initialization of the"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   207
                  " CCS uses another code path and should not hit this path.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   208
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   209
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   210
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
  if (vs_word_size == 0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
    assert(false, "vs_word_size should always be at least _reserve_alignment large.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   213
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   214
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   215
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   216
  // Reserve the space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   217
  size_t vs_byte_size = vs_word_size * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
  assert_is_aligned(vs_byte_size, Metaspace::reserve_alignment());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   220
  // Allocate the meta virtual space and initialize it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
  VirtualSpaceNode* new_entry = new VirtualSpaceNode(is_class(), vs_byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   222
  if (!new_entry->initialize()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
    delete new_entry;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   224
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   226
    assert(new_entry->reserved_words() == vs_word_size,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   227
        "Reserved memory size differs from requested memory size");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   228
    // ensure lock-free iteration sees fully initialized node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
    OrderAccess::storestore();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
    link_vs(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   231
    DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_created));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   232
    return true;
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   237
  if (virtual_space_list() == NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
      set_virtual_space_list(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   239
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   240
    current_virtual_space()->set_next(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   241
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   242
  set_current_virtual_space(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   243
  inc_reserved_words(new_entry->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
  inc_committed_words(new_entry->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   245
  inc_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
  new_entry->mangle();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   248
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   249
  LogTarget(Trace, gc, metaspace) lt;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   250
  if (lt.is_enabled()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   251
    LogStream ls(lt);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
    VirtualSpaceNode* vsl = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   253
    ResourceMark rm;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
    vsl->print_on(&ls);
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   258
bool VirtualSpaceList::expand_node_by(VirtualSpaceNode* node,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
                                      size_t min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
                                      size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
  size_t before = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
  bool result = node->expand_by(min_words, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   264
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   265
  size_t after = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   266
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   267
  // after and before can be the same if the memory was pre-committed.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
  assert(after >= before, "Inconsistency");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
  inc_committed_words(after - before);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   270
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   271
  return result;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   272
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   273
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   274
bool VirtualSpaceList::expand_by(size_t min_words, size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
  assert_is_aligned(min_words,       Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
  assert_is_aligned(preferred_words, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
  assert(min_words <= preferred_words, "Invalid arguments");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
  const char* const class_or_not = (is_class() ? "class" : "non-class");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   280
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
  if (!MetaspaceGC::can_expand(min_words, this->is_class())) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   284
    return  false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   286
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
  size_t allowed_expansion_words = MetaspaceGC::allowed_expansion();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
  if (allowed_expansion_words < min_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   289
    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
   290
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   293
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   294
  size_t max_expansion_words = MIN2(preferred_words, allowed_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   296
  // Commit more memory from the the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
  bool vs_expanded = expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
                                    min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
                                    max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
  if (vs_expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
     log_trace(gc, metaspace, freelist)("Expanded %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
               class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   303
     return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   304
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
  log_trace(gc, metaspace, freelist)("%s virtual space list: retire current node.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
            class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
  retire_current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   308
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
  // Get another virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   310
  size_t grow_vs_words = MAX2((size_t)VirtualSpaceSize, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   311
  grow_vs_words = align_up(grow_vs_words, Metaspace::reserve_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   313
  if (create_new_virtual_space(grow_vs_words)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   314
    if (current_virtual_space()->is_pre_committed()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   315
      // The memory was pre-committed, so we are done here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   316
      assert(min_words <= current_virtual_space()->committed_words(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   317
          "The new VirtualSpace was pre-committed, so it"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   318
          "should be large enough to fit the alloc request.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   319
      return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   320
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   321
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
    return expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
                          min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   324
                          max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   325
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   326
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   327
  return false;
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
// Given a chunk, calculate the largest possible padding space which
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
// could be required when allocating it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   332
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
   333
  const ChunkIndex chunk_type = get_chunk_type_by_size(chunk_word_size, is_class);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   334
  if (chunk_type != HumongousIndex) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   335
    // Normal, non-humongous chunks are allocated at chunk size
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   336
    // boundaries, so the largest padding space required would be that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   337
    // minus the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
    const size_t smallest_chunk_size = is_class ? ClassSpecializedChunk : SpecializedChunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
    return chunk_word_size - smallest_chunk_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   340
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   341
    // Humongous chunks are allocated at smallest-chunksize
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   342
    // boundaries, so there is no padding required.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
    return 0;
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
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
   349
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
  // Allocate a chunk out of the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   351
  Metachunk* next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   352
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   353
  if (next != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   354
    return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   355
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   356
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   357
  // The expand amount is currently only determined by the requested sizes
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   358
  // and not how much committed memory is left in the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   359
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   360
  // We must have enough space for the requested size and any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   361
  // additional reqired padding chunks.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   362
  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
   363
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   364
  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
   365
  size_t preferred_word_size = align_up(suggested_commit_granularity, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   366
  if (min_word_size >= preferred_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   367
    // Can happen when humongous chunks are allocated.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   368
    preferred_word_size = min_word_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   371
  bool expanded = expand_by(min_word_size, preferred_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   372
  if (expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   373
    next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   374
    assert(next != NULL, "The allocation was expected to succeed after the expansion");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   375
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
   return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   378
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   379
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   380
void VirtualSpaceList::print_on(outputStream* st, size_t scale) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   381
  st->print_cr(SIZE_FORMAT " nodes, current node: " PTR_FORMAT,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   382
      _virtual_space_count, p2i(_current_virtual_space));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   383
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   385
    st->cr();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   386
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   387
    node->print_on(st, scale);
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   391
void VirtualSpaceList::print_map(outputStream* st) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   392
  VirtualSpaceNode* list = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   393
  VirtualSpaceListIterator iter(list);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   394
  unsigned i = 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   395
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   396
    st->print_cr("Node %u:", i);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   397
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   398
    node->print_map(st, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   399
    i ++;
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   403
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   404