src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
author stuefe
Wed, 27 Mar 2019 14:13:34 +0100
changeset 54437 2ae93028bef3
parent 53970 1ad7c590a6e7
child 54623 1126f0607c70
permissions -rw-r--r--
8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends Reviewed-by: adinn, coleenp, mdoerr
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* prev_vsl = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
  VirtualSpaceNode* next_vsl = prev_vsl;
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
    97
  int num_purged_nodes = 0;
50193
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
      delete vsl;
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   122
      num_purged_nodes ++;
50193
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
  }
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   127
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   128
  // Verify list
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
#ifdef ASSERT
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   130
  if (num_purged_nodes > 0) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   131
    verify(false);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   132
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
#endif
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   137
// This function looks at the mmap regions in the metaspace without locking.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   138
// The chunks are added with store ordering and not deleted except for at
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   139
// unloading time during a safepoint.
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   140
VirtualSpaceNode* VirtualSpaceList::find_enclosing_space(const void* ptr) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   141
  // List should be stable enough to use an iterator here because removing virtual
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
  // space nodes is only allowed at a safepoint.
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   143
  if (is_within_envelope((address)ptr)) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   144
    VirtualSpaceListIterator iter(virtual_space_list());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   145
    while (iter.repeat()) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   146
      VirtualSpaceNode* vsn = iter.get_next();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   147
      if (vsn->contains(ptr)) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   148
        return vsn;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   149
      }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   150
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   151
  }
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   152
  return NULL;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   153
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   154
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
void VirtualSpaceList::retire_current_virtual_space() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
  VirtualSpaceNode* vsn = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
  ChunkManager* cm = is_class() ? Metaspace::chunk_manager_class() :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
                                  Metaspace::chunk_manager_metadata();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   163
  vsn->retire(cm);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   164
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   165
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   166
VirtualSpaceList::VirtualSpaceList(size_t word_size) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   167
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   168
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   169
                                   _is_class(false),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   170
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   171
                                   _committed_words(0),
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   172
                                   _virtual_space_count(0),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   173
                                   _envelope_lo((address)max_uintx),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   174
                                   _envelope_hi(NULL) {
50193
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),
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   186
                                   _virtual_space_count(0),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   187
                                   _envelope_lo((address)max_uintx),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   188
                                   _envelope_hi(NULL) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   189
  MutexLockerEx cl(MetaspaceExpand_lock,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
                   Mutex::_no_safepoint_check_flag);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
  VirtualSpaceNode* class_entry = new VirtualSpaceNode(is_class(), rs);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   192
  bool succeeded = class_entry->initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   193
  if (succeeded) {
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   194
    expand_envelope_to_include_node(class_entry);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   195
    // ensure lock-free iteration sees fully initialized node
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   196
    OrderAccess::storestore();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   197
    link_vs(class_entry);
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
size_t VirtualSpaceList::free_bytes() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
  return current_virtual_space()->free_words_in_vs() * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   203
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
// Allocate another meta virtual space and add it to the list.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   206
bool VirtualSpaceList::create_new_virtual_space(size_t vs_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   207
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   208
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   209
  if (is_class()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   210
    assert(false, "We currently don't support more than one VirtualSpace for"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
                  " the compressed class space. The initialization of the"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
                  " CCS uses another code path and should not hit this path.");
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
  if (vs_word_size == 0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   217
    assert(false, "vs_word_size should always be at least _reserve_alignment large.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   220
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
  // Reserve the space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   222
  size_t vs_byte_size = vs_word_size * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
  assert_is_aligned(vs_byte_size, Metaspace::reserve_alignment());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   224
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
  // Allocate the meta virtual space and initialize it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   226
  VirtualSpaceNode* new_entry = new VirtualSpaceNode(is_class(), vs_byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   227
  if (!new_entry->initialize()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   228
    delete new_entry;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   231
    assert(new_entry->reserved_words() == vs_word_size,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   232
        "Reserved memory size differs from requested memory size");
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   233
    expand_envelope_to_include_node(new_entry);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   234
    // ensure lock-free iteration sees fully initialized node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   235
    OrderAccess::storestore();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
    link_vs(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   237
    DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_created));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
    return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   239
  }
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   240
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   241
  DEBUG_ONLY(verify(false);)
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   242
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   243
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   245
void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
  if (virtual_space_list() == NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
      set_virtual_space_list(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   248
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   249
    current_virtual_space()->set_next(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   250
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   251
  set_current_virtual_space(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
  inc_reserved_words(new_entry->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   253
  inc_committed_words(new_entry->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
  inc_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   255
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   256
  new_entry->mangle();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   257
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   258
  LogTarget(Trace, gc, metaspace) lt;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
  if (lt.is_enabled()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
    LogStream ls(lt);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
    VirtualSpaceNode* vsl = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
    ResourceMark rm;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
    vsl->print_on(&ls);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   264
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   265
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   266
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   267
bool VirtualSpaceList::expand_node_by(VirtualSpaceNode* node,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
                                      size_t min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
                                      size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   270
  size_t before = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   271
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   272
  bool result = node->expand_by(min_words, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   273
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   274
  size_t after = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
  // after and before can be the same if the memory was pre-committed.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
  assert(after >= before, "Inconsistency");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
  inc_committed_words(after - before);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   280
  return result;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
bool VirtualSpaceList::expand_by(size_t min_words, size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   284
  assert_is_aligned(min_words,       Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
  assert_is_aligned(preferred_words, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   286
  assert(min_words <= preferred_words, "Invalid arguments");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
  const char* const class_or_not = (is_class() ? "class" : "non-class");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   289
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   290
  if (!MetaspaceGC::can_expand(min_words, this->is_class())) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   293
    return  false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   294
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   296
  size_t allowed_expansion_words = MetaspaceGC::allowed_expansion();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
  if (allowed_expansion_words < min_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
    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
   299
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   303
  size_t max_expansion_words = MIN2(preferred_words, allowed_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   304
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
  // Commit more memory from the the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
  bool vs_expanded = expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
                                    min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   308
                                    max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
  if (vs_expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   310
     log_trace(gc, metaspace, freelist)("Expanded %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   311
               class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
     return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   313
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   314
  log_trace(gc, metaspace, freelist)("%s virtual space list: retire current node.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   315
            class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   316
  retire_current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   317
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   318
  // Get another virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   319
  size_t grow_vs_words = MAX2((size_t)VirtualSpaceSize, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   320
  grow_vs_words = align_up(grow_vs_words, Metaspace::reserve_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   321
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
  if (create_new_virtual_space(grow_vs_words)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
    if (current_virtual_space()->is_pre_committed()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   324
      // The memory was pre-committed, so we are done here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   325
      assert(min_words <= current_virtual_space()->committed_words(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   326
          "The new VirtualSpace was pre-committed, so it"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   327
          "should be large enough to fit the alloc request.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   328
      return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   329
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   330
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
    return expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   332
                          min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   333
                          max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   334
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   335
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   336
  return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   337
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
// Given a chunk, calculate the largest possible padding space which
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   340
// could be required when allocating it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   341
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
   342
  const ChunkIndex chunk_type = get_chunk_type_by_size(chunk_word_size, is_class);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
  if (chunk_type != HumongousIndex) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   344
    // Normal, non-humongous chunks are allocated at chunk size
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   345
    // boundaries, so the largest padding space required would be that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   346
    // minus the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   347
    const size_t smallest_chunk_size = is_class ? ClassSpecializedChunk : SpecializedChunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
    return chunk_word_size - smallest_chunk_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   349
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
    // Humongous chunks are allocated at smallest-chunksize
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   351
    // boundaries, so there is no padding required.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   352
    return 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   353
  }
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   357
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
   358
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   359
  // Allocate a chunk out of the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   360
  Metachunk* next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   361
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   362
  if (next != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   363
    return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   364
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   365
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   366
  // The expand amount is currently only determined by the requested sizes
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   367
  // and not how much committed memory is left in the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   368
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
  // We must have enough space for the requested size and any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
  // additional reqired padding chunks.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   371
  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
   372
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   373
  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
   374
  size_t preferred_word_size = align_up(suggested_commit_granularity, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   375
  if (min_word_size >= preferred_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
    // Can happen when humongous chunks are allocated.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
    preferred_word_size = min_word_size;
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
  bool expanded = expand_by(min_word_size, preferred_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   381
  if (expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   382
    next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   383
    assert(next != NULL, "The allocation was expected to succeed after the expansion");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   385
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   386
   return next;
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
void VirtualSpaceList::print_on(outputStream* st, size_t scale) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   390
  st->print_cr(SIZE_FORMAT " nodes, current node: " PTR_FORMAT,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   391
      _virtual_space_count, p2i(_current_virtual_space));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   392
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   393
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   394
    st->cr();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   395
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   396
    node->print_on(st, scale);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   397
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   398
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   399
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   400
void VirtualSpaceList::print_map(outputStream* st) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   401
  VirtualSpaceNode* list = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   402
  VirtualSpaceListIterator iter(list);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   403
  unsigned i = 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   404
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   405
    st->print_cr("Node %u:", i);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   406
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   407
    node->print_map(st, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   408
    i ++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   409
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   410
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   411
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   412
// Given a node, expand range such that it includes the node.
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   413
void VirtualSpaceList::expand_envelope_to_include_node(const VirtualSpaceNode* node) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   414
  _envelope_lo = MIN2(_envelope_lo, (address)node->low_boundary());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   415
  _envelope_hi = MAX2(_envelope_hi, (address)node->high_boundary());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   416
}
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   417
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   418
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   419
#ifdef ASSERT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   420
void VirtualSpaceList::verify(bool slow) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   421
  VirtualSpaceNode* list = virtual_space_list();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   422
  VirtualSpaceListIterator iter(list);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   423
  size_t reserved = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   424
  size_t committed = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   425
  size_t node_count = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   426
  while (iter.repeat()) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   427
    VirtualSpaceNode* node = iter.get_next();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   428
    if (slow) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   429
      node->verify(true);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   430
    }
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   431
    // Check that the node resides fully within our envelope.
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   432
    assert((address)node->low_boundary() >= _envelope_lo && (address)node->high_boundary() <= _envelope_hi,
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   433
           "Node " SIZE_FORMAT " [" PTR_FORMAT ", " PTR_FORMAT ") outside envelope [" PTR_FORMAT ", " PTR_FORMAT ").",
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   434
           node_count, p2i(node->low_boundary()), p2i(node->high_boundary()), p2i(_envelope_lo), p2i(_envelope_hi));
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   435
    reserved += node->reserved_words();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   436
    committed += node->committed_words();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   437
    node_count ++;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   438
  }
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   439
  assert(reserved == reserved_words() && committed == committed_words() && node_count == _virtual_space_count,
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   440
      "Mismatch: reserved real: " SIZE_FORMAT " expected: " SIZE_FORMAT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   441
      ", committed real: " SIZE_FORMAT " expected: " SIZE_FORMAT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   442
      ", node count real: " SIZE_FORMAT " expected: " SIZE_FORMAT ".",
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   443
      reserved, reserved_words(), committed, committed_words(),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   444
      node_count, _virtual_space_count);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   445
}
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   446
#endif // ASSERT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   447
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   448
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   449