test/hotspot/gtest/memory/test_metaspace_allocation.cpp
author stuefe
Mon, 23 Apr 2018 16:25:16 +0200
changeset 49852 4d3218e5f170
parent 49401 0c71baee49a7
child 51444 3e5d28e6de32
permissions -rw-r--r--
8202073: MetaspaceAllocationTest gtest shall lock during space creation Reviewed-by: coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     1
/*
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     3
 * Copyright (c) 2018, SAP.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     5
 *
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     8
 * published by the Free Software Foundation.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
     9
 *
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    14
 * accompanied this code).
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    15
 *
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    19
 *
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    22
 * questions.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    23
 */
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    24
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    25
#include "precompiled.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    26
#include "memory/allocation.inline.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    27
#include "memory/metaspace.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    28
#include "runtime/mutex.hpp"
49852
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
    29
#include "runtime/mutexLocker.hpp"
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    30
#include "runtime/os.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    31
#include "utilities/align.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    32
#include "utilities/debug.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    33
#include "utilities/globalDefinitions.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    34
#include "utilities/ostream.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    35
#include "unittest.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    36
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    37
#define NUM_PARALLEL_METASPACES                 50
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    38
#define MAX_PER_METASPACE_ALLOCATION_WORDSIZE   (512 * K)
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    39
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    40
//#define DEBUG_VERBOSE true
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    41
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    42
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    43
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    44
struct chunkmanager_statistics_t {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    45
  int num_specialized_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    46
  int num_small_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    47
  int num_medium_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    48
  int num_humongous_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    49
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    50
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    51
extern void test_metaspace_retrieve_chunkmanager_statistics(Metaspace::MetadataType mdType, chunkmanager_statistics_t* out);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    52
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    53
static void print_chunkmanager_statistics(outputStream* st, Metaspace::MetadataType mdType) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    54
  chunkmanager_statistics_t stat;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    55
  test_metaspace_retrieve_chunkmanager_statistics(mdType, &stat);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    56
  st->print_cr("free chunks: %d / %d / %d / %d", stat.num_specialized_chunks, stat.num_small_chunks,
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    57
               stat.num_medium_chunks, stat.num_humongous_chunks);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    58
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    59
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    60
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    61
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    62
struct chunk_geometry_t {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    63
  size_t specialized_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    64
  size_t small_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    65
  size_t medium_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    66
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    67
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    68
extern void test_metaspace_retrieve_chunk_geometry(Metaspace::MetadataType mdType, chunk_geometry_t* out);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    69
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    70
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    71
class MetaspaceAllocationTest : public ::testing::Test {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    72
protected:
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    73
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    74
  struct {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    75
    size_t allocated;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    76
    Mutex* lock;
49401
0c71baee49a7 8199431: Split up class Metaspace into a static and a non-static part
stuefe
parents: 49389
diff changeset
    77
    ClassLoaderMetaspace* space;
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    78
    bool is_empty() const { return allocated == 0; }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    79
    bool is_full() const { return allocated >= MAX_PER_METASPACE_ALLOCATION_WORDSIZE; }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    80
  } _spaces[NUM_PARALLEL_METASPACES];
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    81
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    82
  chunk_geometry_t _chunk_geometry;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    83
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    84
  virtual void SetUp() {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    85
    ::memset(_spaces, 0, sizeof(_spaces));
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    86
    test_metaspace_retrieve_chunk_geometry(Metaspace::NonClassType, &_chunk_geometry);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    87
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    88
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    89
  virtual void TearDown() {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    90
    for (int i = 0; i < NUM_PARALLEL_METASPACES; i ++) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    91
      if (_spaces[i].space != NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    92
        delete _spaces[i].space;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    93
        delete _spaces[i].lock;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    94
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    95
    }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    96
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    97
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    98
  void create_space(int i) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    99
    assert(i >= 0 && i < NUM_PARALLEL_METASPACES, "Sanity");
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   100
    assert(_spaces[i].space == NULL && _spaces[i].allocated == 0, "Sanity");
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   101
    if (_spaces[i].lock == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   102
      _spaces[i].lock = new Mutex(Monitor::native, "gtest-MetaspaceAllocationTest-lock", false, Monitor::_safepoint_check_never);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   103
      ASSERT_TRUE(_spaces[i].lock != NULL);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   104
    }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   105
    // Let every ~10th space be an anonymous one to test different allocation patterns.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   106
    const Metaspace::MetaspaceType msType = (os::random() % 100 < 10) ?
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   107
      Metaspace::AnonymousMetaspaceType : Metaspace::StandardMetaspaceType;
49852
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   108
    {
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   109
      // Pull lock during space creation, since this is what happens in the VM too
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   110
      // (see ClassLoaderData::metaspace_non_null(), which we mimick here).
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   111
      MutexLockerEx ml(_spaces[i].lock,  Mutex::_no_safepoint_check_flag);
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   112
      _spaces[i].space = new ClassLoaderMetaspace(_spaces[i].lock, msType);
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   113
    }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   114
    _spaces[i].allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   115
    ASSERT_TRUE(_spaces[i].space != NULL);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   116
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   117
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   118
  // Returns the index of a random space where index is [0..metaspaces) and which is
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   119
  //   empty, non-empty or full.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   120
  // Returns -1 if no matching space exists.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   121
  enum fillgrade { fg_empty, fg_non_empty, fg_full };
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   122
  int get_random_matching_space(int metaspaces, fillgrade fg) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   123
    const int start_index = os::random() % metaspaces;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   124
    int i = start_index;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   125
    do {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   126
      if (fg == fg_empty && _spaces[i].is_empty()) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   127
        return i;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   128
      } else if ((fg == fg_full && _spaces[i].is_full()) ||
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   129
                 (fg == fg_non_empty && !_spaces[i].is_full() && !_spaces[i].is_empty())) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   130
        return i;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   131
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   132
      i ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   133
      if (i == metaspaces) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   134
        i = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   135
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   136
    } while (i != start_index);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   137
    return -1;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   138
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   139
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   140
  int get_random_emtpy_space(int metaspaces) { return get_random_matching_space(metaspaces, fg_empty); }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   141
  int get_random_non_emtpy_space(int metaspaces) { return get_random_matching_space(metaspaces, fg_non_empty); }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   142
  int get_random_full_space(int metaspaces) { return get_random_matching_space(metaspaces, fg_full); }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   143
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   144
  void do_test(Metaspace::MetadataType mdType, int metaspaces, int phases, int allocs_per_phase,
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   145
               float probability_for_large_allocations // 0.0-1.0
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   146
  ) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   147
    // Alternate between breathing in (allocating n blocks for a random Metaspace) and
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   148
    // breathing out (deleting a random Metaspace). The intent is to stress the coalescation
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   149
    // and splitting of free chunks.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   150
    int phases_done = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   151
    bool allocating = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   152
    while (phases_done < phases) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   153
      bool force_switch = false;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   154
      if (allocating) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   155
        // Allocate space from metaspace, with a preference for completely empty spaces. This
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   156
        // should provide a good mixture of metaspaces in the virtual space.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   157
        int index = get_random_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   158
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   159
          index = get_random_non_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   160
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   161
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   162
          // All spaces are full, switch to freeing.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   163
          force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   164
        } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   165
          // create space if it does not yet exist.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   166
          if (_spaces[index].space == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   167
            create_space(index);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   168
          }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   169
          // Allocate a bunch of blocks from it. Mostly small stuff but mix in large allocations
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   170
          //  to force humongous chunk allocations.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   171
          int allocs_done = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   172
          while (allocs_done < allocs_per_phase && !_spaces[index].is_full()) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   173
            size_t size = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   174
            int r = os::random() % 1000;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   175
            if ((float)r < probability_for_large_allocations * 1000.0) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   176
              size = (os::random() % _chunk_geometry.medium_chunk_word_size) + _chunk_geometry.medium_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   177
            } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   178
              size = os::random() % 64;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   179
            }
49852
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   180
            // Note: In contrast to space creation, no need to lock here. ClassLoaderMetaspace::allocate() will lock itself.
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   181
            MetaWord* const p = _spaces[index].space->allocate(size, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   182
            if (p == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   183
              // We very probably did hit the metaspace "until-gc" limit.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   184
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   185
              tty->print_cr("OOM for " SIZE_FORMAT " words. ", size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   186
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   187
              // Just switch to deallocation and resume tests.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   188
              force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   189
              break;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   190
            } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   191
              _spaces[index].allocated += size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   192
              allocs_done ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   193
            }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   194
          }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   195
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   196
      } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   197
        // freeing: find a metaspace and delete it, with preference for completely filled spaces.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   198
        int index = get_random_full_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   199
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   200
          index = get_random_non_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   201
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   202
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   203
          force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   204
        } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   205
          assert(_spaces[index].space != NULL && _spaces[index].allocated > 0, "Sanity");
