hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
author johnc
Thu, 22 Sep 2011 10:57:37 -0700
changeset 10670 4ea0e7d2ffbc
parent 9623 151c0b638488
child 11174 fccee5238e70
permissions -rw-r--r--
6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
     2
 * Copyright (c) 2002, 2011, 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: 5343
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
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: 5343
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: 6762
diff changeset
    25
#include "precompiled.hpp"
8728
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
    26
#include "classfile/symbolTable.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    27
#include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    28
#include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    29
#include "gc_implementation/parallelScavenge/generationSizer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    30
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    31
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    32
#include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    33
#include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    34
#include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    35
#include "gc_implementation/parallelScavenge/psTasks.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    36
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    37
#include "gc_implementation/shared/spaceDecorator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    38
#include "gc_interface/gcCause.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    39
#include "memory/collectorPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    40
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    41
#include "memory/referencePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    42
#include "memory/referenceProcessor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    43
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    44
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    45
#include "oops/oop.psgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    46
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    47
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    48
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    49
#include "runtime/threadCritical.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    50
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    51
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    52
#include "services/memoryService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    53
#include "utilities/stack.inline.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
HeapWord*                  PSScavenge::_to_space_top_before_gc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
int                        PSScavenge::_consecutive_skipped_scavenges = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
ReferenceProcessor*        PSScavenge::_ref_processor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
CardTableExtension*        PSScavenge::_card_table = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
bool                       PSScavenge::_survivor_overflow = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
int                        PSScavenge::_tenuring_threshold = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
HeapWord*                  PSScavenge::_young_generation_boundary = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
elapsedTimer               PSScavenge::_accumulated_time;
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
    64
Stack<markOop>             PSScavenge::_preserved_mark_stack;
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
    65
Stack<oop>                 PSScavenge::_preserved_oop_stack;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
CollectorCounters*         PSScavenge::_counters = NULL;
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
    67
