hotspot/src/share/vm/gc/shared/collectedHeap.cpp
author tschatzl
Thu, 25 Jun 2015 09:06:35 +0200
changeset 31603 4bd3b4863e10
parent 30870 3050fdcdc60b
child 32623 390a27af5657
permissions -rw-r--r--
8129573: CollectedHeap::fill_with_objects() needs to use multiple arrays in 32 bit mode too Summary: In JDK-8042668 we introduced a custom fill threshold for G1. This leads to CollectedHeap::fill_with_objects create too large objects in G1 when using it in 32 bit mode, as the code to create multiple filler objects is IFDEF'ed out on 32 bit. Enable this code on 32 bit too. Reviewed-by: tonyp, mgerdin, tbenson
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
29081
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
     2
 * Copyright (c) 2001, 2015, 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: 5544
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5544
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: 5544
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: 6759
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    26
#include "classfile/systemDictionary.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    27
#include "gc/shared/allocTracer.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    28
#include "gc/shared/barrierSet.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    29
#include "gc/shared/collectedHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    30
#include "gc/shared/collectedHeap.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    31
#include "gc/shared/gcHeapSummary.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    32
#include "gc/shared/gcTrace.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    33
#include "gc/shared/gcTraceTime.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    34
#include "gc/shared/gcWhen.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    35
#include "gc/shared/vmGCOperations.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    36
#include "memory/metaspace.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30152
diff changeset
    37
#include "oops/instanceMirrorKlass.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    38
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    39
#include "runtime/init.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 13738
diff changeset
    40
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    41
#include "services/heapDumper.hpp"
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
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
int CollectedHeap::_fire_out_of_memory_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
    48
size_t CollectedHeap::_filler_array_max_size = 0;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
    49
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    50
template <>
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    51
void EventLogBase<GCMessage>::print(outputStream* st, GCMessage& m) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    52
  st->print_cr("GC heap %s", m.is_before ? "before" : "after");
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    53
  st->print_raw(m);
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    54
}
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    55
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    56
void GCHeapLog::log_heap(bool before) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    57
  if (!should_log()) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    58
    return;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    59
  }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    60