49852
4d3218e5f170 8202073: MetaspaceAllocationTest gtest shall lock during space creation
stuefe
parents: 49401
diff changeset
   206
          // Note: do not lock here. In the "wild" (the VM), we do not so either (see ~ClassLoaderData()).
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   207
          delete _spaces[index].space;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   208
          _spaces[index].space = NULL;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   209
          _spaces[index].allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   210
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   211
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   212
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   213
      if (force_switch) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   214
        allocating = !allocating;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   215
      } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   216
        // periodically switch between allocating and freeing, but prefer allocation because
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   217
        // we want to intermingle allocations of multiple metaspaces.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   218
        allocating = os::random() % 5 < 4;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   219
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   220
      phases_done ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   221
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   222
      int metaspaces_in_use = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   223
      size_t total_allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   224
      for (int i = 0; i < metaspaces; i ++) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   225
        if (_spaces[i].allocated > 0) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   226
          total_allocated += _spaces[i].allocated;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   227
          metaspaces_in_use ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   228
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   229
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   230
      tty->print("%u:\tspaces: %d total words: " SIZE_FORMAT "\t\t\t", phases_done, metaspaces_in_use, total_allocated);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   231
      print_chunkmanager_statistics(tty, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   232
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   233
    }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   234
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   235
    tty->print_cr("Test finished. ");
