src/hotspot/share/memory/metaspace/virtualSpaceNode.hpp
author stuefe
Sun, 10 Feb 2019 09:10:42 +0100
changeset 53970 1ad7c590a6e7
parent 53244 9807daeb47c4
child 54437 2ae93028bef3
permissions -rw-r--r--
8218988: Improve metaspace verifications Reviewed-by: zgu, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51334
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     4
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     7
 * published by the Free Software Foundation.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     8
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    13
 * accompanied this code).
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    14
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    18
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    21
 * questions.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    22
 *
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
#ifndef SHARE_MEMORY_METASPACE_VIRTUALSPACENODE_HPP
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    26
#define SHARE_MEMORY_METASPACE_VIRTUALSPACENODE_HPP
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    27
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    28
#include "memory/virtualspace.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    29
#include "memory/memRegion.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
#include "utilities/debug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    31
#include "utilities/globalDefinitions.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    32
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
class outputStream;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    34
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    35
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    36
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
class Metachunk;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
class ChunkManager;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
class OccupancyMap;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    40
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
// A VirtualSpaceList node.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
class VirtualSpaceNode : public CHeapObj<mtClass> {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
  friend class VirtualSpaceList;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
  // Link to next VirtualSpaceNode
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
  VirtualSpaceNode* _next;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    47
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    48
  // Whether this node is contained in class or metaspace.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    49
  const bool _is_class;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    50
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    51
  // total in the VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    52
  ReservedSpace _rs;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    53
  VirtualSpace _virtual_space;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    54
  MetaWord* _top;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    55
  // count of chunks contained in this VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    56
  uintx _container_count;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    57
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    58
  OccupancyMap* _occupancy_map;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    59
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    60
  // Convenience functions to access the _virtual_space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    61
  char* low()  const { return virtual_space()->low(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    62
  char* high() const { return virtual_space()->high(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    64
  // The first Metachunk will be allocated at the bottom of the
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    65
  // VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    66
  Metachunk* first_chunk() { return (Metachunk*) bottom(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
  // Committed but unused space in the virtual space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    69
  size_t free_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
  // True if this node belongs to class metaspace.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
  bool is_class() const { return _is_class; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
  // Helper function for take_from_committed: allocate padding chunks
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    75
  // until top is at the given address.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    76
  void allocate_padding_chunks_until_top_is_at(MetaWord* target_top);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    77
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    78
 public:
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    79
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
  VirtualSpaceNode(bool is_class, size_t byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
  VirtualSpaceNode(bool is_class, ReservedSpace rs) :
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50286
diff changeset
    82
    _next(NULL), _is_class(is_class), _rs(rs), _top(NULL), _container_count(0), _occupancy_map(NULL) {}
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
  ~VirtualSpaceNode();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    85
  // Convenience functions for logical bottom and end
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    86
  MetaWord* bottom() const { return (MetaWord*) _virtual_space.low(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
  MetaWord* end() const { return (MetaWord*) _virtual_space.high(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
  const OccupancyMap* occupancy_map() const { return _occupancy_map; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    90
  OccupancyMap* occupancy_map() { return _occupancy_map; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    91
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    92
  bool contains(const void* ptr) { return ptr >= low() && ptr < high(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
  size_t reserved_words() const  { return _virtual_space.reserved_size() / BytesPerWord; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
  size_t committed_words() const { return _virtual_space.actual_committed_size() / BytesPerWord; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
  bool is_pre_committed() const { return _virtual_space.special(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
  // address of next available space in _virtual_space;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   100
  // Accessors
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
  VirtualSpaceNode* next() { return _next; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
  void set_next(VirtualSpaceNode* v) { _next = v; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   104
  void set_top(MetaWord* v) { _top = v; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
  // Accessors
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   107
  VirtualSpace* virtual_space() const { return (VirtualSpace*) &_virtual_space; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
  // Returns true if "word_size" is available in the VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   110
  bool is_available(size_t word_size) { return word_size <= pointer_delta(end(), _top, sizeof(MetaWord)); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
  MetaWord* top() const { return _top; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   113
  void inc_top(size_t word_size) { _top += word_size; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
  uintx container_count() { return _container_count; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
  void inc_container_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
  void dec_container_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
  // used and capacity in this single entry in the list
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120
  size_t used_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   121
  size_t capacity_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   122
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   123
  bool initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   124
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   125
  // get space from the virtual space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   126
  Metachunk* take_from_committed(size_t chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   127
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   128
  // Allocate a chunk from the virtual space and return it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
  Metachunk* get_chunk_vs(size_t chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   130
50286
cbc4fca9171e 8203865: Metaspace cleanup: Remove unused MemRegion in VirtualSpaceNode
stuefe
parents: 50193
diff changeset
   131
  // Expands the committed space by at least min_words words.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   132
  bool expand_by(size_t min_words, size_t preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   133
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
  // In preparation for deleting this node, remove all the chunks
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   135
  // in the node from any freelist.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   136
  void purge(ChunkManager* chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   137
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   138
  // If an allocation doesn't fit in the current node a new node is created.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   139
  // Allocate chunks out of the remaining committed space in this node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   140
  // to avoid wasting that memory.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   141
  // This always adds up because all the chunk sizes are multiples of
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
  // the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   143
  void retire(ChunkManager* chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   144
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   145
  void print_on(outputStream* st) const                 { print_on(st, K); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   146
  void print_on(outputStream* st, size_t scale) const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   147
  void print_map(outputStream* st, bool is_class) const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
  // Debug support
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   150
  DEBUG_ONLY(void mangle();)
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 53244
diff changeset
   151
  // Verify counters and basic structure. Slow mode: verify all chunks in depth and occupancy map.
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 53244
diff changeset
   152
  DEBUG_ONLY(void verify(bool slow);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   153
  // Verify that all free chunks in this node are ideally merged
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 53244
diff changeset
   154
  // (there should not be multiple small chunks where a large chunk could exist.)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
  DEBUG_ONLY(void verify_free_chunks_are_ideally_merged();)
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   156
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
};
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51334
diff changeset
   161
#endif // SHARE_MEMORY_METASPACE_VIRTUALSPACENODE_HPP