11788
bef6166c683c 7145537: minor tweaks to LogEvents
never
parents: 11636
diff changeset
    61
  double timestamp = fetch_timestamp();
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    62
  MutexLockerEx ml(&_mutex, Mutex::_no_safepoint_check_flag);
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    63
  int index = compute_log_index();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    64
  _records[index].thread = NULL; // Its the GC thread so it's not that interesting.
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    65
  _records[index].timestamp = timestamp;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    66
  _records[index].data.is_before = before;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    67
  stringStream st(_records[index].data.buffer(), _records[index].data.size());
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    68
  if (before) {
11788
bef6166c683c 7145537: minor tweaks to LogEvents
never
parents: 11636
diff changeset
    69
    Universe::print_heap_before_gc(&st, true);
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    70
  } else {
11788
bef6166c683c 7145537: minor tweaks to LogEvents
never
parents: 11636
diff changeset
    71
    Universe::print_heap_after_gc(&st, true);
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    72
  }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    73
}
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
    74
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    75
VirtualSpaceSummary CollectedHeap::create_heap_space_summary() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    76
  size_t capacity_in_words = capacity() / HeapWordSize;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    77
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    78
  return VirtualSpaceSummary(
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    79
    reserved_region().start(), reserved_region().start() + capacity_in_words, reserved_region().end());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    80
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    81
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    82
GCHeapSummary CollectedHeap::create_heap_summary() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    83
  VirtualSpaceSummary heap_space = create_heap_space_summary();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    84
  return GCHeapSummary(heap_space, used());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    85
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    86
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    87
MetaspaceSummary CollectedHeap::create_metaspace_summary() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    88
  const MetaspaceSizes meta_space(
23853
3e1633ff6996 8035667: EventMetaspaceSummary doesn't report committed Metaspace memory
ehelin
parents: 23470
diff changeset
    89
      MetaspaceAux::committed_bytes(),
23854
50f7f89b34e0 8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents: 23853
diff changeset
    90
      MetaspaceAux::used_bytes(),
19988
2b100c528806 8023476: Metaspace capacity > reserved
ehelin
parents: 19339
diff changeset
    91
      MetaspaceAux::reserved_bytes());
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    92
  const MetaspaceSizes data_space(
23853
3e1633ff6996 8035667: EventMetaspaceSummary doesn't report committed Metaspace memory
ehelin
parents: 23470
diff changeset
    93
      MetaspaceAux::committed_bytes(Metaspace::NonClassType),
23854
50f7f89b34e0 8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents: 23853
diff changeset
    94
      MetaspaceAux::used_bytes(Metaspace::NonClassType),
19988
2b100c528806 8023476: Metaspace capacity > reserved
ehelin
parents: 19339
diff changeset
    95
      MetaspaceAux::reserved_bytes(Metaspace::NonClassType));
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    96
  const MetaspaceSizes class_space(
23853
3e1633ff6996 8035667: EventMetaspaceSummary doesn't report committed Metaspace memory
ehelin
parents: 23470
diff changeset
    97
      MetaspaceAux::committed_bytes(Metaspace::ClassType),
23854
50f7f89b34e0 8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents: 23853
diff changeset
    98
      MetaspaceAux::used_bytes(Metaspace::ClassType),
19988
2b100c528806 8023476: Metaspace capacity > reserved
ehelin
parents: 19339
diff changeset
    99
      MetaspaceAux::reserved_bytes(Metaspace::ClassType));
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   100
23470
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   101
  const MetaspaceChunkFreeListSummary& ms_chunk_free_list_summary =
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   102
    MetaspaceAux::chunk_free_list_summary(Metaspace::NonClassType);
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   103
  const MetaspaceChunkFreeListSummary& class_chunk_free_list_summary =
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   104
    MetaspaceAux::chunk_free_list_summary(Metaspace::ClassType);
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   105
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   106
  return MetaspaceSummary(MetaspaceGC::capacity_until_GC(), meta_space, data_space, class_space,
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   107
                          ms_chunk_free_list_summary, class_chunk_free_list_summary);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   108
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   109
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   110
void CollectedHeap::print_heap_before_gc() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   111
  if (PrintHeapAtGC) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   112
    Universe::print_heap_before_gc();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   113
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   114
  if (_gc_heap_log != NULL) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   115
    _gc_heap_log->log_heap_before();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   116
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   117
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   118
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   119
void CollectedHeap::print_heap_after_gc() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   120
  if (PrintHeapAtGC) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   121
    Universe::print_heap_after_gc();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   122
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   123
  if (_gc_heap_log != NULL) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   124
    _gc_heap_log->log_heap_after();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   125
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   126
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   127
29081
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   128
void CollectedHeap::print_on_error(outputStream* st) const {
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   129
  st->print_cr("Heap:");
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   130
  print_extended_on(st);
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   131
  st->cr();
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   132
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   133
  _barrier_set->print_on(st);
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   134
}
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 28940
diff changeset
   135
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   136
void CollectedHeap::register_nmethod(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   137
  assert_locked_or_safepoint(CodeCache_lock);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   138
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   139
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   140
void CollectedHeap::unregister_nmethod(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   141
  assert_locked_or_safepoint(CodeCache_lock);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   142
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18707
diff changeset
   143
28940
c314cf1db3fa 8066566: Refactor ParNewGeneration to contain ParNewTracer
mlarsson
parents: 26829
diff changeset
   144
void CollectedHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   145
  const GCHeapSummary& heap_summary = create_heap_summary();
23470
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   146
  gc_tracer->report_gc_heap_summary(when, heap_summary);
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   147
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   148
  const MetaspaceSummary& metaspace_summary = create_metaspace_summary();
23470
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 23464
diff changeset
   149
  gc_tracer->report_metaspace_summary(when, metaspace_summary);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   150
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   151
28940
c314cf1db3fa 8066566: Refactor ParNewGeneration to contain ParNewTracer
mlarsson
parents: 26829
diff changeset
   152
void CollectedHeap::trace_heap_before_gc(const GCTracer* gc_tracer) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   153
  trace_heap(GCWhen::BeforeGC, gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   154
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   155
28940
c314cf1db3fa 8066566: Refactor ParNewGeneration to contain ParNewTracer
mlarsson
parents: 26829
diff changeset
   156
void CollectedHeap::trace_heap_after_gc(const GCTracer* gc_tracer) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   157
  trace_heap(GCWhen::AfterGC, gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   158
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   159
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
// Memory state functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5702
diff changeset
   162
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   163
CollectedHeap::CollectedHeap() {
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   164
  const size_t max_len = size_t(arrayOopDesc::max_array_length(T_INT));
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   165
  const size_t elements_per_word = HeapWordSize / sizeof(jint);
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   166
  _filler_array_max_size = align_object_size(filler_array_hdr_size() +
12229
c34a85c8f5aa 7103665: HeapWord*ParallelScavengeHeap::failed_mem_allocate(unsigned long,bool)+0x97
brutisso
parents: 11788
diff changeset
   167
                                             max_len / elements_per_word);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   168
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   169
  _barrier_set = NULL;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   170
  _is_gc_active = false;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   171
  _total_collections = _total_full_collections = 0;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   172
  _gc_cause = _gc_lastcause = GCCause::_no_gc;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  NOT_PRODUCT(_promotion_failure_alot_count = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  NOT_PRODUCT(_promotion_failure_alot_gc_number = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    // create the gc cause jvmstat counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    _perf_gc_cause = PerfDataManager::create_string_variable(SUN_GC, "cause",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
                             80, GCCause::to_string(_gc_cause), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    _perf_gc_lastcause =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
                PerfDataManager::create_string_variable(SUN_GC, "lastCause",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
                             80, GCCause::to_string(_gc_lastcause), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  }
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   187
  _defer_initial_card_mark = false; // strengthened by subclass in pre_initialize() below.
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   188
  // Create the ring log
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   189
  if (LogEvents) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   190
    _gc_heap_log = new GCHeapLog();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   191
  } else {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   192
    _gc_heap_log = NULL;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11414
diff changeset
   193
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   196
// This interface assumes that it's being called by the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   197
// vm thread. It collects the heap assuming that the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   198
// heap lock is already held and that we are executing in
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   199
// the context of the vm thread.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   200
void CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   201
  assert(Thread::current()->is_VM_thread(), "Precondition#1");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   202
  assert(Heap_lock->is_locked(), "Precondition#2");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   203
  GCCauseSetter gcs(this, cause);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   204
  switch (cause) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   205
    case GCCause::_heap_inspection:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   206
    case GCCause::_heap_dump:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   207
    case GCCause::_metadata_GC_threshold : {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   208
      HandleMark hm;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   209
      do_full_collection(false);        // don't clear all soft refs
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   210
      break;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   211
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   212
    case GCCause::_last_ditch_collection: {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   213
      HandleMark hm;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   214
      do_full_collection(true);         // do clear all soft refs
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   215
      break;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   216
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   217
    default:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   218
      ShouldNotReachHere(); // Unexpected use of this function
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   219
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   220
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12236
diff changeset
   221
30152
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29081
diff changeset
   222
void CollectedHeap::set_barrier_set(BarrierSet* barrier_set) {
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29081
diff changeset
   223
  _barrier_set = barrier_set;
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29081
diff changeset
   224
  oopDesc::set_bs(_barrier_set);
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29081
diff changeset
   225
}
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29081
diff changeset
   226
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   227
void CollectedHeap::pre_initialize() {
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   228
  // Used for ReduceInitialCardMarks (when COMPILER2 is used);
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   229
  // otherwise remains unused.
5543
95c4cdd5b505 6953483: Typo related to ReduceInitialCardMarks leaves concurrent collectors vulnerable to heap corruption
ysr
parents: 4742
diff changeset
   230
#ifdef COMPILER2
4742
9b18850a3185 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 4637
diff changeset
   231
  _defer_initial_card_mark =    ReduceInitialCardMarks && can_elide_tlab_store_barriers()
9b18850a3185 6920090: G1: Disable ReduceInitialCardMarks at least until 6920109 is fixed
ysr
parents: 4637
diff changeset
   232
                             && (DeferInitialCardMark || card_mark_must_follow_store());
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   233
#else
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   234
  assert(_defer_initial_card_mark == false, "Who would set it?");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   235
#endif
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   236
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
void CollectedHeap::check_for_bad_heap_word_value(HeapWord* addr, size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  if (CheckMemoryInitialization && ZapUnusedHeapArea) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    for (size_t slot = 0; slot < size; slot += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      assert((*(intptr_t*) (addr + slot)) != ((intptr_t) badHeapWordVal),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
             "Found badHeapWordValue in post-allocation check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
8296
b1c2163e4e59 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 7397
diff changeset
   248
void CollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr, size_t size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  if (CheckMemoryInitialization && ZapUnusedHeapArea) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    for (size_t slot = 0; slot < size; slot += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
      assert((*(intptr_t*) (addr + slot)) == ((intptr_t) badHeapWordVal),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
             "Found non badHeapWordValue in pre-allocation check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
void CollectedHeap::check_for_valid_allocation_state() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // How to choose between a pending exception and a potential
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // OutOfMemoryError?  Don't allow pending exceptions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // This is a VM policy failure, so how do we exhaustively test it?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  assert(!thread->has_pending_exception(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
         "shouldn't be allocating with pending exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  if (StrictSafepointChecks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    assert(thread->allow_allocation(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
           "Allocation done by thread for which allocation is blocked "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
           "by No_Allocation_Verifier!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    // Allocation of an oop can always invoke a safepoint,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    // hence, the true argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    thread->check_for_valid_safepoint_state(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   277
HeapWord* CollectedHeap::allocate_from_tlab_slow(KlassHandle klass, Thread* thread, size_t size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // Retain tlab and allocate object in shared space if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // the amount free in the tlab is too large to discard.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  if (thread->tlab().free() > thread->tlab().refill_waste_limit()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    thread->tlab().record_slow_allocation(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // Discard tlab and allocate a new one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // To minimize fragmentation, the last TLAB may be smaller than the rest.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  size_t new_tlab_size = thread->tlab().compute_size(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  thread->tlab().clear_before_allocation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  if (new_tlab_size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // Allocate a new TLAB...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  HeapWord* obj = Universe::heap()->allocate_new_tlab(new_tlab_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  if (obj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   301
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   302
  AllocTracer::send_allocation_in_new_tlab_event(klass, new_tlab_size * HeapWordSize, size * HeapWordSize);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   303
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  if (ZeroTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    // ..and clear it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    Copy::zero_to_words(obj, new_tlab_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  } else {
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   308
    // ...and zap just allocated object.
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   309
#ifdef ASSERT
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   310
    // Skip mangling the space corresponding to the object header to
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   311
    // ensure that the returned space is not considered parsable by
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   312
    // any concurrent GC thread.
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   313
    size_t hdr_size = oopDesc::header_size();
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   314
    Copy::fill_to_words(obj + hdr_size, new_tlab_size - hdr_size, badHeapWordVal);
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 8921
diff changeset
   315
#endif // ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  thread->tlab().fill(obj, obj + size, new_tlab_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   321
void CollectedHeap::flush_deferred_store_barrier(JavaThread* thread) {
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   322
  MemRegion deferred = thread->deferred_card_mark();
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   323
  if (!deferred.is_empty()) {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   324
    assert(_defer_initial_card_mark, "Otherwise should be empty");
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   325
    {
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   326
      // Verify that the storage points to a parsable object in heap
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   327
      DEBUG_ONLY(oop old_obj = oop(deferred.start());)
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   328
      assert(is_in(old_obj), "Not in allocated heap");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   329
      assert(!can_elide_initializing_store_barrier(old_obj),
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   330
             "Else should have been filtered in new_store_pre_barrier()");
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   331
      assert(old_obj->is_oop(true), "Not an oop");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   332
      assert(deferred.word_size() == (size_t)(old_obj->size()),
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   333
             "Mismatch: multiple objects?");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   334
    }
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   335
    BarrierSet* bs = barrier_set();
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   336
    assert(bs->has_write_region_opt(), "No write_region() on BarrierSet");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   337
    bs->write_region(deferred);
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   338
    // "Clear" the deferred_card_mark field
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   339
    thread->set_deferred_card_mark(MemRegion());
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   340
  }
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   341
  assert(thread->deferred_card_mark().is_empty(), "invariant");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   342
}
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   343
22552
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   344
size_t CollectedHeap::max_tlab_size() const {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   345
  // TLABs can't be bigger than we can fill with a int[Integer.MAX_VALUE].
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   346
  // This restriction could be removed by enabling filling with multiple arrays.
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   347
  // If we compute that the reasonable way as
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   348
  //    header_size + ((sizeof(jint) * max_jint) / HeapWordSize)
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   349
  // we'll overflow on the multiply, so we do the divide first.
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   350
  // We actually lose a little by dividing first,
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   351
  // but that just makes the TLAB  somewhat smaller than the biggest array,
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   352
  // which is fine, since we'll be able to fill that.
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   353
  size_t max_int_size = typeArrayOopDesc::header_size(T_INT) +
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   354
              sizeof(jint) *
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   355
              ((juint) max_jint / (size_t) HeapWordSize);
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   356
  return align_size_down(max_int_size, MinObjAlignment);
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   357
}
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 21561
diff changeset
   358
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   359
// Helper for ReduceInitialCardMarks. For performance,
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   360
// compiled code may elide card-marks for initializing stores
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   361
// to a newly allocated object along the fast-path. We
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   362
// compensate for such elided card-marks as follows:
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   363
// (a) Generational, non-concurrent collectors, such as
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   364
//     GenCollectedHeap(ParNew,DefNew,Tenured) and
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   365
//     ParallelScavengeHeap(ParallelGC, ParallelOldGC)
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   366
//     need the card-mark if and only if the region is
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   367
//     in the old gen, and do not care if the card-mark
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   368
//     succeeds or precedes the initializing stores themselves,
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   369
//     so long as the card-mark is completed before the next
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   370
//     scavenge. For all these cases, we can do a card mark
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   371
//     at the point at which we do a slow path allocation
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   372
//     in the old gen, i.e. in this call.
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   373
// (b) GenCollectedHeap(ConcurrentMarkSweepGeneration) requires
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   374
//     in addition that the card-mark for an old gen allocated
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   375
//     object strictly follow any associated initializing stores.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   376
//     In these cases, the memRegion remembered below is
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   377
//     used to card-mark the entire region either just before the next
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   378
//     slow-path allocation by this thread or just before the next scavenge or
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   379
//     CMS-associated safepoint, whichever of these events happens first.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   380
//     (The implicit assumption is that the object has been fully
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   381
//     initialized by this point, a fact that we assert when doing the
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   382
//     card-mark.)
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   383
// (c) G1CollectedHeap(G1) uses two kinds of write barriers. When a
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   384
//     G1 concurrent marking is in progress an SATB (pre-write-)barrier is
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   385
//     is used to remember the pre-value of any store. Initializing
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   386
//     stores will not need this barrier, so we need not worry about
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   387
//     compensating for the missing pre-barrier here. Turning now
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   388
//     to the post-barrier, we note that G1 needs a RS update barrier
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   389
//     which simply enqueues a (sequence of) dirty cards which may
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   390
//     optionally be refined by the concurrent update threads. Note
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   391
//     that this barrier need only be applied to a non-young write,
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   392
//     but, like in CMS, because of the presence of concurrent refinement
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   393
//     (much like CMS' precleaning), must strictly follow the oop-store.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   394
//     Thus, using the same protocol for maintaining the intended
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   395
//     invariants turns out, serendepitously, to be the same for both
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   396
//     G1 and CMS.
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   397
//
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   398
// For any future collector, this code should be reexamined with
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   399
// that specific collector in mind, and the documentation above suitably
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   400
// extended and updated.
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   401
oop CollectedHeap::new_store_pre_barrier(JavaThread* thread, oop new_obj) {
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   402
  // If a previous card-mark was deferred, flush it now.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   403
  flush_deferred_store_barrier(thread);
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   404
  if (can_elide_initializing_store_barrier(new_obj)) {
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   405
    // The deferred_card_mark region should be empty
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   406
    // following the flush above.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   407
    assert(thread->deferred_card_mark().is_empty(), "Error");
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   408
  } else {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   409
    MemRegion mr((HeapWord*)new_obj, new_obj->size());
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   410
    assert(!mr.is_empty(), "Error");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   411
    if (_defer_initial_card_mark) {
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   412
      // Defer the card mark
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   413
      thread->set_deferred_card_mark(mr);
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   414
    } else {
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   415
      // Do the card mark
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   416
      BarrierSet* bs = barrier_set();
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   417
      assert(bs->has_write_region_opt(), "No write_region() on BarrierSet");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   418
      bs->write_region(mr);
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   419
    }
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   420
  }
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   421
  return new_obj;
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   422
}
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 2154
diff changeset
   423
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   424
size_t CollectedHeap::filler_array_hdr_size() {
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5544
diff changeset
   425
  return size_t(align_object_offset(arrayOopDesc::header_size(T_INT))); // align to Long
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   426
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   427
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   428
size_t CollectedHeap::filler_array_min_size() {
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5544
diff changeset
   429
  return align_object_size(filler_array_hdr_size()); // align to MinObjAlignment
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   430
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   431
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   432
#ifdef ASSERT
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   433
void CollectedHeap::fill_args_check(HeapWord* start, size_t words)
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   434
{
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   435
  assert(words >= min_fill_size(), "too small to fill");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   436
  assert(words % MinObjAlignment == 0, "unaligned size");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   437
  assert(Universe::heap()->is_in_reserved(start), "not in heap");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   438
  assert(Universe::heap()->is_in_reserved(start + words - 1), "not in heap");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   439
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   440
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   441
void CollectedHeap::zap_filler_array(HeapWord* start, size_t words, bool zap)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   442
{
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   443
  if (ZapFillerObjects && zap) {
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   444
    Copy::fill_to_words(start + filler_array_hdr_size(),
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   445
                        words - filler_array_hdr_size(), 0XDEAFBABE);
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   446
  }
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   447
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   448
#endif // ASSERT
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   449
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   450
void
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   451
CollectedHeap::fill_with_array(HeapWord* start, size_t words, bool zap)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   452
{
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   453
  assert(words >= filler_array_min_size(), "too small for an array");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   454
  assert(words <= filler_array_max_size(), "too big for a single object");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   455
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   456
  const size_t payload_size = words - filler_array_hdr_size();
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   457
  const size_t len = payload_size * HeapWordSize / sizeof(jint);
12229
c34a85c8f5aa 7103665: HeapWord*ParallelScavengeHeap::failed_mem_allocate(unsigned long,bool)+0x97
brutisso
parents: 11788
diff changeset
   458
  assert((int)len >= 0, err_msg("size too large " SIZE_FORMAT " becomes %d", words, (int)len));
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   459
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   460
  // Set the length first for concurrent GC.
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   461
  ((arrayOop)start)->set_length((int)len);
12236
51d6463cfd9d 7156764: Remove unused size parameter from some CollectedHeap methods
brutisso
parents: 12229
diff changeset
   462
  post_allocation_setup_common(Universe::intArrayKlassObj(), start);
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   463
  DEBUG_ONLY(zap_filler_array(start, words, zap);)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   464
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   465
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   466
void
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   467
CollectedHeap::fill_with_object_impl(HeapWord* start, size_t words, bool zap)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   468
{
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   469
  assert(words <= filler_array_max_size(), "too big for a single object");
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   470
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   471
  if (words >= filler_array_min_size()) {
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   472
    fill_with_array(start, words, zap);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   473
  } else if (words > 0) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   474
    assert(words == min_fill_size(), "unaligned size");
12236
51d6463cfd9d 7156764: Remove unused size parameter from some CollectedHeap methods
brutisso
parents: 12229
diff changeset
   475
    post_allocation_setup_common(SystemDictionary::Object_klass(), start);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   476
  }
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   477
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   478
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   479
void CollectedHeap::fill_with_object(HeapWord* start, size_t words, bool zap)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   480
{
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   481
  DEBUG_ONLY(fill_args_check(start, words);)
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   482
  HandleMark hm;  // Free handles before leaving.
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   483
  fill_with_object_impl(start, words, zap);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   484
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   485
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   486
void CollectedHeap::fill_with_objects(HeapWord* start, size_t words, bool zap)
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   487
{
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   488
  DEBUG_ONLY(fill_args_check(start, words);)
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   489
  HandleMark hm;  // Free handles before leaving.
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   490
31603
4bd3b4863e10 8129573: CollectedHeap::fill_with_objects() needs to use multiple arrays in 32 bit mode too
tschatzl
parents: 30870
diff changeset
   491
  // Multiple objects may be required depending on the filler array maximum size. Fill
4bd3b4863e10 8129573: CollectedHeap::fill_with_objects() needs to use multiple arrays in 32 bit mode too
tschatzl
parents: 30870
diff changeset
   492
  // the range up to that with objects that are filler_array_max_size sized. The
4bd3b4863e10 8129573: CollectedHeap::fill_with_objects() needs to use multiple arrays in 32 bit mode too
tschatzl
parents: 30870
diff changeset
   493
  // remainder is filled with a single object.
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   494
  const size_t min = min_fill_size();
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   495
  const size_t max = filler_array_max_size();
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   496
  while (words > max) {
31603
4bd3b4863e10 8129573: CollectedHeap::fill_with_objects() needs to use multiple arrays in 32 bit mode too
tschatzl
parents: 30870
diff changeset
   497
    const size_t cur = (words - max) >= min ? max : max - min;
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   498
    fill_with_array(start, cur, zap);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   499
    start += cur;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   500
    words -= cur;
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   501
  }
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   502
4636
90e004691873 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 4571
diff changeset
   503
  fill_with_object_impl(start, words, zap);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   504
}
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1388
diff changeset
   505
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 20406
diff changeset
   506
void CollectedHeap::post_initialize() {
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 20406
diff changeset
   507
  collector_policy()->post_heap_initialize();
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 20406
diff changeset
   508
}
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 20406
diff changeset
   509
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
HeapWord* CollectedHeap::allocate_new_tlab(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  guarantee(false, "thread-local allocation buffers not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
void CollectedHeap::ensure_parsability(bool retire_tlabs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  // The second disjunct in the assertion below makes a concession
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // for the start-up verification done while the VM is being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  // created. Callers be careful that you know that mutators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // aren't going to interfere -- for instance, this is permissible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // if we are still single-threaded and have either not yet
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // started allocating (nothing much to verify) or we have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  // started allocating but are now a full-fledged JavaThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // (and have thus made our TLAB's) available for filling.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  assert(SafepointSynchronize::is_at_safepoint() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
         !is_init_completed(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
         "Should only be called at a safepoint or at start-up"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
         " otherwise concurrent mutator activity may make heap "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
         " unparsable again");
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   529
  const bool use_tlab = UseTLAB;
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   530
  const bool deferred = _defer_initial_card_mark;
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   531
  // The main thread starts allocating via a TLAB even before it
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   532
  // has added itself to the threads list at vm boot-up.
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   533
  assert(!use_tlab || Threads::first() != NULL,
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   534
         "Attempt to fill tlabs before main thread has been added"
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   535
         " to threads list is doomed to failure!");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   536
  for (JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   537
     if (use_tlab) thread->tlab().make_parsable(retire_tlabs);
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   538
#ifdef COMPILER2
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   539
     // The deferred store barriers must all have been flushed to the
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   540
     // card-table (or other remembered set structure) before GC starts
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   541
     // processing the card-table (or other remembered set).
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   542
     if (deferred) flush_deferred_store_barrier(thread);
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   543
#else
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   544
     assert(!deferred, "Should be false");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   545
     assert(thread->deferred_card_mark().is_empty(), "Should be empty");
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4636
diff changeset
   546
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
void CollectedHeap::accumulate_statistics_all_tlabs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  if (UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
    assert(SafepointSynchronize::is_at_safepoint() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
         !is_init_completed(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
         "should only accumulate statistics on tlabs at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    ThreadLocalAllocBuffer::accumulate_statistics_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
void CollectedHeap::resize_all_tlabs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  if (UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    assert(SafepointSynchronize::is_at_safepoint() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
         !is_init_completed(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
         "should only resize tlabs at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
    ThreadLocalAllocBuffer::resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
}
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   569
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   570
void CollectedHeap::pre_full_gc_dump(GCTimer* timer) {
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   571
  if (HeapDumpBeforeFullGC) {
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24424
diff changeset
   572
    GCTraceTime tt("Heap Dump (before full gc): ", PrintGCDetails, false, timer, GCId::create());
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   573
    // We are doing a "major" collection and a heap dump before
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   574
    // major collection has been requested.
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   575
    HeapDumper::dump_heap();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   576
  }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   577
  if (PrintClassHistogramBeforeFullGC) {
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24424
diff changeset
   578
    GCTraceTime tt("Class Histogram (before full gc): ", PrintGCDetails, true, timer, GCId::create());
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   579
    VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */);
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   580
    inspector.doit();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   581
  }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   582
}
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   583
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   584
void CollectedHeap::post_full_gc_dump(GCTimer* timer) {
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   585
  if (HeapDumpAfterFullGC) {
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24424
diff changeset
   586
    GCTraceTime tt("Heap Dump (after full gc): ", PrintGCDetails, false, timer, GCId::create());
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   587
    HeapDumper::dump_heap();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   588
  }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   589
  if (PrintClassHistogramAfterFullGC) {
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24424
diff changeset
   590
    GCTraceTime tt("Class Histogram (after full gc): ", PrintGCDetails, true, timer, GCId::create());
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
   591
    VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */);
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   592
    inspector.doit();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   593
  }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 1681
diff changeset
   594
}
10742
a64c942e4e6b 7098528: crash with java -XX:+ExtendedDTraceProbes
never
parents: 10565
diff changeset
   595
26829
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   596
void CollectedHeap::initialize_reserved_region(HeapWord *start, HeapWord *end) {
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   597
  // It is important to do this in a way such that concurrent readers can't
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   598
  // temporarily think something is in the heap.  (Seen this happen in asserts.)
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   599
  _reserved.set_word_size(0);
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   600
  _reserved.set_start(start);
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   601
  _reserved.set_end(end);
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   602
}
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 25350
diff changeset
   603
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   604
/////////////// Unit tests ///////////////
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   605
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   606
#ifndef PRODUCT
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   607
void CollectedHeap::test_is_in() {
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   608
  CollectedHeap* heap = Universe::heap();
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   609
11414
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   610
  uintptr_t epsilon    = (uintptr_t) MinObjAlignment;
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   611
  uintptr_t heap_start = (uintptr_t) heap->_reserved.start();
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   612
  uintptr_t heap_end   = (uintptr_t) heap->_reserved.end();
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   613
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   614
  // Test that NULL is not in the heap.
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   615
  assert(!heap->is_in(NULL), "NULL is unexpectedly in the heap");
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   616
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   617
  // Test that a pointer to before the heap start is reported as outside the heap.
11414
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   618
  assert(heap_start >= ((uintptr_t)NULL + epsilon), "sanity");
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   619
  void* before_heap = (void*)(heap_start - epsilon);
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   620
  assert(!heap->is_in(before_heap),
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23873
diff changeset
   621
      err_msg("before_heap: " PTR_FORMAT " is unexpectedly in the heap", p2i(before_heap)));
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   622
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   623
  // Test that a pointer to after the heap end is reported as outside the heap.
11414
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   624
  assert(heap_end <= ((uintptr_t)-1 - epsilon), "sanity");
5179aa58e6e9 7125503: Compiling collectedHeap.cpp fails with -Werror=int-to-pointer-cast with g++ 4.6.1
stefank
parents: 11247
diff changeset
   625
  void* after_heap = (void*)(heap_end + epsilon);
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   626
  assert(!heap->is_in(after_heap),
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23873
diff changeset
   627
      err_msg("after_heap: " PTR_FORMAT " is unexpectedly in the heap", p2i(after_heap)));
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   628
}
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10742
diff changeset
   629
#endif