49389
9ef2eee8ca7c 8199430: Rename MetaspaceAux to something more meaningful
stuefe
parents: 49365
diff changeset
   236
    MetaspaceUtils::print_metaspace_map(tty, mdType);
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   237
    print_chunkmanager_statistics(tty, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   238
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   239
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   240
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   241
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   242
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   243
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   244
TEST_F(MetaspaceAllocationTest, chunk_geometry) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   245
  ASSERT_GT(_chunk_geometry.specialized_chunk_word_size, (size_t) 0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   246
  ASSERT_GT(_chunk_geometry.small_chunk_word_size, _chunk_geometry.specialized_chunk_word_size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   247
  ASSERT_EQ(_chunk_geometry.small_chunk_word_size % _chunk_geometry.specialized_chunk_word_size, (size_t)0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   248
  ASSERT_GT(_chunk_geometry.medium_chunk_word_size, _chunk_geometry.small_chunk_word_size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   249
  ASSERT_EQ(_chunk_geometry.medium_chunk_word_size % _chunk_geometry.small_chunk_word_size, (size_t)0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   250
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   251
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   252
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   253
TEST_VM_F(MetaspaceAllocationTest, single_space_nonclass) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   254
  do_test(Metaspace::NonClassType, 1, 1000, 100, 0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   255
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   256
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   257
TEST_VM_F(MetaspaceAllocationTest, single_space_class) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   258
  do_test(Metaspace::ClassType, 1, 1000, 100, 0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   259
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   260
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   261
TEST_VM_F(MetaspaceAllocationTest, multi_space_nonclass) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   262
  do_test(Metaspace::NonClassType, NUM_PARALLEL_METASPACES, 100, 1000, 0.0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   263
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   264
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   265
TEST_VM_F(MetaspaceAllocationTest, multi_space_class) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   266
  do_test(Metaspace::ClassType, NUM_PARALLEL_METASPACES, 100, 1000, 0.0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   267
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   268
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   269
TEST_VM_F(MetaspaceAllocationTest, multi_space_nonclass_2) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   270
  // many metaspaces, with humongous chunks mixed in.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   271
  do_test(Metaspace::NonClassType, NUM_PARALLEL_METASPACES, 100, 1000, .006f);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   272
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   273