src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
author stefank
Tue, 26 Nov 2019 10:47:46 +0100
changeset 59290 97d13893ec3c
parent 54623 1126f0607c70
permissions -rw-r--r--
8234748: Clean up atomic and orderAccess includes Reviewed-by: dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 54437
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
51525
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"
59290
97d13893ec3c 8234748: Clean up atomic and orderAccess includes
stefank
parents: 54623
diff changeset
    35
#include "runtime/atomic.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50193
diff changeset
    36
#include "runtime/orderAccess.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
#include "runtime/safepoint.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    40
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
VirtualSpaceList::~VirtualSpaceList() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
    VirtualSpaceNode* vsl = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    47
    delete vsl;
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    51
void VirtualSpaceList::inc_reserved_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    52
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    53
  _reserved_words = _reserved_words + v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    54
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    55
void VirtualSpaceList::dec_reserved_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    56
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    57
  _reserved_words = _reserved_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    58
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    59
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    60
#define assert_committed_below_limit()                        \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    61
  assert(MetaspaceUtils::committed_bytes() <= MaxMetaspaceSize, \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    62
         "Too much committed memory. Committed: " SIZE_FORMAT \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
         " limit (MaxMetaspaceSize): " SIZE_FORMAT,           \
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    64
          MetaspaceUtils::committed_bytes(), MaxMetaspaceSize);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    65
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    66
void VirtualSpaceList::inc_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
  _committed_words = _committed_words + v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    69
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
void VirtualSpaceList::dec_committed_words(size_t v) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
  _committed_words = _committed_words - v;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    75
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    76
  assert_committed_below_limit();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    77
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    78
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    79
void VirtualSpaceList::inc_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
  _virtual_space_count++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    82
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
void VirtualSpaceList::dec_virtual_space_count() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    85
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    86
  _virtual_space_count--;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
// Walk the list of VirtualSpaceNodes and delete
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    90
// nodes with a 0 container_count.  Remove Metachunks in
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    91
// the node from their respective freelists.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    92
void VirtualSpaceList::purge(ChunkManager* chunk_manager) {
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* prev_vsl = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
  VirtualSpaceNode* next_vsl = prev_vsl;
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
    98
  int num_purged_nodes = 0;
50193
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;
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 52846
diff changeset
   101
    DEBUG_ONLY(vsl->verify(false);)
50193
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
      delete vsl;
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   123
      num_purged_nodes ++;
50193
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
  }
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   128
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   129
  // Verify list
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   130
#ifdef ASSERT
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   131
  if (num_purged_nodes > 0) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   132
    verify(false);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
#endif
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
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   138
// This function looks at the mmap regions in the metaspace without locking.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   139
// The chunks are added with store ordering and not deleted except for at
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   140
// unloading time during a safepoint.
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   141
VirtualSpaceNode* VirtualSpaceList::find_enclosing_space(const void* ptr) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
  // List should be stable enough to use an iterator here because removing virtual
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   143
  // space nodes is only allowed at a safepoint.
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   144
  if (is_within_envelope((address)ptr)) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   145
    VirtualSpaceListIterator iter(virtual_space_list());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   146
    while (iter.repeat()) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   147
      VirtualSpaceNode* vsn = iter.get_next();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   148
      if (vsn->contains(ptr)) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   149
        return vsn;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   150
      }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   151
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   152
  }
