test/hotspot/gtest/memory/test_metaspace_allocation.cpp
author stuefe
Sun, 11 Mar 2018 07:11:03 +0100
changeset 49389 9ef2eee8ca7c
parent 49365 825f006619e5
child 49401 0c71baee49a7
permissions -rw-r--r--
8199430: Rename MetaspaceAux to something more meaningful Reviewed-by: zgu, 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"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    29
#include "runtime/os.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    30
#include "utilities/align.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    31
#include "utilities/debug.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    32
#include "utilities/globalDefinitions.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    33
#include "utilities/ostream.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    34
#include "unittest.hpp"
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    35
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    36
#define NUM_PARALLEL_METASPACES                 50
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    37
#define MAX_PER_METASPACE_ALLOCATION_WORDSIZE   (512 * K)
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    38
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    39
//#define DEBUG_VERBOSE true
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    40
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    41
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    42
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    43
struct chunkmanager_statistics_t {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    44
  int num_specialized_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    45
  int num_small_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    46
  int num_medium_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    47
  int num_humongous_chunks;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    48
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    49
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    50
extern void test_metaspace_retrieve_chunkmanager_statistics(Metaspace::MetadataType mdType, chunkmanager_statistics_t* out);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    51
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    52
static void print_chunkmanager_statistics(outputStream* st, Metaspace::MetadataType mdType) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    53
  chunkmanager_statistics_t stat;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    54
  test_metaspace_retrieve_chunkmanager_statistics(mdType, &stat);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    55
  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
    56
               stat.num_medium_chunks, stat.num_humongous_chunks);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    57
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    58
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    59
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    60
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    61
struct chunk_geometry_t {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    62
  size_t specialized_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    63
  size_t small_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    64
  size_t medium_chunk_word_size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    65
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    66
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    67
extern void test_metaspace_retrieve_chunk_geometry(Metaspace::MetadataType mdType, chunk_geometry_t* out);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    68
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    69
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    70
class MetaspaceAllocationTest : public ::testing::Test {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    71
protected:
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    72
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    73
  struct {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    74
    size_t allocated;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    75
    Mutex* lock;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    76
    Metaspace* space;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    77
    bool is_empty() const { return allocated == 0; }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    78
    bool is_full() const { return allocated >= MAX_PER_METASPACE_ALLOCATION_WORDSIZE; }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    79
  } _spaces[NUM_PARALLEL_METASPACES];
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    80
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    81
  chunk_geometry_t _chunk_geometry;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    82
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    83
  virtual void SetUp() {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    84
    ::memset(_spaces, 0, sizeof(_spaces));
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    85
    test_metaspace_retrieve_chunk_geometry(Metaspace::NonClassType, &_chunk_geometry);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    86
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    87
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    88
  virtual void TearDown() {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    89
    for (int i = 0; i < NUM_PARALLEL_METASPACES; i ++) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    90
      if (_spaces[i].space != NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    91
        delete _spaces[i].space;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    92
        delete _spaces[i].lock;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    93
      }
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
  void create_space(int i) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    98
    assert(i >= 0 && i < NUM_PARALLEL_METASPACES, "Sanity");
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
    99
    assert(_spaces[i].space == NULL && _spaces[i].allocated == 0, "Sanity");
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   100
    if (_spaces[i].lock == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   101
      _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
   102
      ASSERT_TRUE(_spaces[i].lock != NULL);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   103
    }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   104
    // Let every ~10th space be an anonymous one to test different allocation patterns.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   105
    const Metaspace::MetaspaceType msType = (os::random() % 100 < 10) ?
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   106
      Metaspace::AnonymousMetaspaceType : Metaspace::StandardMetaspaceType;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   107
    _spaces[i].space = new Metaspace(_spaces[i].lock, msType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   108
    _spaces[i].allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   109
    ASSERT_TRUE(_spaces[i].space != NULL);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   110
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   111
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   112
  // 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
   113
  //   empty, non-empty or full.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   114
  // Returns -1 if no matching space exists.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   115
  enum fillgrade { fg_empty, fg_non_empty, fg_full };
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   116
  int get_random_matching_space(int metaspaces, fillgrade fg) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   117
    const int start_index = os::random() % metaspaces;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   118
    int i = start_index;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   119
    do {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   120
      if (fg == fg_empty && _spaces[i].is_empty()) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   121
        return i;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   122
      } else if ((fg == fg_full && _spaces[i].is_full()) ||
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   123
                 (fg == fg_non_empty && !_spaces[i].is_full() && !_spaces[i].is_empty())) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   124
        return i;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   125
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   126
      i ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   127
      if (i == metaspaces) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   128
        i = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   129
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   130
    } while (i != start_index);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   131
    return -1;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   132
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   133
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   134
  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
   135
  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
   136
  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
   137
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   138
  void do_test(Metaspace::MetadataType mdType, int metaspaces, int phases, int allocs_per_phase,
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   139
               float probability_for_large_allocations // 0.0-1.0
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   140
  ) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   141
    // Alternate between breathing in (allocating n blocks for a random Metaspace) and
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   142
    // breathing out (deleting a random Metaspace). The intent is to stress the coalescation
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   143
    // and splitting of free chunks.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   144
    int phases_done = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   145
    bool allocating = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   146
    while (phases_done < phases) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   147
      bool force_switch = false;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   148
      if (allocating) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   149
        // Allocate space from metaspace, with a preference for completely empty spaces. This
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   150
        // should provide a good mixture of metaspaces in the virtual space.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   151
        int index = get_random_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   152
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   153
          index = get_random_non_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   154
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   155
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   156
          // All spaces are full, switch to freeing.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   157
          force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   158
        } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   159
          // create space if it does not yet exist.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   160
          if (_spaces[index].space == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   161
            create_space(index);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   162
          }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   163
          // 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
   164
          //  to force humongous chunk allocations.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   165
          int allocs_done = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   166
          while (allocs_done < allocs_per_phase && !_spaces[index].is_full()) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   167
            size_t size = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   168
            int r = os::random() % 1000;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   169
            if ((float)r < probability_for_large_allocations * 1000.0) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   170
              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
   171
            } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   172
              size = os::random() % 64;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   173
            }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   174
            MetaWord* const p = _spaces[index].space->allocate(size, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   175
            if (p == NULL) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   176
              // We very probably did hit the metaspace "until-gc" limit.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   177
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   178
              tty->print_cr("OOM for " SIZE_FORMAT " words. ", size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   179
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   180
              // Just switch to deallocation and resume tests.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   181
              force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   182
              break;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   183
            } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   184
              _spaces[index].allocated += size;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   185
              allocs_done ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   186
            }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   187
          }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   188
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   189
      } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   190
        // freeing: find a metaspace and delete it, with preference for completely filled spaces.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   191
        int index = get_random_full_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   192
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   193
          index = get_random_non_emtpy_space(metaspaces);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   194
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   195
        if (index == -1) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   196
          force_switch = true;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   197
        } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   198
          assert(_spaces[index].space != NULL && _spaces[index].allocated > 0, "Sanity");
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   199
          delete _spaces[index].space;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   200
          _spaces[index].space = NULL;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   201
          _spaces[index].allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   202
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   203
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   204
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   205
      if (force_switch) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   206
        allocating = !allocating;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   207
      } else {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   208
        // periodically switch between allocating and freeing, but prefer allocation because
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   209
        // we want to intermingle allocations of multiple metaspaces.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   210
        allocating = os::random() % 5 < 4;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   211
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   212
      phases_done ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   213
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   214
      int metaspaces_in_use = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   215
      size_t total_allocated = 0;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   216
      for (int i = 0; i < metaspaces; i ++) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   217
        if (_spaces[i].allocated > 0) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   218
          total_allocated += _spaces[i].allocated;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   219
          metaspaces_in_use ++;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   220
        }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   221
      }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   222
      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
   223
      print_chunkmanager_statistics(tty, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   224
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   225
    }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   226
