src/hotspot/share/memory/metaspace/virtualSpaceNode.hpp
author phh
Sat, 30 Nov 2019 14:33:05 -0800
changeset 59330 5b96c12f909d
parent 54437 2ae93028bef3
child 57464 32e61f51ee09
child 58063 bdf136b8ae0e
permissions -rw-r--r--
8234541: C1 emits an empty message when it inlines successfully Summary: Use "inline" as the message when successfull Reviewed-by: thartmann, mdoerr Contributed-by: navy.xliu@gmail.com
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(); }
54437
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
    63
  char* low_boundary()  const { return virtual_space()->low_boundary(); }
2ae93028bef3 8221539: [metaspace] Improve MetaspaceObj::is_metaspace_obj() and friends
stuefe
parents: 53970
diff changeset
    64
  char* high_boundary() const { return virtual_space()->high_boundary(); }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    65
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    66
  // The first Metachunk will be allocated at the bottom of the
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
  // VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
  Metachunk* first_chunk() { return (Metachunk*) bottom(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    69
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
  // Committed but unused space in the virtual space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
  size_t free_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
  // True if this node belongs to class metaspace.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
  bool is_class() const { return _is_class; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    75
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    76
  // Helper function for take_from_committed: allocate padding chunks
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    77
  // until top is at the given address.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    78
  void allocate_padding_chunks_until_top_is_at(MetaWord* target_top);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    79
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
 public:
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    82
  VirtualSpaceNode(bool is_class, size_t byte_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
  VirtualSpaceNode(bool is_class, ReservedSpace rs) :
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50286
diff changeset
    84
    _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
    85
  ~VirtualSpaceNode();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    86
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
  // Convenience functions for logical bottom and end
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
  MetaWord* bottom() const { return (MetaWord*) _virtual_space.low(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
  MetaWord* end() const { return (MetaWord*) _virtual_space.high(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    90
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    91
  const OccupancyMap* occupancy_map() const { return _occupancy_map; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    92
  OccupancyMap* occupancy_map() { return _occupancy_map; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
  bool contains(const void* ptr) { return ptr >= low() && ptr < high(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    96
  size_t reserved_words() const  { return _virtual_space.reserved_size() / BytesPerWord; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    97
  size_t committed_words() const { return _virtual_space.actual_committed_size() / BytesPerWord; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
  bool is_pre_committed() const { return _virtual_space.special(); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   100
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
  // address of next available space in _virtual_space;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
  // Accessors
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
  VirtualSpaceNode* next() { return _next; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   104
  void set_next(VirtualSpaceNode* v) { _next = v; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
  void set_top(MetaWord* v) { _top = v; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   107
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
  // Accessors
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
  VirtualSpace* virtual_space() const { return (VirtualSpace*) &_virtual_space; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   110
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
  // Returns true if "word_size" is available in the VirtualSpace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
  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
   113
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
  MetaWord* top() const { return _top; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
  void inc_top(size_t word_size) { _top += word_size; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
  uintx container_count() { return _container_count; }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
  void inc_container_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
  void dec_container_count();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   121
  // used and capacity in this single entry in the list
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   122
  size_t used_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   123
  size_t capacity_words_in_vs() const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   124
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   125
  bool initialize();
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   126
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   127
  // get space from the virtual space
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   128
  Metachunk* take_from_committed(size_t chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   129
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   130
  // Allocate a chunk from the virtual space and return it.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   131
  Metachunk* get_chunk_vs(size_t chunk_word_size);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   132
50286
cbc4fca9171e 8203865: Metaspace cleanup: Remove unused MemRegion in VirtualSpaceNode
stuefe
parents: 50193
diff changeset
   133
  // Expands the committed space by at least min_words words.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   134
  bool expand_by(size_t min_words, size_t preferred_words);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   135
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   136
  // In preparation for deleting this node, remove all the chunks
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   137
  // in the node from any freelist.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   138
  void purge(ChunkManager* chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   139
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   140
  // 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
   141
  // Allocate chunks out of the remaining committed space in this node
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   142
  // to avoid wasting that memory.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   143
  // This always adds up because all the chunk sizes are multiples of
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   144
  // the smallest chunk size.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   145
  void retire(ChunkManager* chunk_manager);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   146
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   147
  void print_on(outputStream* st) const                 { print_on(st, K); }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
  void print_on(outputStream* st, size_t scale) const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
  void print_map(outputStream* st, bool is_class) const;
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   150
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   151
  // Debug support
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   152
  DEBUG_ONLY(void mangle();)
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 53244
diff changeset
   153
  // 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
   154
  DEBUG_ONLY(void verify(bool slow);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   155
  // Verify that all free chunks in this node are ideally merged
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 53244
diff changeset
   156
  // (there should not be multiple small chunks where a large chunk could exist.)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   157
  DEBUG_ONLY(void verify_free_chunks_are_ideally_merged();)
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   159
};
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   162
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51334
diff changeset
   163
#endif // SHARE_MEMORY_METASPACE_VIRTUALSPACENODE_HPP