52014
1aa9beac610e 8210754: print_location is not reliable enough (printing register info)
mdoerr
parents: 51525
diff changeset
   153
  return NULL;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   154
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
void VirtualSpaceList::retire_current_virtual_space() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
  VirtualSpaceNode* vsn = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
  ChunkManager* cm = is_class() ? Metaspace::chunk_manager_class() :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
                                  Metaspace::chunk_manager_metadata();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   163
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   164
  vsn->retire(cm);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   165
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   166
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   167
VirtualSpaceList::VirtualSpaceList(size_t word_size) :
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   168
                                   _virtual_space_list(NULL),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   169
                                   _current_virtual_space(NULL),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   170
                                   _is_class(false),
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   171
                                   _reserved_words(0),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   172
                                   _committed_words(0),
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   173
                                   _virtual_space_count(0),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   174
                                   _envelope_lo((address)max_uintx),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   175
                                   _envelope_hi(NULL) {
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 54437
diff changeset
   176
  MutexLocker cl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
50193
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) {
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 54437
diff changeset
   189
  MutexLocker cl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
  VirtualSpaceNode* class_entry = new VirtualSpaceNode(is_class(), rs);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
  bool succeeded = class_entry->initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   192
  if (succeeded) {
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   193
    expand_envelope_to_include_node(class_entry);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   194
    // ensure lock-free iteration sees fully initialized node
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   195
    OrderAccess::storestore();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   196
    link_vs(class_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   197
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   198
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   199
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   200
size_t VirtualSpaceList::free_bytes() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
  return current_virtual_space()->free_words_in_vs() * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   203
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
// Allocate another meta virtual space and add it to the list.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
bool VirtualSpaceList::create_new_virtual_space(size_t vs_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   206
  assert_lock_strong(MetaspaceExpand_lock);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   207
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   208
  if (is_class()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   209
    assert(false, "We currently don't support more than one VirtualSpace for"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   210
                  " the compressed class space. The initialization of the"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
                  " CCS uses another code path and should not hit this path.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   213
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   214
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   215
  if (vs_word_size == 0) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   216
    assert(false, "vs_word_size should always be at least _reserve_alignment large.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   217
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   220
  // Reserve the space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
  size_t vs_byte_size = vs_word_size * BytesPerWord;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   222
  assert_is_aligned(vs_byte_size, Metaspace::reserve_alignment());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   224
  // Allocate the meta virtual space and initialize it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
  VirtualSpaceNode* new_entry = new VirtualSpaceNode(is_class(), vs_byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   226
  if (!new_entry->initialize()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   227
    delete new_entry;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   228
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
    assert(new_entry->reserved_words() == vs_word_size,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   231
        "Reserved memory size differs from requested memory size");
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   232
    expand_envelope_to_include_node(new_entry);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   233
    // ensure lock-free iteration sees fully initialized node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   234
    OrderAccess::storestore();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   235
    link_vs(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
    DEBUG_ONLY(Atomic::inc(&g_internal_statistics.num_vsnodes_created));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   237
    return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
  }
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   239
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   240
  DEBUG_ONLY(verify(false);)
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   241
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   242
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   243
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   245
  if (virtual_space_list() == NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
      set_virtual_space_list(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   248
    current_virtual_space()->set_next(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   249
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   250
  set_current_virtual_space(new_entry);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   251
  inc_reserved_words(new_entry->reserved_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
  inc_committed_words(new_entry->committed_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   253
  inc_virtual_space_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   255
  new_entry->mangle();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   256
#endif
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   257
  LogTarget(Trace, gc, metaspace) lt;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   258
  if (lt.is_enabled()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
    LogStream ls(lt);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
    VirtualSpaceNode* vsl = current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
    ResourceMark rm;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
    vsl->print_on(&ls);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
  }
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
bool VirtualSpaceList::expand_node_by(VirtualSpaceNode* node,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   267
                                      size_t min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
                                      size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
  size_t before = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   270
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   271
  bool result = node->expand_by(min_words, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   272
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   273
  size_t after = node->committed_words();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   274
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
  // after and before can be the same if the memory was pre-committed.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
  assert(after >= before, "Inconsistency");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
  inc_committed_words(after - before);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
  return result;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   280
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
bool VirtualSpaceList::expand_by(size_t min_words, size_t preferred_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
  assert_is_aligned(min_words,       Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   284
  assert_is_aligned(preferred_words, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
  assert(min_words <= preferred_words, "Invalid arguments");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   286
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
  const char* const class_or_not = (is_class() ? "class" : "non-class");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   289
  if (!MetaspaceGC::can_expand(min_words, this->is_class())) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   290
    log_trace(gc, metaspace, freelist)("Cannot expand %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
    return  false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   293
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   294
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
  size_t allowed_expansion_words = MetaspaceGC::allowed_expansion();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   296
  if (allowed_expansion_words < min_words) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
    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
   298
              class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
    return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
  size_t max_expansion_words = MIN2(preferred_words, allowed_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   303
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   304
  // Commit more memory from the the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
  bool vs_expanded = expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
                                    min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
                                    max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   308
  if (vs_expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
     log_trace(gc, metaspace, freelist)("Expanded %s virtual space list.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   310
               class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   311
     return true;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   313
  log_trace(gc, metaspace, freelist)("%s virtual space list: retire current node.",
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   314
            class_or_not);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   315
  retire_current_virtual_space();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   316
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   317
  // Get another virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   318
  size_t grow_vs_words = MAX2((size_t)VirtualSpaceSize, preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   319
  grow_vs_words = align_up(grow_vs_words, Metaspace::reserve_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   320
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   321
  if (create_new_virtual_space(grow_vs_words)) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
    if (current_virtual_space()->is_pre_committed()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
      // The memory was pre-committed, so we are done here.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   324
      assert(min_words <= current_virtual_space()->committed_words(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   325
          "The new VirtualSpace was pre-committed, so it"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   326
          "should be large enough to fit the alloc request.");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   327
      return true;
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
    return expand_node_by(current_virtual_space(),
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
                          min_words,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   332
                          max_expansion_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   333
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   334
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   335
  return false;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   336
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   337
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
// Given a chunk, calculate the largest possible padding space which
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
// could be required when allocating it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   340
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
   341
  const ChunkIndex chunk_type = get_chunk_type_by_size(chunk_word_size, is_class);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   342
  if (chunk_type != HumongousIndex) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
    // Normal, non-humongous chunks are allocated at chunk size
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   344
    // boundaries, so the largest padding space required would be that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   345
    // minus the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   346
    const size_t smallest_chunk_size = is_class ? ClassSpecializedChunk : SpecializedChunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   347
    return chunk_word_size - smallest_chunk_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
  } else {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   349
    // Humongous chunks are allocated at smallest-chunksize
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
    // boundaries, so there is no padding required.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   351
    return 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   352
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   353
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   354
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   355
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   356
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
   357
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   358
  // Allocate a chunk out of the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   359
  Metachunk* next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   360
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   361
  if (next != NULL) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   362
    return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   363
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   364
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   365
  // The expand amount is currently only determined by the requested sizes
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   366
  // and not how much committed memory is left in the current virtual space.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   367
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   368
  // We must have enough space for the requested size and any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
  // additional reqired padding chunks.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
  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
   371
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   372
  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
   373
  size_t preferred_word_size = align_up(suggested_commit_granularity, Metaspace::commit_alignment_words());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   374
  if (min_word_size >= preferred_word_size) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   375
    // Can happen when humongous chunks are allocated.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
    preferred_word_size = min_word_size;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   378
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   379
  bool expanded = expand_by(min_word_size, preferred_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   380
  if (expanded) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   381
    next = current_virtual_space()->get_chunk_vs(chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   382
    assert(next != NULL, "The allocation was expected to succeed after the expansion");
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   383
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   385
   return next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   386
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   387
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   388
void VirtualSpaceList::print_on(outputStream* st, size_t scale) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   389
  st->print_cr(SIZE_FORMAT " nodes, current node: " PTR_FORMAT,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   390
      _virtual_space_count, p2i(_current_virtual_space));
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   391
  VirtualSpaceListIterator iter(virtual_space_list());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   392
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   393
    st->cr();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   394
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   395
    node->print_on(st, scale);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   396
  }
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
void VirtualSpaceList::print_map(outputStream* st) const {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   400
  VirtualSpaceNode* list = virtual_space_list();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   401
  VirtualSpaceListIterator iter(list);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   402
  unsigned i = 0;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   403
  while (iter.repeat()) {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   404
    st->print_cr("Node %u:", i);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   405
    VirtualSpaceNode* node = iter.get_next();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   406
    node->print_map(st, this->is_class());
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   407
    i ++;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   408
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   409
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   410
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   411
// 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
   412
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
   413
  _envelope_lo = MIN2(_envelope_lo, (address)node->low_boundary());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   414
  _envelope_hi = MAX2(_envelope_hi, (address)node->high_boundary());
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   415
}
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
#ifdef ASSERT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   419
void VirtualSpaceList::verify(bool slow) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   420
  VirtualSpaceNode* list = virtual_space_list();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   421
  VirtualSpaceListIterator iter(list);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   422
  size_t reserved = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   423
  size_t committed = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   424
  size_t node_count = 0;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   425
  while (iter.repeat()) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   426
    VirtualSpaceNode* node = iter.get_next();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   427
    if (slow) {
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   428
      node->verify(true);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   429
    }
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   430
    // Check that the node resides fully within our envelope.
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   431
    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
   432
           "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
   433
           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
   434
    reserved += node->reserved_words();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   435
    committed += node->committed_words();
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   436
    node_count ++;
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   437
  }
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   438
  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
   439
      "Mismatch: reserved real: " SIZE_FORMAT " expected: " SIZE_FORMAT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   440
      ", committed real: " SIZE_FORMAT " expected: " SIZE_FORMAT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   441
      ", node count real: " SIZE_FORMAT " expected: " SIZE_FORMAT ".",
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   442
      reserved, reserved_words(), committed, committed_words(),
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   443
      node_count, _virtual_space_count);
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   444
}
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   445
#endif // ASSERT
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
   446
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   447
} // namespace metaspace