#ifdef DEBUG_VERBOSE
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   227
    tty->print_cr("Test finished. ");
49389
9ef2eee8ca7c 8199430: Rename MetaspaceAux to something more meaningful
stuefe
parents: 49365
diff changeset
   228
    MetaspaceUtils::print_metaspace_map(tty, mdType);
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   229
    print_chunkmanager_statistics(tty, mdType);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   230
#endif
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   231
  }
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   232
};
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   233
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   234
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   235
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   236
TEST_F(MetaspaceAllocationTest, chunk_geometry) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   237
  ASSERT_GT(_chunk_geometry.specialized_chunk_word_size, (size_t) 0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   238
  ASSERT_GT(_chunk_geometry.small_chunk_word_size, _chunk_geometry.specialized_chunk_word_size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   239
  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
   240
  ASSERT_GT(_chunk_geometry.medium_chunk_word_size, _chunk_geometry.small_chunk_word_size);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   241
  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
   242
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   243
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   244
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   245
TEST_VM_F(MetaspaceAllocationTest, single_space_nonclass) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   246
  do_test(Metaspace::NonClassType, 1, 1000, 100, 0);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   247
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   248
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   249
TEST_VM_F(MetaspaceAllocationTest, single_space_class) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   250
  do_test(Metaspace::ClassType, 1, 1000, 100, 0);
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, multi_space_nonclass) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   254
  do_test(Metaspace::NonClassType, NUM_PARALLEL_METASPACES, 100, 1000, 0.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, multi_space_class) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   258
  do_test(Metaspace::ClassType, NUM_PARALLEL_METASPACES, 100, 1000, 0.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_2) {
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   262
  // many metaspaces, with humongous chunks mixed in.
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   263
  do_test(Metaspace::NonClassType, NUM_PARALLEL_METASPACES, 100, 1000, .006f);
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   264
}
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents:
diff changeset
   265