hotspot/src/share/vm/runtime/virtualspace.cpp
author coleenp
Wed, 20 Mar 2013 08:04:54 -0400
changeset 16430 882cddc35bec
parent 15228 e92acc84ade3
child 17113 5928fcab633d
permissions -rw-r--r--
8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15228
e92acc84ade3 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 14840
diff changeset
     2
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    26
#include "oops/markOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    27
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    28
#include "runtime/virtualspace.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
    29
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    30
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    31
# include "os_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    32
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    33
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    34
# include "os_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    35
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    36
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    37
# include "os_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5898
diff changeset
    38
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10237
diff changeset
    39
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10237
diff changeset
    40
# include "os_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10237
diff changeset
    41
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// ReservedSpace
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
ReservedSpace::ReservedSpace(size_t size) {
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    46
  initialize(size, 0, false, NULL, 0, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
ReservedSpace::ReservedSpace(size_t size, size_t alignment,
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
    50
                             bool large,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
    51
                             char* requested_address,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
    52
                             const size_t noaccess_prefix) {
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
    53
  initialize(size+noaccess_prefix, alignment, large, requested_address,
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    54
             noaccess_prefix, false);
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    55
}
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    56
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    57
ReservedSpace::ReservedSpace(size_t size, size_t alignment,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    58
                             bool large,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    59
                             bool executable) {
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
    60
  initialize(size, alignment, large, NULL, 0, executable);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
char *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
ReservedSpace::align_reserved_region(char* addr, const size_t len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
                                     const size_t prefix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
                                     const size_t prefix_align,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
                                     const size_t suffix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
                                     const size_t suffix_align)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  assert(addr != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  const size_t required_size = prefix_size + suffix_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  assert(len >= required_size, "len too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  const size_t s = size_t(addr);
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
    75
  const size_t beg_ofs = (s + prefix_size) & (suffix_align - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  const size_t beg_delta = beg_ofs == 0 ? 0 : suffix_align - beg_ofs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  if (len < beg_delta + required_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
     return NULL; // Cannot do proper alignment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  const size_t end_delta = len - (beg_delta + required_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  if (beg_delta != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    os::release_memory(addr, beg_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  if (end_delta != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    char* release_addr = (char*) (s + beg_delta + required_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    os::release_memory(release_addr, end_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  return (char*) (s + beg_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
char* ReservedSpace::reserve_and_align(const size_t reserve_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
                                       const size_t prefix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
                                       const size_t prefix_align,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
                                       const size_t suffix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
                                       const size_t suffix_align)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  assert(reserve_size > prefix_size + suffix_size, "should not be here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  char* raw_addr = os::reserve_memory(reserve_size, NULL, prefix_align);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  if (raw_addr == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  char* result = align_reserved_region(raw_addr, reserve_size, prefix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
                                       prefix_align, suffix_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
                                       suffix_align);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  if (result == NULL && !os::release_memory(raw_addr, reserve_size)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    fatal("os::release_memory failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    const size_t raw = size_t(raw_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    const size_t res = size_t(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    assert(res >= raw, "alignment decreased start addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    assert(res + prefix_size + suffix_size <= raw + reserve_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
           "alignment increased end addr");
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   120
    assert((res & (prefix_align - 1)) == 0, "bad alignment of prefix");
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   121
    assert(((res + prefix_size) & (suffix_align - 1)) == 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
           "bad alignment of suffix");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   129
// Helper method.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   130
static bool failed_to_reserve_as_requested(char* base, char* requested_address,
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   131
                                           const size_t size, bool special)
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   132
{
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   133
  if (base == requested_address || requested_address == NULL)
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   134
    return false; // did not fail
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   135
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   136
  if (base != NULL) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   137
    // Different reserve address may be acceptable in other cases
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   138
    // but for compressed oops heap should be at requested address.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   139
    assert(UseCompressedOops, "currently requested address used only for compressed oops");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   140
    if (PrintCompressedOopsMode) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   141
      tty->cr();
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   142
      tty->print_cr("Reserved memory not at requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address);
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   143
    }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   144
    // OS ignored requested address. Try different address.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   145
    if (special) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   146
      if (!os::release_memory_special(base, size)) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   147
        fatal("os::release_memory_special failed");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   148
      }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   149
    } else {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   150
      if (!os::release_memory(base, size)) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   151
        fatal("os::release_memory failed");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   152
      }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   153
    }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   154
  }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   155
  return true;
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   156
}
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   157
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   158
ReservedSpace::ReservedSpace(const size_t suffix_size,
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   159
                             const size_t suffix_align,
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   160
                             char* requested_address,
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   161
                             const size_t noaccess_prefix)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  assert(suffix_size != 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  assert(suffix_align != 0, "sanity");
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   165
  assert((suffix_size & (suffix_align - 1)) == 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    "suffix_size not divisible by suffix_align");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   168
  // Assert that if noaccess_prefix is used, it is the same as prefix_align.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   169
  // Add in noaccess_prefix to prefix
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   170
  const size_t adjusted_prefix_size = noaccess_prefix;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   171
  const size_t size = adjusted_prefix_size + suffix_size;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   172
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // On systems where the entire region has to be reserved and committed up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // front, the compound alignment normally done by this method is unnecessary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  const bool try_reserve_special = UseLargePages &&
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   176
    suffix_align == os::large_page_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  if (!os::can_commit_large_page_memory() && try_reserve_special) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   178
    initialize(size, suffix_align, true, requested_address, noaccess_prefix,
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   179
               false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  _base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  _alignment = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  _special = false;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   187
  _noaccess_prefix = 0;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   188
  _executable = false;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   189
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // Optimistically try to reserve the exact size needed.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   191
  char* addr;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   192
  if (requested_address != 0) {
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   193
    requested_address -= noaccess_prefix; // adjust address
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   194
    assert(requested_address != NULL, "huge noaccess prefix?");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   195
    addr = os::attempt_reserve_memory_at(size, requested_address);
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   196
    if (failed_to_reserve_as_requested(addr, requested_address, size, false)) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   197
      // OS ignored requested address. Try different address.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   198
      addr = NULL;
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   199
    }
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   200
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   201
    addr = os::reserve_memory(size, NULL, suffix_align);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   202
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  if (addr == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   205
  // Check whether the result has the needed alignment
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   206
  const size_t ofs = (size_t(addr) + adjusted_prefix_size) & (suffix_align - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  if (ofs != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    // Wrong alignment.  Release, allocate more space and do manual alignment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    // On most operating systems, another allocation with a somewhat larger size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    // will return an address "close to" that of the previous allocation.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    // result is often the same address (if the kernel hands out virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
    // addresses from low to high), or an address that is offset by the increase
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    // in size.  Exploit that to minimize the amount of extra space requested.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    if (!os::release_memory(addr, size)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
      fatal("os::release_memory failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    const size_t extra = MAX2(ofs, suffix_align - ofs);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   220
    addr = reserve_and_align(size + extra, adjusted_prefix_size, suffix_align,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
                             suffix_size, suffix_align);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    if (addr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
      // Try an even larger region.  If this fails, address space is exhausted.
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   224
      addr = reserve_and_align(size + suffix_align, adjusted_prefix_size,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   225
                               suffix_align, suffix_size, suffix_align);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    }
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   227
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   228
    if (requested_address != 0 &&
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   229
        failed_to_reserve_as_requested(addr, requested_address, size, false)) {
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   230
      // As a result of the alignment constraints, the allocated addr differs
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   231
      // from the requested address. Return back to the caller who can
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   232
      // take remedial action (like try again without a requested address).
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   233
      assert(_base == NULL, "should be");
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   234
      return;
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   235
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  _base = addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  _size = size;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   240
  _alignment = suffix_align;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   241
  _noaccess_prefix = noaccess_prefix;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
void ReservedSpace::initialize(size_t size, size_t alignment, bool large,
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   245
                               char* requested_address,
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   246
                               const size_t noaccess_prefix,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   247
                               bool executable) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  const size_t granularity = os::vm_allocation_granularity();
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   249
  assert((size & (granularity - 1)) == 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
         "size not aligned to os::vm_allocation_granularity()");
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   251
  assert((alignment & (granularity - 1)) == 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
         "alignment not aligned to os::vm_allocation_granularity()");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  assert(alignment == 0 || is_power_of_2((intptr_t)alignment),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
         "not a power of 2");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   256
  alignment = MAX2(alignment, (size_t)os::vm_page_size());
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   257
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   258
  // Assert that if noaccess_prefix is used, it is the same as alignment.
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   259
  assert(noaccess_prefix == 0 ||
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   260
         noaccess_prefix == alignment, "noaccess prefix wrong");
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   261
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  _base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  _special = false;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   265
  _executable = executable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  _alignment = 0;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   267
  _noaccess_prefix = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // If OS doesn't support demand paging for large page memory, we need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // to use reserve_memory_special() to reserve and pin the entire region.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  bool special = large && !os::can_commit_large_page_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  char* base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   277
  if (requested_address != 0) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   278
    requested_address -= noaccess_prefix; // adjust requested address
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   279
    assert(requested_address != NULL, "huge noaccess prefix?");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   280
  }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   281
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  if (special) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   284
    base = os::reserve_memory_special(size, requested_address, executable);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    if (base != NULL) {
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   287
      if (failed_to_reserve_as_requested(base, requested_address, size, true)) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   288
        // OS ignored requested address. Try different address.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   289
        return;
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   290
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
      // Check alignment constraints
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   292
      assert((uintptr_t) base % alignment == 0,
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   293
             "Large pages returned a non-aligned address");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
      _special = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
      // failed; try to reserve regular memory below
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   297
      if (UseLargePages && (!FLAG_IS_DEFAULT(UseLargePages) ||
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   298
                            !FLAG_IS_DEFAULT(LargePageSizeInBytes))) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   299
        if (PrintCompressedOopsMode) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   300
          tty->cr();
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   301
          tty->print_cr("Reserve regular memory without large pages.");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   302
        }
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   303
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  if (base == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    // Optimistically assume that the OSes returns an aligned base pointer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    // When reserving a large address range, most OSes seem to align to at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    // least 64K.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    // If the memory was requested at a particular address, use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    // os::attempt_reserve_memory_at() to avoid over mapping something
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    // important.  If available space is not detected, return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    if (requested_address != 0) {
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   317
      base = os::attempt_reserve_memory_at(size, requested_address);
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   318
      if (failed_to_reserve_as_requested(base, requested_address, size, false)) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   319
        // OS ignored requested address. Try different address.
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   320
        base = NULL;
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   321
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
      base = os::reserve_memory(size, NULL, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    if (base == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    // Check alignment constraints
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   329
    if ((((size_t)base + noaccess_prefix) & (alignment - 1)) != 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      // Base not aligned, retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
      if (!os::release_memory(base, size)) fatal("os::release_memory failed");
14840
8994c2377547 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 13728
diff changeset
   332
      // Make sure that size is aligned
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
      size = align_size_up(size, alignment);
14840
8994c2377547 7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents: 13728
diff changeset
   334
      base = os::reserve_memory_aligned(size, alignment);
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   335
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   336
      if (requested_address != 0 &&
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   337
          failed_to_reserve_as_requested(base, requested_address, size, false)) {
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   338
        // As a result of the alignment constraints, the allocated base differs
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   339
        // from the requested address. Return back to the caller who can
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   340
        // take remedial action (like try again without a requested address).
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   341
        assert(_base == NULL, "should be");
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   342
        return;
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   343
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // Done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  _base = base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  _size = size;
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 7397
diff changeset
   349
  _alignment = alignment;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   350
  _noaccess_prefix = noaccess_prefix;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   351
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   352
  // Assert that if noaccess_prefix is used, it is the same as alignment.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   353
  assert(noaccess_prefix == 0 ||
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   354
         noaccess_prefix == _alignment, "noaccess prefix wrong");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
         "area must be distinguisable from marks for mark-sweep");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
         "area must be distinguisable from marks for mark-sweep");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment,
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   364
                             bool special, bool executable) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  assert((size % os::vm_allocation_granularity()) == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
         "size not allocation aligned");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  _base = base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  _size = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  _alignment = alignment;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   370
  _noaccess_prefix = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  _special = special;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   372
  _executable = executable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
                                        bool split, bool realloc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  assert(partition_size <= size(), "partition failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  if (split) {
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   380
    os::split_reserved_memory(base(), size(), partition_size, realloc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   382
  ReservedSpace result(base(), partition_size, alignment, special(),
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   383
                       executable());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
ReservedSpace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
ReservedSpace::last_part(size_t partition_size, size_t alignment) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  assert(partition_size <= size(), "partition failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  ReservedSpace result(base() + partition_size, size() - partition_size,
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   392
                       alignment, special(), executable());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
size_t ReservedSpace::page_align_size_up(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  return align_size_up(size, os::vm_page_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
size_t ReservedSpace::page_align_size_down(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  return align_size_down(size, os::vm_page_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
size_t ReservedSpace::allocation_align_size_up(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  return align_size_up(size, os::vm_allocation_granularity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
size_t ReservedSpace::allocation_align_size_down(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  return align_size_down(size, os::vm_allocation_granularity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
void ReservedSpace::release() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  if (is_reserved()) {
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   419
    char *real_base = _base - _noaccess_prefix;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   420
    const size_t real_size = _size + _noaccess_prefix;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
    if (special()) {
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   422
      os::release_memory_special(real_base, real_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    } else{
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   424
      os::release_memory(real_base, real_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
    _base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    _size = 0;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   428
    _noaccess_prefix = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    _special = false;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   430
    _executable = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   434
void ReservedSpace::protect_noaccess_prefix(const size_t size) {
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   435
  assert( (_noaccess_prefix != 0) == (UseCompressedOops && _base != NULL &&
11778
eadd8fa553d9 7146354: Re-enable Compressed OOPs after 7118647 is resolved
coleenp
parents: 10565
diff changeset
   436
                                      (Universe::narrow_oop_base() != NULL) &&
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   437
                                      Universe::narrow_oop_use_implicit_null_checks()),
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   438
         "noaccess_prefix should be used only with non zero based compressed oops");
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   439
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   440
  // If there is no noaccess prefix, return.
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   441
  if (_noaccess_prefix == 0) return;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   442
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   443
  assert(_noaccess_prefix >= (size_t)os::vm_page_size(),
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   444
         "must be at least page size big");
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   445
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   446
  // Protect memory at the base of the allocated region.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   447
  // If special, the page was committed (only matters on windows)
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   448
  if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   449
                          _special)) {
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   450
    fatal("cannot protect protection page");
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   451
  }
5898
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   452
  if (PrintCompressedOopsMode) {
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   453
    tty->cr();
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   454
    tty->print_cr("Protected page at the reserved heap base: " PTR_FORMAT " / " INTX_FORMAT " bytes", _base, _noaccess_prefix);
7f882d601e07 6947341: JVM Crash running Oracle ATG CRMDemo
kvn
parents: 5547
diff changeset
   455
  }
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   456
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   457
  _base += _noaccess_prefix;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   458
  _size -= _noaccess_prefix;
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   459
  assert((size == _size) && ((uintptr_t)_base % _alignment == 0),
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   460
         "must be exactly of required size and alignment");
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   461
}
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   462
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   463
ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   464
                                     bool large, char* requested_address) :
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   465
  ReservedSpace(size, alignment, large,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   466
                requested_address,
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   467
                (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   468
                 Universe::narrow_oop_use_implicit_null_checks()) ?
1129
ec4dfac10759 6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents: 823
diff changeset
   469
                  lcm(os::vm_page_size(), alignment) : 0) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   470
  if (base() > 0) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   471
    MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   472
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   473
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   474
  // Only reserved space for the java heap should have a noaccess_prefix
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   475
  // if using compressed oops.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   476
  protect_noaccess_prefix(size);
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   477
}
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   478
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   479
ReservedHeapSpace::ReservedHeapSpace(const size_t heap_space_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   480
                                     const size_t alignment,
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   481
                                     char* requested_address) :
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   482
  ReservedSpace(heap_space_size, alignment,
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   483
                requested_address,
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   484
                (UseCompressedOops && (Universe::narrow_oop_base() != NULL) &&
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 1412
diff changeset
   485
                 Universe::narrow_oop_use_implicit_null_checks()) ?
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   486
                  lcm(os::vm_page_size(), alignment) : 0) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   487
  if (base() > 0) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   488
    MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   489
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   490
  protect_noaccess_prefix(heap_space_size);
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   491
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   493
// Reserve space for code segment.  Same as Java heap only we mark this as
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   494
// executable.
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   495
ReservedCodeSpace::ReservedCodeSpace(size_t r_size,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   496
                                     size_t rs_align,
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   497
                                     bool large) :
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   498
  ReservedSpace(r_size, rs_align, large, /*executable*/ true) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11778
diff changeset
   499
  MemTracker::record_virtual_memory_type((address)base(), mtCode);
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   500
}
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   501
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
// VirtualSpace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
VirtualSpace::VirtualSpace() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  _low_boundary           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  _high_boundary          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  _low                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  _high                   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  _lower_high             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  _middle_high            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  _upper_high             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  _lower_high_boundary    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  _middle_high_boundary   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  _upper_high_boundary    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  _lower_alignment        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  _middle_alignment       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  _upper_alignment        = 0;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   518
  _special                = false;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   519
  _executable             = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  if(!rs.is_reserved()) return false;  // allocation failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  assert(_low_boundary == NULL, "VirtualSpace already initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  _low_boundary  = rs.base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  _high_boundary = low_boundary() + rs.size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  _low = low_boundary();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  _high = low();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  _special = rs.special();
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   533
  _executable = rs.executable();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // When a VirtualSpace begins life at a large size, make all future expansion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // and shrinking occur aligned to a granularity of large pages.  This avoids
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  // fragmentation of physical addresses that inhibits the use of large pages
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // by the OS virtual memory system.  Empirically,  we see that with a 4MB
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // page size, the only spaces that get handled this way are codecache and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // the heap itself, both of which provide a substantial performance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // boost in many benchmarks when covered by large pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  // No attempt is made to force large page alignment at the very top and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // bottom of the space if they are not aligned so already.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  _lower_alignment  = os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  _middle_alignment = os::page_size_for_region(rs.size(), rs.size(), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  _upper_alignment  = os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // End of each region
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  _lower_high_boundary = (char*) round_to((intptr_t) low_boundary(), middle_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  _middle_high_boundary = (char*) round_down((intptr_t) high_boundary(), middle_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  _upper_high_boundary = high_boundary();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  // High address of each region
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  _lower_high = low_boundary();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  _middle_high = lower_high_boundary();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  _upper_high = middle_high_boundary();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  // commit to initial size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  if (committed_size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    if (!expand_by(committed_size)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
VirtualSpace::~VirtualSpace() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  release();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
void VirtualSpace::release() {
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   575
  // This does not release memory it never reserved.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 1
diff changeset
   576
  // Caller must release via rs.release();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  _low_boundary           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  _high_boundary          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  _low                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  _high                   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  _lower_high             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  _middle_high            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  _upper_high             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  _lower_high_boundary    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  _middle_high_boundary   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  _upper_high_boundary    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  _lower_alignment        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  _middle_alignment       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  _upper_alignment        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  _special                = false;
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   591
  _executable             = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
size_t VirtualSpace::committed_size() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  return pointer_delta(high(), low(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
size_t VirtualSpace::reserved_size() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  return pointer_delta(high_boundary(), low_boundary(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
size_t VirtualSpace::uncommitted_size()  const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  return reserved_size() - committed_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
bool VirtualSpace::contains(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  return low() <= (const char*) p && (const char*) p < high();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
   First we need to determine if a particular virtual space is using large
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
   pages.  This is done at the initialize function and only virtual spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
   that are larger than LargePageSizeInBytes use large pages.  Once we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
   have determined this, all expand_by and shrink_by calls must grow and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
   shrink by large page size chunks.  If a particular request
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
   is within the current large page, the call to commit and uncommit memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
   can be ignored.  In the case that the low and high boundaries of this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
   space is not large page aligned, the pages leading to the first large
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
   page address and the pages after the last large page address must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
   allocated with default pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  if (uncommitted_size() < bytes) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  if (special()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    // don't commit memory if the entire space is pinned in memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    _high += bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  char* previous_high = high();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  char* unaligned_new_high = high() + bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  assert(unaligned_new_high <= high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
         "cannot expand by more than upper boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  // Calculate where the new high for each of the regions should be.  If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  // the low_boundary() and high_boundary() are LargePageSizeInBytes aligned
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  // then the unaligned lower and upper new highs would be the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  // lower_high() and upper_high() respectively.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  char* unaligned_lower_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
    MIN2(unaligned_new_high, lower_high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  char* unaligned_middle_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    MIN2(unaligned_new_high, middle_high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  char* unaligned_upper_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    MIN2(unaligned_new_high, upper_high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  // Align the new highs based on the regions alignment.  lower and upper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  // alignment will always be default page size.  middle alignment will be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  // LargePageSizeInBytes if the actual size of the virtual space is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  // fact larger than LargePageSizeInBytes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  char* aligned_lower_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  char* aligned_middle_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
    (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  char* aligned_upper_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
    (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  // Determine which regions need to grow in this expand_by call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  // If you are growing in the lower region, high() must be in that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  // region so calcuate the size based on high().  For the middle and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // upper regions, determine the starting point of growth based on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  // location of high().  By getting the MAX of the region's low address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  // (or the prevoius region's high address) and high(), we can tell if it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  // is an intra or inter region growth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  size_t lower_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  if (aligned_lower_new_high > lower_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
    lower_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
      pointer_delta(aligned_lower_new_high, lower_high(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  size_t middle_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  if (aligned_middle_new_high > middle_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    middle_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
      pointer_delta(aligned_middle_new_high, middle_high(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  size_t upper_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  if (aligned_upper_new_high > upper_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
    upper_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
      pointer_delta(aligned_upper_new_high, upper_high(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // Check contiguity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  assert(low_boundary() <= lower_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
         lower_high() <= lower_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  assert(lower_high_boundary() <= middle_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
         middle_high() <= middle_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  assert(middle_high_boundary() <= upper_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
         upper_high() <= upper_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // Commit regions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  if (lower_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
    assert(low_boundary() <= lower_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
           lower_high() + lower_needs <= lower_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
           "must not expand beyond region");
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   701
    if (!os::commit_memory(lower_high(), lower_needs, _executable)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
      debug_only(warning("os::commit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
      _lower_high += lower_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  if (middle_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    assert(lower_high_boundary() <= middle_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
           middle_high() + middle_needs <= middle_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
           "must not expand beyond region");
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   712
    if (!os::commit_memory(middle_high(), middle_needs, middle_alignment(),
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   713
                           _executable)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
      debug_only(warning("os::commit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    _middle_high += middle_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  if (upper_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
    assert(middle_high_boundary() <= upper_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
           upper_high() + upper_needs <= upper_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
           "must not expand beyond region");
2268
bea8be80ec88 6541756: Reduce executable C-heap
coleenp
parents: 2254
diff changeset
   723
    if (!os::commit_memory(upper_high(), upper_needs, _executable)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
      debug_only(warning("os::commit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
      _upper_high += upper_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  if (pre_touch || AlwaysPreTouch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    int vm_ps = os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    for (char* curr = previous_high;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
         curr < unaligned_new_high;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
         curr += vm_ps) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      // Note the use of a write here; originally we tried just a read, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
      // since the value read was unused, the optimizer removed the read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
      // If we ever have a concurrent touchahead thread, we'll want to use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
      // a read, to avoid the potential of overwriting data (if a mutator
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
      // thread beats the touchahead thread to a page).  There are various
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
      // ways of making sure this read is not optimized away: for example,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
      // generating the code for a read procedure at runtime.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
      *curr = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  _high += bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
// A page is uncommitted if the contents of the entire page is deemed unusable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
// Continue to decrement the high() pointer until it reaches a page boundary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
// in which case that particular page can now be uncommitted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
void VirtualSpace::shrink_by(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  if (committed_size() < size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
    fatal("Cannot shrink virtual space to negative size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  if (special()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
    // don't uncommit if the entire space is pinned in memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
    _high -= size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  char* unaligned_new_high = high() - size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  assert(unaligned_new_high >= low_boundary(), "cannot shrink past lower boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  // Calculate new unaligned address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  char* unaligned_upper_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    MAX2(unaligned_new_high, middle_high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  char* unaligned_middle_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
    MAX2(unaligned_new_high, lower_high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  char* unaligned_lower_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
    MAX2(unaligned_new_high, low_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  // Align address to region's alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  char* aligned_upper_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  char* aligned_middle_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  char* aligned_lower_new_high =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
    (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  // Determine which regions need to shrink
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  size_t upper_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  if (aligned_upper_new_high < upper_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    upper_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
      pointer_delta(upper_high(), aligned_upper_new_high, sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  size_t middle_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  if (aligned_middle_new_high < middle_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    middle_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
      pointer_delta(middle_high(), aligned_middle_new_high, sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  size_t lower_needs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  if (aligned_lower_new_high < lower_high()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    lower_needs =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
      pointer_delta(lower_high(), aligned_lower_new_high, sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  // Check contiguity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  assert(middle_high_boundary() <= upper_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
         upper_high() <= upper_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  assert(lower_high_boundary() <= middle_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
         middle_high() <= middle_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  assert(low_boundary() <= lower_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
         lower_high() <= lower_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  // Uncommit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  if (upper_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    assert(middle_high_boundary() <= aligned_upper_new_high &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
           aligned_upper_new_high + upper_needs <= upper_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
           "must not shrink beyond region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
    if (!os::uncommit_memory(aligned_upper_new_high, upper_needs)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
      debug_only(warning("os::uncommit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
      _upper_high -= upper_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  if (middle_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
    assert(lower_high_boundary() <= aligned_middle_new_high &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
           aligned_middle_new_high + middle_needs <= middle_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
           "must not shrink beyond region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
    if (!os::uncommit_memory(aligned_middle_new_high, middle_needs)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
      debug_only(warning("os::uncommit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
      _middle_high -= middle_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  if (lower_needs > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    assert(low_boundary() <= aligned_lower_new_high &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
           aligned_lower_new_high + lower_needs <= lower_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
           "must not shrink beyond region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
    if (!os::uncommit_memory(aligned_lower_new_high, lower_needs)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
      debug_only(warning("os::uncommit_memory failed"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
      _lower_high -= lower_needs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  _high -= size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
void VirtualSpace::check_for_contiguity() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  // Check contiguity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  assert(low_boundary() <= lower_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
         lower_high() <= lower_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  assert(lower_high_boundary() <= middle_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
         middle_high() <= middle_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  assert(middle_high_boundary() <= upper_high() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
         upper_high() <= upper_high_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
         "high address must be contained within the region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  assert(low() >= low_boundary(), "low");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  assert(low_boundary() <= lower_high_boundary(), "lower high boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  assert(upper_high_boundary() <= high_boundary(), "upper high boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  assert(high() <= upper_high(), "upper high");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
void VirtualSpace::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  tty->print   ("Virtual space:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  if (special()) tty->print(" (pinned in memory)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  tty->cr();
15228
e92acc84ade3 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 14840
diff changeset
   871
  tty->print_cr(" - committed: " SIZE_FORMAT, committed_size());
e92acc84ade3 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 14840
diff changeset
   872
  tty->print_cr(" - reserved:  " SIZE_FORMAT, reserved_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  tty->print_cr(" - [low, high]:     [" INTPTR_FORMAT ", " INTPTR_FORMAT "]",  low(), high());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  tty->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]",  low_boundary(), high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
#endif