bool                       PSScavenge::_promotion_failed = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
// Define before use
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
class PSIsAliveClosure: public BoolObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  void do_object(oop p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    assert(false, "Do not call.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  bool do_object_b(oop p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    return (!PSScavenge::is_obj_in_young((HeapWord*) p)) || p->is_forwarded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
PSIsAliveClosure PSScavenge::_is_alive_closure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
class PSKeepAliveClosure: public OopClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  MutableSpace* _to_space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  PSPromotionManager* _promotion_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    _to_space = heap->young_gen()->to_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    assert(_promotion_manager != NULL, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    96
  template <class T> void do_oop_work(T* p) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    97
    assert (!oopDesc::is_null(*p), "expected non-null ref");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    98
    assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    99
            "expected an oop while scanning weak refs");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    // Weak refs may be visited more than once.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   102
    if (PSScavenge::should_scavenge(p, _to_space)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
      PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  }
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   106
  virtual void do_oop(oop* p)       { PSKeepAliveClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   107
  virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
class PSEvacuateFollowersClosure: public VoidClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  PSPromotionManager* _promotion_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   116
  virtual void do_void() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    assert(_promotion_manager != NULL, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    _promotion_manager->drain_stacks(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    guarantee(_promotion_manager->stacks_empty(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
              "stacks should be empty at this point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
class PSPromotionFailedClosure : public ObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  virtual void do_object(oop obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    if (obj->is_forwarded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
      obj->init_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
class PSRefProcTaskProxy: public GCTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  ProcessTask & _rp_task;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  uint          _work_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  PSRefProcTaskProxy(ProcessTask & rp_task, uint work_id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    : _rp_task(rp_task),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
      _work_id(work_id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  virtual char* name() { return (char *)"Process referents by policy in parallel"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  virtual void do_it(GCTaskManager* manager, uint which);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
void PSRefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  PSPromotionManager* promotion_manager =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    PSPromotionManager::gc_thread_promotion_manager(which);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  assert(promotion_manager != NULL, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  PSKeepAliveClosure keep_alive(promotion_manager);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  PSEvacuateFollowersClosure evac_followers(promotion_manager);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  PSIsAliveClosure is_alive;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  _rp_task.work(_work_id, is_alive, keep_alive, evac_followers);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
class PSRefEnqueueTaskProxy: public GCTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  EnqueueTask& _enq_task;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  uint         _work_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  PSRefEnqueueTaskProxy(EnqueueTask& enq_task, uint work_id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    : _enq_task(enq_task),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
      _work_id(work_id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  virtual char* name() { return (char *)"Enqueue reference objects in parallel"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  virtual void do_it(GCTaskManager* manager, uint which)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    _enq_task.work(_work_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
class PSRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  virtual void execute(ProcessTask& task);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  virtual void execute(EnqueueTask& task);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
void PSRefProcTaskExecutor::execute(ProcessTask& task)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  GCTaskQueue* q = GCTaskQueue::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  for(uint i=0; i<ParallelGCThreads; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    q->enqueue(new PSRefProcTaskProxy(task, i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  ParallelTaskTerminator terminator(
6248
2e661807cef0 6962589: remove breadth first scanning code from parallel gc
tonyp
parents: 5918
diff changeset
   188
                 ParallelScavengeHeap::gc_task_manager()->workers(),
2e661807cef0 6962589: remove breadth first scanning code from parallel gc
tonyp
parents: 5918
diff changeset
   189
                 (TaskQueueSetSuper*) PSPromotionManager::stack_array_depth());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  if (task.marks_oops_alive() && ParallelGCThreads > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    for (uint j=0; j<ParallelGCThreads; j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
      q->enqueue(new StealTask(&terminator));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  ParallelScavengeHeap::gc_task_manager()->execute_and_wait(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
void PSRefProcTaskExecutor::execute(EnqueueTask& task)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  GCTaskQueue* q = GCTaskQueue::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  for(uint i=0; i<ParallelGCThreads; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    q->enqueue(new PSRefEnqueueTaskProxy(task, i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  ParallelScavengeHeap::gc_task_manager()->execute_and_wait(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// This method contains all heap specific policy for invoking scavenge.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
// PSScavenge::invoke_no_policy() will do nothing but attempt to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
// scavenge. It will not clean up after failed promotions, bail out if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
// we've exceeded policy time limits, or any other special behavior.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
// All such policy should be placed here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
// Note that this method should only be called from the vm_thread while
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
// at a safepoint!
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   216
void PSScavenge::invoke() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  assert(!Universe::heap()->is_gc_active(), "not reentrant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  PSAdaptiveSizePolicy* policy = heap->size_policy();
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   225
  IsGCActiveMark mark;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   227
  bool scavenge_was_done = PSScavenge::invoke_no_policy();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   229
  PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   230
  if (UsePerfData)
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   231
    counters->update_full_follows_scavenge(0);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   232
  if (!scavenge_was_done ||
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   233
      policy->should_full_GC(heap->old_gen()->free_in_bytes())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    if (UsePerfData)
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   235
      counters->update_full_follows_scavenge(full_follows_scavenge);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   236
    GCCauseSetter gccs(heap, GCCause::_adaptive_size_policy);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   237
    CollectorPolicy* cp = heap->collector_policy();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   238
    const bool clear_all_softrefs = cp->should_clear_all_soft_refs();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   240
    if (UseParallelOldGC) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   241
      PSParallelCompact::invoke_no_policy(clear_all_softrefs);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   242
    } else {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   243
      PSMarkSweep::invoke_no_policy(clear_all_softrefs);
1
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
// This method contains no policy. You should probably
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
// be calling invoke() instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
bool PSScavenge::invoke_no_policy() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   254
  assert(_preserved_mark_stack.is_empty(), "should be empty");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   255
  assert(_preserved_oop_stack.is_empty(), "should be empty");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   256
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  TimeStamp scavenge_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  TimeStamp scavenge_midpoint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  TimeStamp scavenge_exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  scavenge_entry.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  if (GC_locker::check_active_before_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  GCCause::Cause gc_cause = heap->gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Check for potential problems.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  if (!should_attempt_scavenge()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  bool promotion_failure_occurred = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  PSPermGen* perm_gen = heap->perm_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  PSAdaptiveSizePolicy* size_policy = heap->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  heap->increment_total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  if ((gc_cause != GCCause::_java_lang_system_gc) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
       UseAdaptiveSizePolicyWithSystemGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    // Gather the feedback data for eden occupancy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    young_gen->eden_space()->accumulate_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   292
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   293
    // Save information needed to minimize mangling
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   294
    heap->record_gen_tops_before_GC();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   295
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   296
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    Universe::print_heap_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  assert(!NeverTenure || _tenuring_threshold == markOopDesc::max_age + 1, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  assert(!AlwaysTenure || _tenuring_threshold == 0, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  size_t prev_used = heap->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  assert(promotion_failed() == false, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Fill in TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  heap->accumulate_statistics_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  heap->ensure_parsability(true);  // retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    gclog_or_tty->print(" VerifyBeforeGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    Universe::verify(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    TraceTime t1("GC", PrintGC, !PrintGCDetails, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    TraceCollectorStats tcs(counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 8728
diff changeset
   325
    TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    if (TraceGen0Time) accumulated_time()->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    // Let the size policy know we're starting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    size_policy->minor_collection_begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    // Verify the object start arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
        VerifyBeforeGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      old_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
      perm_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    // Verify no unmarked old->young roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    if (VerifyRememberedSets) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
      CardTableExtension::verify_all_young_refs_imprecise();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    if (!ScavengeWithObjectsInToSpace) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
      assert(young_gen->to_space()->is_empty(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
             "Attempt to scavenge with live objects in to_space");
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   347
      young_gen->to_space()->clear(SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    } else if (ZapUnusedHeapArea) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      young_gen->to_space()->mangle_unused_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    save_to_space_top_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    COMPILER2_PRESENT(DerivedPointerTable::clear());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 9623
diff changeset
   355
    reference_processor()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   356
    reference_processor()->setup_policy(false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    // We track how much was promoted to the next generation for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    // the AdaptiveSizePolicy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    size_t old_gen_used_before = old_gen->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    // For PrintGCDetails
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    size_t young_gen_used_before = young_gen->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
    // Reset our survivor overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    set_survivor_overflow(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    // We need to save the old/perm top values before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    // creating the promotion_manager. We pass the top
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    // values to the card_table, to prevent it from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    // straying into the promotion labs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    HeapWord* old_top = old_gen->object_space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    HeapWord* perm_top = perm_gen->object_space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    // Release all previously held resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    gc_task_manager()->release_all_resources();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    PSPromotionManager::pre_scavenge();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    // We'll use the promotion manager again later.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
      // TraceTime("Roots");
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2105
diff changeset
   384
      ParallelScavengeHeap::ParStrongRootsScope psrs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
      GCTaskQueue* q = GCTaskQueue::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
      for(uint i=0; i<ParallelGCThreads; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
        q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      q->enqueue(new SerialOldToYoungRootsTask(perm_gen, perm_top));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::universe));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jni_handles));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
      // We scan the thread roots in parallel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
      Threads::create_thread_roots_tasks(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::object_synchronizer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2105
diff changeset
   403
      q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
      ParallelTaskTerminator terminator(
6248
2e661807cef0 6962589: remove breadth first scanning code from parallel gc
tonyp
parents: 5918
diff changeset
   406
                  gc_task_manager()->workers(),
2e661807cef0 6962589: remove breadth first scanning code from parallel gc
tonyp
parents: 5918
diff changeset
   407
                  (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
      if (ParallelGCThreads>1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
        for (uint j=0; j<ParallelGCThreads; j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
          q->enqueue(new StealTask(&terminator));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      gc_task_manager()->execute_and_wait(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    scavenge_midpoint.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    // Process reference objects discovered during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
    {
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   421
      reference_processor()->setup_policy(false); // not always_clear
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
      PSKeepAliveClosure keep_alive(promotion_manager);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
      PSEvacuateFollowersClosure evac_followers(promotion_manager);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
      if (reference_processor()->processing_is_mt()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
        PSRefProcTaskExecutor task_executor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
        reference_processor()->process_discovered_references(
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 977
diff changeset
   427
          &_is_alive_closure, &keep_alive, &evac_followers, &task_executor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
        reference_processor()->process_discovered_references(
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 977
diff changeset
   430
          &_is_alive_closure, &keep_alive, &evac_followers, NULL);
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    // Enqueue reference objects discovered during scavenge.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    if (reference_processor()->processing_is_mt()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
      PSRefProcTaskExecutor task_executor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
      reference_processor()->enqueue_discovered_references(&task_executor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
      reference_processor()->enqueue_discovered_references(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
8728
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   442
    if (!JavaObjectsInPerm) {
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   443
      // Unlink any dead interned Strings
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   444
      StringTable::unlink(&_is_alive_closure);
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   445
      // Process the remaining live ones
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   446
      PSScavengeRootsClosure root_closure(promotion_manager);
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   447
      StringTable::oops_do(&root_closure);
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   448
    }
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 8688
diff changeset
   449
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    // Finally, flush the promotion_manager's labs, and deallocate its stacks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    PSPromotionManager::post_scavenge();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    promotion_failure_occurred = promotion_failed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    if (promotion_failure_occurred) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      clean_up_failed_promotion();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
      if (PrintGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
        gclog_or_tty->print("--");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    // Let the size policy know we're done.  Note that we count promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    // failure cleanup time as part of the collection (otherwise, we're
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    // implicitly saying it's mutator time).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    size_policy->minor_collection_end(gc_cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    if (!promotion_failure_occurred) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      // Swap the survivor spaces.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   468
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   469
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   470
      young_gen->eden_space()->clear(SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   471
      young_gen->from_space()->clear(SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
      young_gen->swap_spaces();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
      size_t survived = young_gen->from_space()->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
      size_t promoted = old_gen->used_in_bytes() - old_gen_used_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
      size_policy->update_averages(_survivor_overflow, survived, promoted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   478
      // A successful scavenge should restart the GC time limit count which is
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   479
      // for full GC's.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   480
      size_policy->reset_gc_overhead_limit_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
      if (UseAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
        // Calculate the new survivor size and tenuring threshold
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
        if (PrintAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
          gclog_or_tty->print("AdaptiveSizeStart: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
          gclog_or_tty->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
          gclog_or_tty->print_cr(" collection: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
                         heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
          if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
            gclog_or_tty->print("old_gen_capacity: %d young_gen_capacity: %d"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
              " perm_gen_capacity: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
              old_gen->capacity_in_bytes(), young_gen->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
              perm_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
        if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
          PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
          counters->update_old_eden_size(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
            size_policy->calculated_eden_size_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
          counters->update_old_promo_size(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
            size_policy->calculated_promo_size_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
          counters->update_old_capacity(old_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
          counters->update_young_capacity(young_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
          counters->update_survived(survived);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
          counters->update_promoted(promoted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
          counters->update_survivor_overflowed(_survivor_overflow);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
        size_t survivor_limit =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
          size_policy->max_survivor_size(young_gen->max_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
        _tenuring_threshold =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
          size_policy->compute_survivor_space_size_and_threshold(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
                                                           _survivor_overflow,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
                                                           _tenuring_threshold,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
                                                           survivor_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
       if (PrintTenuringDistribution) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
         gclog_or_tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
         gclog_or_tty->print_cr("Desired survivor size %ld bytes, new threshold %d (max %d)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
                                size_policy->calculated_survivor_size_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
                                _tenuring_threshold, MaxTenuringThreshold);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
        if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
          PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
          counters->update_tenuring_threshold(_tenuring_threshold);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
          counters->update_survivor_size_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
        // Do call at minor collections?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
        // Don't check if the size_policy is ready at this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
        // level.  Let the size_policy check that internally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
        if (UseAdaptiveSizePolicy &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
            UseAdaptiveGenerationSizePolicyAtMinorCollection &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
            ((gc_cause != GCCause::_java_lang_system_gc) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
              UseAdaptiveSizePolicyWithSystemGC)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
          // Calculate optimial free space amounts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
          assert(young_gen->max_size() >
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
            young_gen->from_space()->capacity_in_bytes() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
            young_gen->to_space()->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
            "Sizes of space in young gen are out-of-bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
          size_t max_eden_size = young_gen->max_size() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
            young_gen->from_space()->capacity_in_bytes() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
            young_gen->to_space()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
          size_policy->compute_generation_free_space(young_gen->used_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
                                   young_gen->eden_space()->used_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
                                   old_gen->used_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
                                   perm_gen->used_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
                                   young_gen->eden_space()->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
                                   old_gen->max_gen_size(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
                                   max_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
                                   false  /* full gc*/,
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   557
                                   gc_cause,
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 3908
diff changeset
   558
                                   heap->collector_policy());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
        // Resize the young generation at every collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
        // even if new sizes have not been calculated.  This is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
        // to allow resizes that may have been inhibited by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
        // relative location of the "to" and "from" spaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
        // Resizing the old gen at minor collects can cause increases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
        // that don't feed back to the generation sizing policy until
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
        // a major collection.  Don't resize the old gen here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
        heap->resize_young_gen(size_policy->calculated_eden_size_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
                        size_policy->calculated_survivor_size_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
        if (PrintAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
          gclog_or_tty->print_cr("AdaptiveSizeStop: collection: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
                         heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
      // Update the structure of the eden. With NUMA-eden CPU hotplugging or offlining can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
      // cause the change of the heap layout. Make sure eden is reshaped if that's the case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
      // Also update() will case adaptive NUMA chunk resizing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
      assert(young_gen->eden_space()->is_empty(), "eden space should be empty now");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
      young_gen->eden_space()->update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
      heap->gc_policy_counters()->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
      heap->resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
      assert(young_gen->to_space()->is_empty(), "to space should be empty now");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    // Re-verify object start arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
        VerifyAfterGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
      old_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
      perm_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
    // Verify all old -> young cards are now precise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
    if (VerifyRememberedSets) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
      // Precise verification will give false positives. Until this is fixed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
      // use imprecise verification.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
      // CardTableExtension::verify_all_young_refs_precise();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
      CardTableExtension::verify_all_young_refs_imprecise();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
    if (TraceGen0Time) accumulated_time()->stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    if (PrintGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
      if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
        // Don't print a GC timestamp here.  This is after the GC so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
        // would be confusing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
        young_gen->print_used_change(young_gen_used_before);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
      heap->print_heap_change(prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    // Track memory usage and detect low memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    MemoryService::track_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    heap->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    gclog_or_tty->print(" VerifyAfterGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    Universe::verify(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    Universe::print_heap_after_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   637
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   638
    young_gen->eden_space()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   639
    young_gen->from_space()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   640
    young_gen->to_space()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   641
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   642
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  scavenge_exit.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  if (PrintGCTaskTimeStamps) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    tty->print_cr("VM-Thread " INT64_FORMAT " " INT64_FORMAT " " INT64_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
                  scavenge_entry.ticks(), scavenge_midpoint.ticks(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
                  scavenge_exit.ticks());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    gc_task_manager()->print_task_time_stamps();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1610
diff changeset
   652
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1610
diff changeset
   653
  ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1610
diff changeset
   654
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1610
diff changeset
   655
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  return !promotion_failure_occurred;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
// This method iterates over all objects in the young generation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
// unforwarding markOops. It then restores any preserved mark oops,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
// and clears the _preserved_mark_stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
void PSScavenge::clean_up_failed_promotion() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  assert(promotion_failed(), "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
    // Unforward all pointers in the young gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
    PSPromotionFailedClosure unforward_closure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    young_gen->object_iterate(&unforward_closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    if (PrintGC && Verbose) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   677
      gclog_or_tty->print_cr("Restoring %d marks", _preserved_oop_stack.size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    // Restore any saved marks.
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   681
    while (!_preserved_oop_stack.is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   682
      oop obj      = _preserved_oop_stack.pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   683
      markOop mark = _preserved_mark_stack.pop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
      obj->set_mark(mark);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   687
    // Clear the preserved mark and oop stack caches.
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   688
    _preserved_mark_stack.clear(true);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   689
    _preserved_oop_stack.clear(true);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   690
    _promotion_failed = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  // Reset the PromotionFailureALot counters.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
// This method is called whenever an attempt to promote an object
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   698
// fails. Some markOops will need preservation, some will not. Note
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
// that the entire eden is traversed after a failed promotion, with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
// all forwarded headers replaced by the default markOop. This means
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
// it is not neccessary to preserve most markOops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
void PSScavenge::oop_promotion_failed(oop obj, markOop obj_mark) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   703
  _promotion_failed = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  if (obj_mark->must_be_preserved_for_promotion_failure(obj)) {
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7397
diff changeset
   705
    // Should use per-worker private stakcs hetre rather than
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7397
diff changeset
   706
    // locking a common pair of stacks.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    ThreadCritical tc;
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   708
    _preserved_oop_stack.push(obj);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6248
diff changeset
   709
    _preserved_mark_stack.push(obj_mark);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
bool PSScavenge::should_attempt_scavenge() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    counters->update_scavenge_skipped(not_skipped);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  if (!ScavengeWithObjectsInToSpace) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
    // Do not attempt to promote unless to_space is empty
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    if (!young_gen->to_space()->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
      _consecutive_skipped_scavenges++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
      if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
        counters->update_scavenge_skipped(to_space_not_empty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  // Test to see if the scavenge will likely fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  PSAdaptiveSizePolicy* policy = heap->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  // A similar test is done in the policy's should_full_GC().  If this is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  // changed, decide if that test should also be changed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  size_t avg_promoted = (size_t) policy->padded_average_promoted_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  size_t promotion_estimate = MIN2(avg_promoted, young_gen->used_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  bool result = promotion_estimate < old_gen->free_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  if (PrintGCDetails && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
    gclog_or_tty->print(result ? "  do scavenge: " : "  skip scavenge: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
    gclog_or_tty->print_cr(" average_promoted " SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
      " padded_average_promoted " SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
      " free in old gen " SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
      (size_t) policy->average_promoted_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
      (size_t) policy->padded_average_promoted_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
      old_gen->free_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
    if (young_gen->used_in_bytes() <
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
        (size_t) policy->padded_average_promoted_in_bytes()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
      gclog_or_tty->print_cr(" padded_promoted_average is greater"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
        " than maximum promotion = " SIZE_FORMAT, young_gen->used_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  if (result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
    _consecutive_skipped_scavenges = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
    _consecutive_skipped_scavenges++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
    if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
      counters->update_scavenge_skipped(promoted_too_large);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  // Used to add tasks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
GCTaskManager* const PSScavenge::gc_task_manager() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  assert(ParallelScavengeHeap::gc_task_manager() != NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
   "shouldn't return NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  return ParallelScavengeHeap::gc_task_manager();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
void PSScavenge::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  // Arguments must have been parsed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  if (AlwaysTenure) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
    _tenuring_threshold = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  } else if (NeverTenure) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    _tenuring_threshold = markOopDesc::max_age + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    // We want to smooth out our startup times for the AdaptiveSizePolicy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    _tenuring_threshold = (UseAdaptiveSizePolicy) ? InitialTenuringThreshold :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
                                                    MaxTenuringThreshold;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  PSPermGen* perm_gen = heap->perm_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  // Set boundary between young_gen and old_gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  assert(perm_gen->reserved().end() <= old_gen->object_space()->bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
         "perm above old");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  assert(old_gen->reserved().end() <= young_gen->eden_space()->bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
         "old above young");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  _young_generation_boundary = young_gen->eden_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  // Initialize ref handling object for scavenging.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  MemRegion mr = young_gen->reserved();
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   807
  _ref_processor =
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   808
    new ReferenceProcessor(mr,                         // span
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   809
                           ParallelRefProcEnabled && (ParallelGCThreads > 1), // mt processing
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   810
                           (int) ParallelGCThreads,    // mt processing degree
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   811
                           true,                       // mt discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   812
                           (int) ParallelGCThreads,    // mt discovery degree
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   813
                           true,                       // atomic_discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   814
                           NULL,                       // header provides liveness info
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7658
diff changeset
   815
                           false);                     // next field updates do not need write barrier
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // Cache the cardtable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  BarrierSet* bs = Universe::heap()->barrier_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  _card_table = (CardTableExtension*)bs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  _counters = new CollectorCounters("PSScavenge", 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
}