hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
author johnc
Thu, 22 Sep 2011 10:57:37 -0700
changeset 10670 4ea0e7d2ffbc
parent 10524 6594ca81279a
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: 8076
diff changeset
     2
 * Copyright (c) 2005, 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: 5402
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5402
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: 5402
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    26
#include "classfile/symbolTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    27
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    28
#include "code/codeCache.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    29
#include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    30
#include "gc_implementation/parallelScavenge/generationSizer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    31
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    32
#include "gc_implementation/parallelScavenge/pcTasks.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    33
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    34
#include "gc_implementation/parallelScavenge/psCompactionManager.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    35
#include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    36
#include "gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    37
#include "gc_implementation/parallelScavenge/psOldGen.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    38
#include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    39
#include "gc_implementation/parallelScavenge/psPermGen.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    40
#include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    41
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    42
#include "gc_implementation/parallelScavenge/psYoungGen.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    43
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    44
#include "gc_interface/gcCause.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    45
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    46
#include "memory/referencePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    47
#include "memory/referenceProcessor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    48
#include "oops/methodDataOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    49
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    50
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    51
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    52
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    53
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    54
#include "services/management.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    55
#include "services/memoryService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    56
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    57
#include "utilities/stack.inline.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
#include <math.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// All sizes are in HeapWords.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    62
const size_t ParallelCompactData::Log2RegionSize  = 9; // 512 words
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    63
const size_t ParallelCompactData::RegionSize      = (size_t)1 << Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    64
const size_t ParallelCompactData::RegionSizeBytes =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    65
  RegionSize << LogHeapWordSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    66
const size_t ParallelCompactData::RegionSizeOffsetMask = RegionSize - 1;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    67
const size_t ParallelCompactData::RegionAddrOffsetMask = RegionSizeBytes - 1;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    68
const size_t ParallelCompactData::RegionAddrMask  = ~RegionAddrOffsetMask;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    70
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    71
ParallelCompactData::RegionData::dc_shift = 27;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    72
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    73
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    74
ParallelCompactData::RegionData::dc_mask = ~0U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    75
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    76
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    77
ParallelCompactData::RegionData::dc_one = 0x1U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    78
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    79
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    80
ParallelCompactData::RegionData::los_mask = ~dc_mask;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    81
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    82
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    83
ParallelCompactData::RegionData::dc_claimed = 0x8U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    84
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    85
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    86
ParallelCompactData::RegionData::dc_completed = 0xcU << dc_shift;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
SpaceInfo PSParallelCompact::_space_info[PSParallelCompact::last_space_id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
bool      PSParallelCompact::_print_phases = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
ReferenceProcessor* PSParallelCompact::_ref_processor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
klassOop            PSParallelCompact::_updated_int_array_klass_obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
double PSParallelCompact::_dwl_mean;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
double PSParallelCompact::_dwl_std_dev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
double PSParallelCompact::_dwl_first_term;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
double PSParallelCompact::_dwl_adjustment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
bool   PSParallelCompact::_dwl_initialized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
#ifdef VALIDATE_MARK_SWEEP
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   103
GrowableArray<void*>*   PSParallelCompact::_root_refs_stack = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
GrowableArray<oop> *    PSParallelCompact::_live_oops = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
GrowableArray<oop> *    PSParallelCompact::_live_oops_moved_to = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
GrowableArray<size_t>*  PSParallelCompact::_live_oops_size = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
size_t                  PSParallelCompact::_live_oops_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
size_t                  PSParallelCompact::_live_oops_index_at_perm = 0;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   109
GrowableArray<void*>*   PSParallelCompact::_other_refs_stack = NULL;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   110
GrowableArray<void*>*   PSParallelCompact::_adjusted_pointers = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
bool                    PSParallelCompact::_pointer_tracking = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
bool                    PSParallelCompact::_root_tracking = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops_moved_to = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
GrowableArray<size_t>   * PSParallelCompact::_cur_gc_live_oops_size = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops_moved_to = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
GrowableArray<size_t>   * PSParallelCompact::_last_gc_live_oops_size = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   122
void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   123
                       HeapWord* destination)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   124
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   125
  assert(src_region_idx != 0, "invalid src_region_idx");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   126
  assert(partial_obj_size != 0, "invalid partial_obj_size argument");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   127
  assert(destination != NULL, "invalid destination argument");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   128
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   129
  _src_region_idx = src_region_idx;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   130
  _partial_obj_size = partial_obj_size;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   131
  _destination = destination;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   132
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   133
  // These fields may not be updated below, so make sure they're clear.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   134
  assert(_dest_region_addr == NULL, "should have been cleared");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   135
  assert(_first_src_addr == NULL, "should have been cleared");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   136
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   137
  // Determine the number of destination regions for the partial object.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   138
  HeapWord* const last_word = destination + partial_obj_size - 1;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   139
  const ParallelCompactData& sd = PSParallelCompact::summary_data();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   140
  HeapWord* const beg_region_addr = sd.region_align_down(destination);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   141
  HeapWord* const end_region_addr = sd.region_align_down(last_word);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   142
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   143
  if (beg_region_addr == end_region_addr) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   144
    // One destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   145
    _destination_count = 1;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   146
    if (end_region_addr == destination) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   147
      // The destination falls on a region boundary, thus the first word of the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   148
      // partial object will be the first word copied to the destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   149
      _dest_region_addr = end_region_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   150
      _first_src_addr = sd.region_to_addr(src_region_idx);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   151
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   152
  } else {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   153
    // Two destination regions.  When copied, the partial object will cross a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   154
    // destination region boundary, so a word somewhere within the partial
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   155
    // object will be the first word copied to the second destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   156
    _destination_count = 2;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   157
    _dest_region_addr = end_region_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   158
    const size_t ofs = pointer_delta(end_region_addr, destination);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   159
    assert(ofs < _partial_obj_size, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   160
    _first_src_addr = sd.region_to_addr(src_region_idx) + ofs;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   161
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   162
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   163
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   164
void SplitInfo::clear()
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   165
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   166
  _src_region_idx = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   167
  _partial_obj_size = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   168
  _destination = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   169
  _destination_count = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   170
  _dest_region_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   171
  _first_src_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   172
  assert(!is_valid(), "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   173
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   174
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   175
#ifdef  ASSERT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   176
void SplitInfo::verify_clear()
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   177
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   178
  assert(_src_region_idx == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   179
  assert(_partial_obj_size == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   180
  assert(_destination == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   181
  assert(_destination_count == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   182
  assert(_dest_region_addr == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   183
  assert(_first_src_addr == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   184
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   185
#endif  // #ifdef ASSERT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   186
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   187
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
const char* PSParallelCompact::space_names[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  "perm", "old ", "eden", "from", "to  "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   193
void PSParallelCompact::print_region_ranges()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  tty->print_cr("space  bottom     top        end        new_top");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  tty->print_cr("------ ---------- ---------- ---------- ----------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  for (unsigned int id = 0; id < last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    const MutableSpace* space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    tty->print_cr("%u %s "
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   201
                  SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " "
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   202
                  SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " ",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
                  id, space_names[id],
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   204
                  summary_data().addr_to_region_idx(space->bottom()),
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   205
                  summary_data().addr_to_region_idx(space->top()),
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   206
                  summary_data().addr_to_region_idx(space->end()),
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   207
                  summary_data().addr_to_region_idx(_space_info[id].new_top()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
void
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   212
print_generic_summary_region(size_t i, const ParallelCompactData::RegionData* c)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   214
#define REGION_IDX_FORMAT        SIZE_FORMAT_W(7)
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   215
#define REGION_DATA_FORMAT       SIZE_FORMAT_W(5)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  ParallelCompactData& sd = PSParallelCompact::summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   218
  size_t dci = c->destination() ? sd.addr_to_region_idx(c->destination()) : 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   219
  tty->print_cr(REGION_IDX_FORMAT " " PTR_FORMAT " "
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   220
                REGION_IDX_FORMAT " " PTR_FORMAT " "
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   221
                REGION_DATA_FORMAT " " REGION_DATA_FORMAT " "
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   222
                REGION_DATA_FORMAT " " REGION_IDX_FORMAT " %d",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
                i, c->data_location(), dci, c->destination(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
                c->partial_obj_size(), c->live_obj_size(),
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   225
                c->data_size(), c->source_region(), c->destination_count());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   226
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   227
#undef  REGION_IDX_FORMAT
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   228
#undef  REGION_DATA_FORMAT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
print_generic_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
                           HeapWord* const beg_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
                           HeapWord* const end_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  size_t total_words = 0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   237
  size_t i = summary_data.addr_to_region_idx(beg_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   238
  const size_t last = summary_data.addr_to_region_idx(end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  HeapWord* pdest = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  while (i <= last) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   242
    ParallelCompactData::RegionData* c = summary_data.region(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    if (c->data_size() != 0 || c->destination() != pdest) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   244
      print_generic_summary_region(i, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
      total_words += c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
      pdest = c->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    ++i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  tty->print_cr("summary_data_bytes=" SIZE_FORMAT, total_words * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
print_generic_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
                           SpaceInfo* space_info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  for (unsigned int id = 0; id < PSParallelCompact::last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    const MutableSpace* space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    print_generic_summary_data(summary_data, space->bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
                               MAX2(space->top(), space_info[id].new_top()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
void
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   266
print_initial_summary_region(size_t i,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   267
                             const ParallelCompactData::RegionData* c,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   268
                             bool newline = true)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
{
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   270
  tty->print(SIZE_FORMAT_W(5) " " PTR_FORMAT " "
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   271
             SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " "
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   272
             SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
             i, c->destination(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
             c->partial_obj_size(), c->live_obj_size(),
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   275
             c->data_size(), c->source_region(), c->destination_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  if (newline) tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
print_initial_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
                           const MutableSpace* space) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  if (space->top() == space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   286
  const size_t region_size = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   287
  typedef ParallelCompactData::RegionData RegionData;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   288
  HeapWord* const top_aligned_up = summary_data.region_align_up(space->top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   289
  const size_t end_region = summary_data.addr_to_region_idx(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   290
  const RegionData* c = summary_data.region(end_region - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  HeapWord* end_addr = c->destination() + c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  const size_t live_in_space = pointer_delta(end_addr, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   294
  // Print (and count) the full regions at the beginning of the space.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   295
  size_t full_region_count = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   296
  size_t i = summary_data.addr_to_region_idx(space->bottom());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   297
  while (i < end_region && summary_data.region(i)->data_size() == region_size) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   298
    print_initial_summary_region(i, summary_data.region(i));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   299
    ++full_region_count;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    ++i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   303
  size_t live_to_right = live_in_space - full_region_count * region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  double max_reclaimed_ratio = 0.0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   306
  size_t max_reclaimed_ratio_region = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  size_t max_dead_to_right = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  size_t max_live_to_right = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   310
  // Print the 'reclaimed ratio' for regions while there is something live in
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   311
  // the region or to the right of it.  The remaining regions are empty (and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // uninteresting), and computing the ratio will result in division by 0.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   313
  while (i < end_region && live_to_right > 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   314
    c = summary_data.region(i);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   315
    HeapWord* const region_addr = summary_data.region_to_addr(i);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   316
    const size_t used_to_right = pointer_delta(space->top(), region_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
    const size_t dead_to_right = used_to_right - live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    const double reclaimed_ratio = double(dead_to_right) / live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    if (reclaimed_ratio > max_reclaimed_ratio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
            max_reclaimed_ratio = reclaimed_ratio;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   322
            max_reclaimed_ratio_region = i;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
            max_dead_to_right = dead_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
            max_live_to_right = live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   327
    print_initial_summary_region(i, c, false);
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   328
    tty->print_cr(" %12.10f " SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
                  reclaimed_ratio, dead_to_right, live_to_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    live_to_right -= c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    ++i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   335
  // Any remaining regions are empty.  Print one more if there is one.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   336
  if (i < end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   337
    print_initial_summary_region(i, summary_data.region(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   340
  tty->print_cr("max:  " SIZE_FORMAT_W(4) " d2r=" SIZE_FORMAT_W(10) " "
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
   341
                "l2r=" SIZE_FORMAT_W(10) " max_ratio=%14.12f",
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   342
                max_reclaimed_ratio_region, max_dead_to_right,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
                max_live_to_right, max_reclaimed_ratio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
print_initial_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
                           SpaceInfo* space_info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  unsigned int id = PSParallelCompact::perm_space_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  const MutableSpace* space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    print_initial_summary_data(summary_data, space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  } while (++id < PSParallelCompact::eden_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    print_generic_summary_data(summary_data, space->bottom(), space->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  } while (++id < PSParallelCompact::last_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
size_t add_obj_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
size_t add_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
size_t mark_bitmap_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
size_t mark_bitmap_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
ParallelCompactData::ParallelCompactData()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  _region_start = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   374
  _region_vspace = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   375
  _region_data = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   376
  _region_count = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
bool ParallelCompactData::initialize(MemRegion covered_region)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  _region_start = covered_region.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  const size_t region_size = covered_region.word_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  DEBUG_ONLY(_region_end = _region_start + region_size;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   385
  assert(region_align_down(_region_start) == _region_start,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
         "region start not aligned");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   387
  assert((region_size & RegionSizeOffsetMask) == 0,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   388
         "region size not a multiple of RegionSize");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   389
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   390
  bool result = initialize_region_data(region_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
PSVirtualSpace*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
ParallelCompactData::create_vspace(size_t count, size_t element_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  const size_t raw_bytes = count * element_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  const size_t granularity = os::vm_allocation_granularity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  const size_t bytes = align_size_up(raw_bytes, MAX2(page_sz, granularity));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    MAX2(page_sz, granularity);
252
050143a0dbfb 6642862: Code cache allocation fails with large pages after 6588638
jcoomes
parents: 1
diff changeset
   405
  ReservedSpace rs(bytes, rs_align, rs_align > 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
                       rs.size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  if (vspace != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    if (vspace->expand_by(bytes)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
      return vspace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    delete vspace;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 781
diff changeset
   414
    // Release memory reserved in the space.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 781
diff changeset
   415
    rs.release();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   421
bool ParallelCompactData::initialize_region_data(size_t region_size)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   423
  const size_t count = (region_size + RegionSizeOffsetMask) >> Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   424
  _region_vspace = create_vspace(count, sizeof(RegionData));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   425
  if (_region_vspace != 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   426
    _region_data = (RegionData*)_region_vspace->reserved_low_addr();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   427
    _region_count = count;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
void ParallelCompactData::clear()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   435
  memset(_region_data, 0, _region_vspace->committed_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   438
void ParallelCompactData::clear_range(size_t beg_region, size_t end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   439
  assert(beg_region <= _region_count, "beg_region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   440
  assert(end_region <= _region_count, "end_region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   441
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   442
  const size_t region_cnt = end_region - beg_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   443
  memset(_region_data + beg_region, 0, region_cnt * sizeof(RegionData));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   446
HeapWord* ParallelCompactData::partial_obj_end(size_t region_idx) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   448
  const RegionData* cur_cp = region(region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   449
  const RegionData* const end_cp = region(region_count() - 1);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   450
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   451
  HeapWord* result = region_to_addr(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  if (cur_cp < end_cp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
      result += cur_cp->partial_obj_size();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   455
    } while (cur_cp->partial_obj_size() == RegionSize && ++cur_cp < end_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  const size_t obj_ofs = pointer_delta(addr, _region_start);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   463
  const size_t beg_region = obj_ofs >> Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   464
  const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  DEBUG_ONLY(Atomic::inc_ptr(&add_obj_count);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  DEBUG_ONLY(Atomic::add_ptr(len, &add_obj_size);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   469
  if (beg_region == end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   470
    // All in one region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   471
    _region_data[beg_region].add_live_obj(len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   475
  // First region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   476
  const size_t beg_ofs = region_offset(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   477
  _region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  klassOop klass = ((oop)addr)->klass();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   480
  // Middle regions--completely spanned by this object.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   481
  for (size_t region = beg_region + 1; region < end_region; ++region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   482
    _region_data[region].set_partial_obj_size(RegionSize);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   483
    _region_data[region].set_partial_obj_addr(addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   486
  // Last region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   487
  const size_t end_ofs = region_offset(addr + len - 1);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   488
  _region_data[end_region].set_partial_obj_size(end_ofs + 1);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   489
  _region_data[end_region].set_partial_obj_addr(addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
ParallelCompactData::summarize_dense_prefix(HeapWord* beg, HeapWord* end)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   495
  assert(region_offset(beg) == 0, "not RegionSize aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   496
  assert(region_offset(end) == 0, "not RegionSize aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   497
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   498
  size_t cur_region = addr_to_region_idx(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   499
  const size_t end_region = addr_to_region_idx(end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  HeapWord* addr = beg;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   501
  while (cur_region < end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   502
    _region_data[cur_region].set_destination(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   503
    _region_data[cur_region].set_destination_count(0);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   504
    _region_data[cur_region].set_source_region(cur_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   505
    _region_data[cur_region].set_data_location(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   506
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   507
    // Update live_obj_size so the region appears completely full.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   508
    size_t live_size = RegionSize - _region_data[cur_region].partial_obj_size();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   509
    _region_data[cur_region].set_live_obj_size(live_size);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   510
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   511
    ++cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   512
    addr += RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   516
// Find the point at which a space can be split and, if necessary, record the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   517
// split point.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   518
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   519
// If the current src region (which overflowed the destination space) doesn't
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   520
// have a partial object, the split point is at the beginning of the current src
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   521
// region (an "easy" split, no extra bookkeeping required).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   522
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   523
// If the current src region has a partial object, the split point is in the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   524
// region where that partial object starts (call it the split_region).  If
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   525
// split_region has a partial object, then the split point is just after that
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   526
// partial object (a "hard" split where we have to record the split data and
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   527
// zero the partial_obj_size field).  With a "hard" split, we know that the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   528
// partial_obj ends within split_region because the partial object that caused
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   529
// the overflow starts in split_region.  If split_region doesn't have a partial
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   530
// obj, then the split is at the beginning of split_region (another "easy"
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   531
// split).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   532
HeapWord*
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   533
ParallelCompactData::summarize_split_space(size_t src_region,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   534
                                           SplitInfo& split_info,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   535
                                           HeapWord* destination,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   536
                                           HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   537
                                           HeapWord** target_next)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   538
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   539
  assert(destination <= target_end, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   540
  assert(destination + _region_data[src_region].data_size() > target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   541
    "region should not fit into target space");
2363
f09f17e0ebc7 6810474: par compact - crash in summary_phase with very full heap
jcoomes
parents: 2154
diff changeset
   542
  assert(is_region_aligned(target_end), "sanity");
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   543
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   544
  size_t split_region = src_region;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   545
  HeapWord* split_destination = destination;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   546
  size_t partial_obj_size = _region_data[src_region].partial_obj_size();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   547
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   548
  if (destination + partial_obj_size > target_end) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   549
    // The split point is just after the partial object (if any) in the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   550
    // src_region that contains the start of the object that overflowed the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   551
    // destination space.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   552
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   553
    // Find the start of the "overflow" object and set split_region to the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   554
    // region containing it.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   555
    HeapWord* const overflow_obj = _region_data[src_region].partial_obj_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   556
    split_region = addr_to_region_idx(overflow_obj);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   557
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   558
    // Clear the source_region field of all destination regions whose first word
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   559
    // came from data after the split point (a non-null source_region field
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   560
    // implies a region must be filled).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   561
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   562
    // An alternative to the simple loop below:  clear during post_compact(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   563
    // which uses memcpy instead of individual stores, and is easy to
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   564
    // parallelize.  (The downside is that it clears the entire RegionData
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   565
    // object as opposed to just one field.)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   566
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   567
    // post_compact() would have to clear the summary data up to the highest
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   568
    // address that was written during the summary phase, which would be
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   569
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   570
    //         max(top, max(new_top, clear_top))
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   571
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   572
    // where clear_top is a new field in SpaceInfo.  Would have to set clear_top
2363
f09f17e0ebc7 6810474: par compact - crash in summary_phase with very full heap
jcoomes
parents: 2154
diff changeset
   573
    // to target_end.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   574
    const RegionData* const sr = region(split_region);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   575
    const size_t beg_idx =
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   576
      addr_to_region_idx(region_align_up(sr->destination() +
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   577
                                         sr->partial_obj_size()));
2363
f09f17e0ebc7 6810474: par compact - crash in summary_phase with very full heap
jcoomes
parents: 2154
diff changeset
   578
    const size_t end_idx = addr_to_region_idx(target_end);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   579
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   580
    if (TraceParallelOldGCSummaryPhase) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   581
        gclog_or_tty->print_cr("split:  clearing source_region field in ["
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   582
                               SIZE_FORMAT ", " SIZE_FORMAT ")",
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   583
                               beg_idx, end_idx);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   584
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   585
    for (size_t idx = beg_idx; idx < end_idx; ++idx) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   586
      _region_data[idx].set_source_region(0);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   587
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   588
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   589
    // Set split_destination and partial_obj_size to reflect the split region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   590
    split_destination = sr->destination();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   591
    partial_obj_size = sr->partial_obj_size();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   592
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   593
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   594
  // The split is recorded only if a partial object extends onto the region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   595
  if (partial_obj_size != 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   596
    _region_data[split_region].set_partial_obj_size(0);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   597
    split_info.record(split_region, partial_obj_size, split_destination);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   598
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   599
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   600
  // Setup the continuation addresses.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   601
  *target_next = split_destination + partial_obj_size;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   602
  HeapWord* const source_next = region_to_addr(split_region) + partial_obj_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  if (TraceParallelOldGCSummaryPhase) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   605
    const char * split_type = partial_obj_size == 0 ? "easy" : "hard";
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   606
    gclog_or_tty->print_cr("%s split:  src=" PTR_FORMAT " src_c=" SIZE_FORMAT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   607
                           " pos=" SIZE_FORMAT,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   608
                           split_type, source_next, split_region,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   609
                           partial_obj_size);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   610
    gclog_or_tty->print_cr("%s split:  dst=" PTR_FORMAT " dst_c=" SIZE_FORMAT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   611
                           " tn=" PTR_FORMAT,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   612
                           split_type, split_destination,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   613
                           addr_to_region_idx(split_destination),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   614
                           *target_next);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   615
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   616
    if (partial_obj_size != 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   617
      HeapWord* const po_beg = split_info.destination();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   618
      HeapWord* const po_end = po_beg + split_info.partial_obj_size();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   619
      gclog_or_tty->print_cr("%s split:  "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   620
                             "po_beg=" PTR_FORMAT " " SIZE_FORMAT " "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   621
                             "po_end=" PTR_FORMAT " " SIZE_FORMAT,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   622
                             split_type,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   623
                             po_beg, addr_to_region_idx(po_beg),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   624
                             po_end, addr_to_region_idx(po_end));
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   625
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   626
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   627
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   628
  return source_next;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   629
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   630
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   631
bool ParallelCompactData::summarize(SplitInfo& split_info,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   632
                                    HeapWord* source_beg, HeapWord* source_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   633
                                    HeapWord** source_next,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   634
                                    HeapWord* target_beg, HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   635
                                    HeapWord** target_next)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   636
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   637
  if (TraceParallelOldGCSummaryPhase) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   638
    HeapWord* const source_next_val = source_next == NULL ? NULL : *source_next;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   639
    tty->print_cr("sb=" PTR_FORMAT " se=" PTR_FORMAT " sn=" PTR_FORMAT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   640
                  "tb=" PTR_FORMAT " te=" PTR_FORMAT " tn=" PTR_FORMAT,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   641
                  source_beg, source_end, source_next_val,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   642
                  target_beg, target_end, *target_next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   645
  size_t cur_region = addr_to_region_idx(source_beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   646
  const size_t end_region = addr_to_region_idx(region_align_up(source_end));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  HeapWord *dest_addr = target_beg;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   649
  while (cur_region < end_region) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   650
    // The destination must be set even if the region has no data.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   651
    _region_data[cur_region].set_destination(dest_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   652
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   653
    size_t words = _region_data[cur_region].data_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    if (words > 0) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   655
      // If cur_region does not fit entirely into the target space, find a point
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   656
      // at which the source space can be 'split' so that part is copied to the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   657
      // target space and the rest is copied elsewhere.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   658
      if (dest_addr + words > target_end) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   659
        assert(source_next != NULL, "source_next is NULL when splitting");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   660
        *source_next = summarize_split_space(cur_region, split_info, dest_addr,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   661
                                             target_end, target_next);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   662
        return false;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   663
      }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   664
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   665
      // Compute the destination_count for cur_region, and if necessary, update
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   666
      // source_region for a destination region.  The source_region field is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   667
      // updated if cur_region is the first (left-most) region to be copied to a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   668
      // destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   669
      //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   670
      // The destination_count calculation is a bit subtle.  A region that has
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   671
      // data that compacts into itself does not count itself as a destination.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   672
      // This maintains the invariant that a zero count means the region is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   673
      // available and can be claimed and then filled.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   674
      uint destination_count = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   675
      if (split_info.is_split(cur_region)) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   676
        // The current region has been split:  the partial object will be copied
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   677
        // to one destination space and the remaining data will be copied to
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   678
        // another destination space.  Adjust the initial destination_count and,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   679
        // if necessary, set the source_region field if the partial object will
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   680
        // cross a destination region boundary.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   681
        destination_count = split_info.destination_count();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   682
        if (destination_count == 2) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   683
          size_t dest_idx = addr_to_region_idx(split_info.dest_region_addr());
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   684
          _region_data[dest_idx].set_source_region(cur_region);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   685
        }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   686
      }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   687
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
      HeapWord* const last_addr = dest_addr + words - 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   689
      const size_t dest_region_1 = addr_to_region_idx(dest_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   690
      const size_t dest_region_2 = addr_to_region_idx(last_addr);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   691
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   692
      // Initially assume that the destination regions will be the same and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
      // adjust the value below if necessary.  Under this assumption, if
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   694
      // cur_region == dest_region_2, then cur_region will be compacted
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   695
      // completely into itself.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   696
      destination_count += cur_region == dest_region_2 ? 0 : 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   697
      if (dest_region_1 != dest_region_2) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   698
        // Destination regions differ; adjust destination_count.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
        destination_count += 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   700
        // Data from cur_region will be copied to the start of dest_region_2.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   701
        _region_data[dest_region_2].set_source_region(cur_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   702
      } else if (region_offset(dest_addr) == 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   703
        // Data from cur_region will be copied to the start of the destination
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   704
        // region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   705
        _region_data[dest_region_1].set_source_region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   708
      _region_data[cur_region].set_destination_count(destination_count);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   709
      _region_data[cur_region].set_data_location(region_to_addr(cur_region));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
      dest_addr += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   713
    ++cur_region;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  *target_next = dest_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
HeapWord* ParallelCompactData::calc_new_pointer(HeapWord* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  assert(addr != NULL, "Should detect NULL oop earlier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  assert(PSParallelCompact::gc_heap()->is_in(addr), "addr not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  if (PSParallelCompact::mark_bitmap()->is_unmarked(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    gclog_or_tty->print_cr("calc_new_pointer:: addr " PTR_FORMAT, addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  assert(PSParallelCompact::mark_bitmap()->is_marked(addr), "obj not marked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   730
  // Region covering the object.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   731
  size_t region_index = addr_to_region_idx(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   732
  const RegionData* const region_ptr = region(region_index);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   733
  HeapWord* const region_addr = region_align_down(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   734
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   735
  assert(addr < region_addr + RegionSize, "Region does not cover object");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   736
  assert(addr_to_region_ptr(region_addr) == region_ptr, "sanity check");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   737
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   738
  HeapWord* result = region_ptr->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   739
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   740
  // If all the data in the region is live, then the new location of the object
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   741
  // can be calculated from the destination of the region plus the offset of the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   742
  // object in the region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   743
  if (region_ptr->data_size() == RegionSize) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   744
    result += pointer_delta(addr, region_addr);
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
   745
    DEBUG_ONLY(PSParallelCompact::check_new_location(addr, result);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  // The new location of the object is
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   750
  //    region destination +
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   751
  //    size of the partial object extending onto the region +
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   752
  //    sizes of the live objects in the Region that are to the left of addr
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   753
  const size_t partial_obj_size = region_ptr->partial_obj_size();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   754
  HeapWord* const search_start = region_addr + partial_obj_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  const ParMarkBitMap* bitmap = PSParallelCompact::mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  size_t live_to_left = bitmap->live_words_in_range(search_start, oop(addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  result += partial_obj_size + live_to_left;
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
   760
  DEBUG_ONLY(PSParallelCompact::check_new_location(addr, result);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
klassOop ParallelCompactData::calc_new_klass(klassOop old_klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  klassOop updated_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  if (PSParallelCompact::should_update_klass(old_klass)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    updated_klass = (klassOop) calc_new_pointer(old_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    updated_klass = old_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  return updated_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
void ParallelCompactData::verify_clear(const PSVirtualSpace* vspace)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  const size_t* const beg = (const size_t*)vspace->committed_low_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  const size_t* const end = (const size_t*)vspace->committed_high_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  for (const size_t* p = beg; p < end; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
    assert(*p == 0, "not zero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
void ParallelCompactData::verify_clear()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   787
  verify_clear(_region_vspace);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
#ifdef NOT_PRODUCT
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   792
ParallelCompactData::RegionData* debug_region(size_t region_index) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  ParallelCompactData& sd = PSParallelCompact::summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   794
  return sd.region(region_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
elapsedTimer        PSParallelCompact::_accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
unsigned int        PSParallelCompact::_total_invocations = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
unsigned int        PSParallelCompact::_maximum_compaction_gc_num = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
jlong               PSParallelCompact::_time_of_last_gc = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
CollectorCounters*  PSParallelCompact::_counters = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
ParMarkBitMap       PSParallelCompact::_mark_bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
ParallelCompactData PSParallelCompact::_summary_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   807
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   808
void PSParallelCompact::IsAliveClosure::do_object(oop p)   { ShouldNotReachHere(); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   809
bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   810
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   811
void PSParallelCompact::KeepAliveClosure::do_oop(oop* p)       { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   812
void PSParallelCompact::KeepAliveClosure::do_oop(narrowOop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   813
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_root_pointer_closure(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   817
void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p)       { adjust_pointer(p, _is_root); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   818
void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p, _is_root); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   819
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 3916
diff changeset
   820
void PSParallelCompact::FollowStackClosure::do_void() { _compaction_manager->follow_marking_stacks(); }
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   821
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   822
void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p)       { mark_and_push(_compaction_manager, p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   823
void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(_compaction_manager, p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
void PSParallelCompact::post_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  MemRegion mr = heap->reserved_region();
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   830
  _ref_processor =
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   831
    new ReferenceProcessor(mr,            // span
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   832
                           ParallelRefProcEnabled && (ParallelGCThreads > 1), // mt processing
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   833
                           (int) ParallelGCThreads, // mt processing degree
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   834
                           true,          // mt discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   835
                           (int) ParallelGCThreads, // mt discovery degree
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   836
                           true,          // atomic_discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   837
                           &_is_alive_closure, // non-header is alive closure
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   838
                           false);        // write barrier for next field updates
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  _counters = new CollectorCounters("PSParallelCompact", 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  // Initialize static fields in ParCompactionManager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  ParCompactionManager::initialize(mark_bitmap());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
bool PSParallelCompact::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  MemRegion mr = heap->reserved_region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  // Was the old gen get allocated successfully?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  if (!heap->old_gen()->is_allocated()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  initialize_space_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  initialize_dead_wood_limiter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  if (!_mark_bitmap.initialize(mr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
    vm_shutdown_during_initialization("Unable to allocate bit map for "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
      "parallel garbage collection for the requested heap size.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  if (!_summary_data.initialize(mr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
    vm_shutdown_during_initialization("Unable to allocate tables for "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
      "parallel garbage collection for the requested heap size.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
void PSParallelCompact::initialize_space_info()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  memset(&_space_info, 0, sizeof(_space_info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  MutableSpace* perm_space = heap->perm_gen()->object_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  _space_info[perm_space_id].set_space(perm_space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  _space_info[old_space_id].set_space(heap->old_gen()->object_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  _space_info[eden_space_id].set_space(young_gen->eden_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  _space_info[from_space_id].set_space(young_gen->from_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  _space_info[to_space_id].set_space(young_gen->to_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  _space_info[perm_space_id].set_start_array(heap->perm_gen()->start_array());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  _space_info[old_space_id].set_start_array(heap->old_gen()->start_array());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  _space_info[perm_space_id].set_min_dense_prefix(perm_space->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  if (TraceParallelOldGCDensePrefix) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    tty->print_cr("perm min_dense_prefix=" PTR_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
                  _space_info[perm_space_id].min_dense_prefix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
void PSParallelCompact::initialize_dead_wood_limiter()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  const size_t max = 100;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  _dwl_mean = double(MIN2(ParallelOldDeadWoodLimiterMean, max)) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  _dwl_std_dev = double(MIN2(ParallelOldDeadWoodLimiterStdDev, max)) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  _dwl_first_term = 1.0 / (sqrt(2.0 * M_PI) * _dwl_std_dev);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  DEBUG_ONLY(_dwl_initialized = true;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  _dwl_adjustment = normal_distribution(1.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
// Simple class for storing info about the heap at the start of GC, to be used
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
// after GC for comparison/printing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
class PreGCValues {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  PreGCValues() { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  PreGCValues(ParallelScavengeHeap* heap) { fill(heap); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  void fill(ParallelScavengeHeap* heap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    _heap_used      = heap->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
    _young_gen_used = heap->young_gen()->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
    _old_gen_used   = heap->old_gen()->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    _perm_gen_used  = heap->perm_gen()->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  size_t heap_used() const      { return _heap_used; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  size_t young_gen_used() const { return _young_gen_used; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  size_t old_gen_used() const   { return _old_gen_used; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  size_t perm_gen_used() const  { return _perm_gen_used; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  size_t _heap_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  size_t _young_gen_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  size_t _old_gen_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
  size_t _perm_gen_used;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
PSParallelCompact::clear_data_covering_space(SpaceId id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // At this point, top is the value before GC, new_top() is the value that will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  // be set at the end of GC.  The marking bitmap is cleared to top; nothing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  // should be marked above top.  The summary data is cleared to the larger of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  // top & new_top.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  HeapWord* const bot = space->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  HeapWord* const top = space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  HeapWord* const max_top = MAX2(top, _space_info[id].new_top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  const idx_t beg_bit = _mark_bitmap.addr_to_bit(bot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  const idx_t end_bit = BitMap::word_align_up(_mark_bitmap.addr_to_bit(top));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  _mark_bitmap.clear_range(beg_bit, end_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   949
  const size_t beg_region = _summary_data.addr_to_region_idx(bot);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   950
  const size_t end_region =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   951
    _summary_data.addr_to_region_idx(_summary_data.region_align_up(max_top));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   952
  _summary_data.clear_range(beg_region, end_region);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   953
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   954
  // Clear the data used to 'split' regions.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   955
  SplitInfo& split_info = _space_info[id].split_info();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   956
  if (split_info.is_valid()) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   957
    split_info.clear();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   958
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   959
  DEBUG_ONLY(split_info.verify_clear();)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  // Update the from & to space pointers in space_info, since they are swapped
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  // at each young gen gc.  Do the update unconditionally (even though a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  // promotion failure does not swap spaces) because an unknown number of minor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  // collections will have swapped the spaces an unknown number of times.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  TraceTime tm("pre compact", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  _space_info[from_space_id].set_space(heap->young_gen()->from_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  _space_info[to_space_id].set_space(heap->young_gen()->to_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  pre_gc_values->fill(heap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  ParCompactionManager::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  NOT_PRODUCT(_mark_bitmap.reset_counters());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  DEBUG_ONLY(add_obj_count = add_obj_size = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  DEBUG_ONLY(mark_bitmap_count = mark_bitmap_size = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  // Increment the invocation count
386
7f121b1192f2 6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents: 1
diff changeset
   981
  heap->increment_total_collections(true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  // We need to track unique mark sweep invocations as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  _total_invocations++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
    Universe::print_heap_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  // Fill in TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  heap->accumulate_statistics_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  heap->ensure_parsability(true);  // retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    gclog_or_tty->print(" VerifyBeforeGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    Universe::verify(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  // Verify object start arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
      VerifyBeforeGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
    heap->old_gen()->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    heap->perm_gen()->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  DEBUG_ONLY(mark_bitmap()->verify_clear();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  DEBUG_ONLY(summary_data().verify_clear();)
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1009
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1010
  // Have worker threads release resources the next time they run a task.
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1011
  gc_task_manager()->release_all_resources();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
void PSParallelCompact::post_compact()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
  TraceTime tm("post compact", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  for (unsigned int id = perm_space_id; id < last_space_id; ++id) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1019
    // Clear the marking bitmap, summary data and split info.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
    clear_data_covering_space(SpaceId(id));
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1021
    // Update top().  Must be done after clearing the bitmap and summary data.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1022
    _space_info[id].publish_new_top();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  MutableSpace* const eden_space = _space_info[eden_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  MutableSpace* const from_space = _space_info[from_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  MutableSpace* const to_space   = _space_info[to_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  bool eden_empty = eden_space->is_empty();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  if (!eden_empty) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
    eden_empty = absorb_live_data_from_eden(heap->size_policy(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
                                            heap->young_gen(), heap->old_gen());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  // Update heap occupancy information which is used as input to the soft ref
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  // clearing policy at the next gc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  Universe::update_heap_info_at_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  bool young_gen_empty = eden_empty && from_space->is_empty() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    to_space->is_empty();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  BarrierSet* bs = heap->barrier_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  if (bs->is_a(BarrierSet::ModRef)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    ModRefBarrierSet* modBS = (ModRefBarrierSet*)bs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
    MemRegion old_mr = heap->old_gen()->reserved();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
    MemRegion perm_mr = heap->perm_gen()->reserved();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    assert(perm_mr.end() <= old_mr.start(), "Generations out of order");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    if (young_gen_empty) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
      modBS->clear(MemRegion(perm_mr.start(), old_mr.end()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
      modBS->invalidate(MemRegion(perm_mr.start(), old_mr.end()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  Threads::gc_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  CodeCache::gc_epilogue();
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7397
diff changeset
  1059
  JvmtiExport::gc_epilogue();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  ref_processor()->enqueue_discovered_references(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1065
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1066
    heap->gen_mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1067
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1068
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  // Update time of last GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  reset_millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
PSParallelCompact::compute_dense_prefix_via_density(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
                                                    bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1077
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  const ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  const MutableSpace* const space = _space_info[id].space();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1081
  HeapWord* const top_aligned_up = sd.region_align_up(space->top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1082
  const RegionData* const beg_cp = sd.addr_to_region_ptr(space->bottom());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1083
  const RegionData* const end_cp = sd.addr_to_region_ptr(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1084
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1085
  // Skip full regions at the beginning of the space--they are necessarily part
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  // of the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  size_t full_count = 0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1088
  const RegionData* cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1089
  for (cp = beg_cp; cp < end_cp && cp->data_size() == region_size; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
    ++full_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  assert(total_invocations() >= _maximum_compaction_gc_num, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  const size_t gcs_since_max = total_invocations() - _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  const bool interval_ended = gcs_since_max > HeapMaximumCompactionInterval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  if (maximum_compaction || cp == end_cp || interval_ended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    _maximum_compaction_gc_num = total_invocations();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1098
    return sd.region_to_addr(cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  HeapWord* const new_top = _space_info[id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  const size_t space_live = pointer_delta(new_top, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  const size_t space_used = space->used_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  const size_t space_capacity = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  const double cur_density = double(space_live) / space_capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  const double deadwood_density =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
    (1.0 - cur_density) * (1.0 - cur_density) * cur_density * cur_density;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  const size_t deadwood_goal = size_t(space_capacity * deadwood_density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  if (TraceParallelOldGCDensePrefix) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
    tty->print_cr("cur_dens=%5.3f dw_dens=%5.3f dw_goal=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
                  cur_density, deadwood_density, deadwood_goal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
    tty->print_cr("space_live=" SIZE_FORMAT " " "space_used=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
                  "space_cap=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
                  space_live, space_used,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
                  space_capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // XXX - Use binary search?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1121
  HeapWord* dense_prefix = sd.region_to_addr(cp);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1122
  const RegionData* full_cp = cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1123
  const RegionData* const top_cp = sd.addr_to_region_ptr(space->top() - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  while (cp < end_cp) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1125
    HeapWord* region_destination = cp->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1126
    const size_t cur_deadwood = pointer_delta(dense_prefix, region_destination);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    if (TraceParallelOldGCDensePrefix && Verbose) {
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1128
      tty->print_cr("c#=" SIZE_FORMAT_W(4) " dst=" PTR_FORMAT " "
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1129
                    "dp=" SIZE_FORMAT_W(8) " " "cdw=" SIZE_FORMAT_W(8),
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1130
                    sd.region(cp), region_destination,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
                    dense_prefix, cur_deadwood);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
    if (cur_deadwood >= deadwood_goal) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1135
      // Found the region that has the correct amount of deadwood to the left.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1136
      // This typically occurs after crossing a fairly sparse set of regions, so
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1137
      // iterate backwards over those sparse regions, looking for the region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1138
      // that has the lowest density of live objects 'to the right.'
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1139
      size_t space_to_left = sd.region(cp) * region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
      size_t live_to_left = space_to_left - cur_deadwood;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
      size_t space_to_right = space_capacity - space_to_left;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
      size_t live_to_right = space_live - live_to_left;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
      double density_to_right = double(live_to_right) / space_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
      while (cp > full_cp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
        --cp;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1146
        const size_t prev_region_live_to_right = live_to_right -
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1147
          cp->data_size();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1148
        const size_t prev_region_space_to_right = space_to_right + region_size;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1149
        double prev_region_density_to_right =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1150
          double(prev_region_live_to_right) / prev_region_space_to_right;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1151
        if (density_to_right <= prev_region_density_to_right) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
          return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
        if (TraceParallelOldGCDensePrefix && Verbose) {
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1155
          tty->print_cr("backing up from c=" SIZE_FORMAT_W(4) " d2r=%10.8f "
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1156
                        "pc_d2r=%10.8f", sd.region(cp), density_to_right,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1157
                        prev_region_density_to_right);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
        }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1159
        dense_prefix -= region_size;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1160
        live_to_right = prev_region_live_to_right;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1161
        space_to_right = prev_region_space_to_right;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1162
        density_to_right = prev_region_density_to_right;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
      return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1167
    dense_prefix += region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
    ++cp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
void PSParallelCompact::print_dense_prefix_stats(const char* const algorithm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
                                                 const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
                                                 const bool maximum_compaction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
                                                 HeapWord* const addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1180
  const size_t region_idx = summary_data().addr_to_region_idx(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1181
  RegionData* const cp = summary_data().region(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  const MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  HeapWord* const new_top = _space_info[id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  const size_t space_live = pointer_delta(new_top, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  const size_t dead_to_left = pointer_delta(addr, cp->destination());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  const size_t space_cap = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  const double dead_to_left_pct = double(dead_to_left) / space_cap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  const size_t live_to_right = new_top - cp->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  const size_t dead_to_right = space->top() - addr - live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1192
  tty->print_cr("%s=" PTR_FORMAT " dpc=" SIZE_FORMAT_W(5) " "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
                "spl=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
                "d2l=" SIZE_FORMAT " d2l%%=%6.4f "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
                "d2r=" SIZE_FORMAT " l2r=" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
                " ratio=%10.8f",
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1197
                algorithm, addr, region_idx,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
                space_live,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
                dead_to_left, dead_to_left_pct,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
                dead_to_right, live_to_right,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
                double(dead_to_right) / live_to_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
// Return a fraction indicating how much of the generation can be treated as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
// "dead wood" (i.e., not reclaimed).  The function uses a normal distribution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
// based on the density of live objects in the generation to determine a limit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
// which is then adjusted so the return value is min_percent when the density is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
// 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
// The following table shows some return values for a different values of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
// standard deviation (ParallelOldDeadWoodLimiterStdDev); the mean is 0.5 and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
// min_percent is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
//                          fraction allowed as dead wood
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
//         -----------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
// density std_dev=70 std_dev=75 std_dev=80 std_dev=85 std_dev=90 std_dev=95
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
// ------- ---------- ---------- ---------- ---------- ---------- ----------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
// 0.00000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
// 0.05000 0.03193096 0.02836880 0.02550828 0.02319280 0.02130337 0.01974941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
// 0.10000 0.05247504 0.04547452 0.03988045 0.03537016 0.03170171 0.02869272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
// 0.15000 0.07135702 0.06111390 0.05296419 0.04641639 0.04110601 0.03676066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
// 0.20000 0.08831616 0.07509618 0.06461766 0.05622444 0.04943437 0.04388975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
// 0.25000 0.10311208 0.08724696 0.07471205 0.06469760 0.05661313 0.05002313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
// 0.30000 0.11553050 0.09741183 0.08313394 0.07175114 0.06257797 0.05511132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
// 0.35000 0.12538832 0.10545958 0.08978741 0.07731366 0.06727491 0.05911289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
// 0.40000 0.13253818 0.11128511 0.09459590 0.08132834 0.07066107 0.06199500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
// 0.45000 0.13687208 0.11481163 0.09750361 0.08375387 0.07270534 0.06373386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
// 0.50000 0.13832410 0.11599237 0.09847664 0.08456518 0.07338887 0.06431510
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
// 0.55000 0.13687208 0.11481163 0.09750361 0.08375387 0.07270534 0.06373386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
// 0.60000 0.13253818 0.11128511 0.09459590 0.08132834 0.07066107 0.06199500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
// 0.65000 0.12538832 0.10545958 0.08978741 0.07731366 0.06727491 0.05911289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
// 0.70000 0.11553050 0.09741183 0.08313394 0.07175114 0.06257797 0.05511132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
// 0.75000 0.10311208 0.08724696 0.07471205 0.06469760 0.05661313 0.05002313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
// 0.80000 0.08831616 0.07509618 0.06461766 0.05622444 0.04943437 0.04388975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
// 0.85000 0.07135702 0.06111390 0.05296419 0.04641639 0.04110601 0.03676066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
// 0.90000 0.05247504 0.04547452 0.03988045 0.03537016 0.03170171 0.02869272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
// 0.95000 0.03193096 0.02836880 0.02550828 0.02319280 0.02130337 0.01974941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
// 1.00000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
double PSParallelCompact::dead_wood_limiter(double density, size_t min_percent)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  assert(_dwl_initialized, "uninitialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  // The raw limit is the value of the normal distribution at x = density.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  const double raw_limit = normal_distribution(density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
  // Adjust the raw limit so it becomes the minimum when the density is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  // First subtract the adjustment value (which is simply the precomputed value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  // normal_distribution(1.0)); this yields a value of 0 when the density is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  // Then add the minimum value, so the minimum is returned when the density is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  // 1.  Finally, prevent negative values, which occur when the mean is not 0.5.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  const double min = double(min_percent) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  const double limit = raw_limit - _dwl_adjustment + min;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  return MAX2(limit, 0.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1259
ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1260
PSParallelCompact::first_dead_space_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1261
                                           const RegionData* end)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1263
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1265
  size_t left = sd.region(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1266
  size_t right = end > beg ? sd.region(end) - 1 : left;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  // Binary search.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  while (left < right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
    // Equivalent to (left + right) / 2, but does not overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
    const size_t middle = left + (right - left) / 2;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1272
    RegionData* const middle_ptr = sd.region(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
    HeapWord* const dest = middle_ptr->destination();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1274
    HeapWord* const addr = sd.region_to_addr(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
    assert(dest != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
    assert(dest <= addr, "must move left");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
    if (middle > left && dest < addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
      right = middle - 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1280
    } else if (middle < right && middle_ptr->data_size() == region_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
      left = middle + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
      return middle_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
  }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1286
  return sd.region(left);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1289
ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1290
PSParallelCompact::dead_wood_limit_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1291
                                          const RegionData* end,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1292
                                          size_t dead_words)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1295
  size_t left = sd.region(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1296
  size_t right = end > beg ? sd.region(end) - 1 : left;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  // Binary search.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  while (left < right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
    // Equivalent to (left + right) / 2, but does not overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
    const size_t middle = left + (right - left) / 2;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1302
    RegionData* const middle_ptr = sd.region(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    HeapWord* const dest = middle_ptr->destination();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1304
    HeapWord* const addr = sd.region_to_addr(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    assert(dest != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
    assert(dest <= addr, "must move left");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    const size_t dead_to_left = pointer_delta(addr, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
    if (middle > left && dead_to_left > dead_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
      right = middle - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
    } else if (middle < right && dead_to_left < dead_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
      left = middle + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
      return middle_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1317
  return sd.region(left);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
// The result is valid during the summary phase, after the initial summarization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
// of each space into itself, and before final summarization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
inline double
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1323
PSParallelCompact::reclaimed_ratio(const RegionData* const cp,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
                                   HeapWord* const bottom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
                                   HeapWord* const top,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
                                   HeapWord* const new_top)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  assert(cp != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  assert(bottom != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  assert(top != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  assert(new_top != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  assert(top >= new_top, "summary data problem?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  assert(new_top > bottom, "space is empty; should not be here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  assert(new_top >= cp->destination(), "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1337
  assert(top >= sd.region_to_addr(cp), "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  HeapWord* const destination = cp->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  const size_t dense_prefix_live  = pointer_delta(destination, bottom);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  const size_t compacted_region_live = pointer_delta(new_top, destination);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1342
  const size_t compacted_region_used = pointer_delta(top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1343
                                                     sd.region_to_addr(cp));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
  const size_t reclaimable = compacted_region_used - compacted_region_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  const double divisor = dense_prefix_live + 1.25 * compacted_region_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  return double(reclaimable) / divisor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
// Return the address of the end of the dense prefix, a.k.a. the start of the
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1351
// compacted region.  The address is always on a region boundary.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1353
// Completely full regions at the left are skipped, since no compaction can
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1354
// occur in those regions.  Then the maximum amount of dead wood to allow is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1355
// computed, based on the density (amount live / capacity) of the generation;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1356
// the region with approximately that amount of dead space to the left is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1357
// identified as the limit region.  Regions between the last completely full
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1358
// region and the limit region are scanned and the one that has the best
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1359
// (maximum) reclaimed_ratio() is selected.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
PSParallelCompact::compute_dense_prefix(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
                                        bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
{
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1364
  if (ParallelOldGCSplitALot) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1365
    if (_space_info[id].dense_prefix() != _space_info[id].space()->bottom()) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1366
      // The value was chosen to provoke splitting a young gen space; use it.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1367
      return _space_info[id].dense_prefix();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1368
    }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1369
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1370
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1371
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  const ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
  const MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  HeapWord* const top = space->top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1376
  HeapWord* const top_aligned_up = sd.region_align_up(top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  HeapWord* const new_top = _space_info[id].new_top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1378
  HeapWord* const new_top_aligned_up = sd.region_align_up(new_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  HeapWord* const bottom = space->bottom();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1380
  const RegionData* const beg_cp = sd.addr_to_region_ptr(bottom);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1381
  const RegionData* const top_cp = sd.addr_to_region_ptr(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1382
  const RegionData* const new_top_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1383
    sd.addr_to_region_ptr(new_top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1384
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1385
  // Skip full regions at the beginning of the space--they are necessarily part
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  // of the dense prefix.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1387
  const RegionData* const full_cp = first_dead_space_region(beg_cp, new_top_cp);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1388
  assert(full_cp->destination() == sd.region_to_addr(full_cp) ||
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
         space->is_empty(), "no dead space allowed to the left");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1390
  assert(full_cp->data_size() < region_size || full_cp == new_top_cp - 1,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1391
         "region must have dead space");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
  // The gc number is saved whenever a maximum compaction is done, and used to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
  // determine when the maximum compaction interval has expired.  This avoids
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
  // successive max compactions for different reasons.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
  assert(total_invocations() >= _maximum_compaction_gc_num, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
  const size_t gcs_since_max = total_invocations() - _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  const bool interval_ended = gcs_since_max > HeapMaximumCompactionInterval ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
    total_invocations() == HeapFirstMaximumCompactionCount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  if (maximum_compaction || full_cp == top_cp || interval_ended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
    _maximum_compaction_gc_num = total_invocations();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1402
    return sd.region_to_addr(full_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  const size_t space_live = pointer_delta(new_top, bottom);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
  const size_t space_used = space->used_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  const size_t space_capacity = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  const double density = double(space_live) / double(space_capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  const size_t min_percent_free =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
          id == perm_space_id ? PermMarkSweepDeadRatio : MarkSweepDeadRatio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
  const double limiter = dead_wood_limiter(density, min_percent_free);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  const size_t dead_wood_max = space_used - space_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  const size_t dead_wood_limit = MIN2(size_t(space_capacity * limiter),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
                                      dead_wood_max);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  if (TraceParallelOldGCDensePrefix) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
    tty->print_cr("space_live=" SIZE_FORMAT " " "space_used=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
                  "space_cap=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
                  space_live, space_used,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
                  space_capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
    tty->print_cr("dead_wood_limiter(%6.4f, %d)=%6.4f "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
                  "dead_wood_max=" SIZE_FORMAT " dead_wood_limit=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
                  density, min_percent_free, limiter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
                  dead_wood_max, dead_wood_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1428
  // Locate the region with the desired amount of dead space to the left.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1429
  const RegionData* const limit_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1430
    dead_wood_limit_region(full_cp, top_cp, dead_wood_limit);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1431
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1432
  // Scan from the first region with dead space to the limit region and find the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  // one with the best (largest) reclaimed ratio.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
  double best_ratio = 0.0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1435
  const RegionData* best_cp = full_cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1436
  for (const RegionData* cp = full_cp; cp < limit_cp; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
    double tmp_ratio = reclaimed_ratio(cp, bottom, top, new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    if (tmp_ratio > best_ratio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
      best_cp = cp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
      best_ratio = tmp_ratio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
#if     0
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1445
  // Something to consider:  if the region with the best ratio is 'close to' the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1446
  // first region w/free space, choose the first region with free space
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1447
  // ("first-free").  The first-free region is usually near the start of the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  // heap, which means we are copying most of the heap already, so copy a bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  // more to get complete compaction.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1450
  if (pointer_delta(best_cp, full_cp, sizeof(RegionData)) < 4) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
    _maximum_compaction_gc_num = total_invocations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
    best_cp = full_cp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
#endif  // #if 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1456
  return sd.region_to_addr(best_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1459
#ifndef PRODUCT
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1460
void
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1461
PSParallelCompact::fill_with_live_objects(SpaceId id, HeapWord* const start,
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1462
                                          size_t words)
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1463
{
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1464
  if (TraceParallelOldGCSummaryPhase) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1465
    tty->print_cr("fill_with_live_objects [" PTR_FORMAT " " PTR_FORMAT ") "
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1466
                  SIZE_FORMAT, start, start + words, words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1467
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1468
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1469
  ObjectStartArray* const start_array = _space_info[id].start_array();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1470
  CollectedHeap::fill_with_objects(start, words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1471
  for (HeapWord* p = start; p < start + words; p += oop(p)->size()) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1472
    _mark_bitmap.mark_obj(p, words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1473
    _summary_data.add_obj(p, words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1474
    start_array->allocate_block(p);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1475
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1476
}
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1477
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1478
void
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1479
PSParallelCompact::summarize_new_objects(SpaceId id, HeapWord* start)
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1480
{
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1481
  ParallelCompactData& sd = summary_data();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1482
  MutableSpace* space = _space_info[id].space();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1483
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1484
  // Find the source and destination start addresses.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1485
  HeapWord* const src_addr = sd.region_align_down(start);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1486
  HeapWord* dst_addr;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1487
  if (src_addr < start) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1488
    dst_addr = sd.addr_to_region_ptr(src_addr)->destination();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1489
  } else if (src_addr > space->bottom()) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1490
    // The start (the original top() value) is aligned to a region boundary so
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1491
    // the associated region does not have a destination.  Compute the
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1492
    // destination from the previous region.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1493
    RegionData* const cp = sd.addr_to_region_ptr(src_addr) - 1;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1494
    dst_addr = cp->destination() + cp->data_size();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1495
  } else {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1496
    // Filling the entire space.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1497
    dst_addr = space->bottom();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1498
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1499
  assert(dst_addr != NULL, "sanity");
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1500
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1501
  // Update the summary data.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1502
  bool result = _summary_data.summarize(_space_info[id].split_info(),
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1503
                                        src_addr, space->top(), NULL,
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1504
                                        dst_addr, space->end(),
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1505
                                        _space_info[id].new_top_addr());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1506
  assert(result, "should not fail:  bad filler object size");
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1507
}
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1508
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1509
void
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1510
PSParallelCompact::provoke_split_fill_survivor(SpaceId id)
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1511
{
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1512
  if (total_invocations() % (ParallelOldGCSplitInterval * 3) != 0) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1513
    return;
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1514
  }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1515
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1516
  MutableSpace* const space = _space_info[id].space();
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1517
  if (space->is_empty()) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1518
    HeapWord* b = space->bottom();
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1519
    HeapWord* t = b + space->capacity_in_words() / 2;
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1520
    space->set_top(t);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1521
    if (ZapUnusedHeapArea) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1522
      space->set_top_for_allocations();
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1523
    }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1524
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1525
    size_t min_size = CollectedHeap::min_fill_size();
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1526
    size_t obj_len = min_size;
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1527
    while (b + obj_len <= t) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1528
      CollectedHeap::fill_with_object(b, obj_len);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1529
      mark_bitmap()->mark_obj(b, obj_len);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1530
      summary_data().add_obj(b, obj_len);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1531
      b += obj_len;
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1532
      obj_len = (obj_len & (min_size*3)) + min_size; // 8 16 24 32 8 16 24 32 ...
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1533
    }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1534
    if (b < t) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1535
      // The loop didn't completely fill to t (top); adjust top downward.
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1536
      space->set_top(b);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1537
      if (ZapUnusedHeapArea) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1538
        space->set_top_for_allocations();
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1539
      }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1540
    }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1541
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1542
    HeapWord** nta = _space_info[id].new_top_addr();
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1543
    bool result = summary_data().summarize(_space_info[id].split_info(),
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1544
                                           space->bottom(), space->top(), NULL,
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1545
                                           space->bottom(), space->end(), nta);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1546
    assert(result, "space must fit into itself");
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1547
  }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1548
}
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1549
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1550
void
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1551
PSParallelCompact::provoke_split(bool & max_compaction)
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1552
{
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1553
  if (total_invocations() % ParallelOldGCSplitInterval != 0) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1554
    return;
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1555
  }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1556
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1557
  const size_t region_size = ParallelCompactData::RegionSize;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1558
  ParallelCompactData& sd = summary_data();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1559
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1560
  MutableSpace* const eden_space = _space_info[eden_space_id].space();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1561
  MutableSpace* const from_space = _space_info[from_space_id].space();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1562
  const size_t eden_live = pointer_delta(eden_space->top(),
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1563
                                         _space_info[eden_space_id].new_top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1564
  const size_t from_live = pointer_delta(from_space->top(),
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1565
                                         _space_info[from_space_id].new_top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1566
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1567
  const size_t min_fill_size = CollectedHeap::min_fill_size();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1568
  const size_t eden_free = pointer_delta(eden_space->end(), eden_space->top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1569
  const size_t eden_fillable = eden_free >= min_fill_size ? eden_free : 0;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1570
  const size_t from_free = pointer_delta(from_space->end(), from_space->top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1571
  const size_t from_fillable = from_free >= min_fill_size ? from_free : 0;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1572
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1573
  // Choose the space to split; need at least 2 regions live (or fillable).
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1574
  SpaceId id;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1575
  MutableSpace* space;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1576
  size_t live_words;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1577
  size_t fill_words;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1578
  if (eden_live + eden_fillable >= region_size * 2) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1579
    id = eden_space_id;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1580
    space = eden_space;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1581
    live_words = eden_live;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1582
    fill_words = eden_fillable;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1583
  } else if (from_live + from_fillable >= region_size * 2) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1584
    id = from_space_id;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1585
    space = from_space;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1586
    live_words = from_live;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1587
    fill_words = from_fillable;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1588
  } else {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1589
    return; // Give up.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1590
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1591
  assert(fill_words == 0 || fill_words >= min_fill_size, "sanity");
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1592
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1593
  if (live_words < region_size * 2) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1594
    // Fill from top() to end() w/live objects of mixed sizes.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1595
    HeapWord* const fill_start = space->top();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1596
    live_words += fill_words;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1597
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1598
    space->set_top(fill_start + fill_words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1599
    if (ZapUnusedHeapArea) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1600
      space->set_top_for_allocations();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1601
    }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1602
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1603
    HeapWord* cur_addr = fill_start;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1604
    while (fill_words > 0) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1605
      const size_t r = (size_t)os::random() % (region_size / 2) + min_fill_size;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1606
      size_t cur_size = MIN2(align_object_size_(r), fill_words);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1607
      if (fill_words - cur_size < min_fill_size) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1608
        cur_size = fill_words; // Avoid leaving a fragment too small to fill.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1609
      }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1610
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1611
      CollectedHeap::fill_with_object(cur_addr, cur_size);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1612
      mark_bitmap()->mark_obj(cur_addr, cur_size);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1613
      sd.add_obj(cur_addr, cur_size);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1614
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1615
      cur_addr += cur_size;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1616
      fill_words -= cur_size;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1617
    }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1618
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1619
    summarize_new_objects(id, fill_start);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1620
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1621
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1622
  max_compaction = false;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1623
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1624
  // Manipulate the old gen so that it has room for about half of the live data
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1625
  // in the target young gen space (live_words / 2).
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1626
  id = old_space_id;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1627
  space = _space_info[id].space();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1628
  const size_t free_at_end = space->free_in_words();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1629
  const size_t free_target = align_object_size(live_words / 2);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1630
  const size_t dead = pointer_delta(space->top(), _space_info[id].new_top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1631
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1632
  if (free_at_end >= free_target + min_fill_size) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1633
    // Fill space above top() and set the dense prefix so everything survives.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1634
    HeapWord* const fill_start = space->top();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1635
    const size_t fill_size = free_at_end - free_target;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1636
    space->set_top(space->top() + fill_size);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1637
    if (ZapUnusedHeapArea) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1638
      space->set_top_for_allocations();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1639
    }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1640
    fill_with_live_objects(id, fill_start, fill_size);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1641
    summarize_new_objects(id, fill_start);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1642
    _space_info[id].set_dense_prefix(sd.region_align_down(space->top()));
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1643
  } else if (dead + free_at_end > free_target) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1644
    // Find a dense prefix that makes the right amount of space available.
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1645
    HeapWord* cur = sd.region_align_down(space->top());
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1646
    HeapWord* cur_destination = sd.addr_to_region_ptr(cur)->destination();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1647
    size_t dead_to_right = pointer_delta(space->end(), cur_destination);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1648
    while (dead_to_right < free_target) {
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1649
      cur -= region_size;
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1650
      cur_destination = sd.addr_to_region_ptr(cur)->destination();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1651
      dead_to_right = pointer_delta(space->end(), cur_destination);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1652
    }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1653
    _space_info[id].set_dense_prefix(cur);
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1654
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1655
}
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1656
#endif // #ifndef PRODUCT
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1657
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
void PSParallelCompact::summarize_spaces_quick()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  for (unsigned int i = 0; i < last_space_id; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
    const MutableSpace* space = _space_info[i].space();
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1662
    HeapWord** nta = _space_info[i].new_top_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1663
    bool result = _summary_data.summarize(_space_info[i].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1664
                                          space->bottom(), space->top(), NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1665
                                          space->bottom(), space->end(), nta);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1666
    assert(result, "space must fit into itself");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
    _space_info[i].set_dense_prefix(space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  }
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1669
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1670
#ifndef PRODUCT
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1671
  if (ParallelOldGCSplitALot) {
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1672
    provoke_split_fill_survivor(to_space_id);
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1673
  }
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1674
#endif // #ifndef PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
void PSParallelCompact::fill_dense_prefix_end(SpaceId id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
  HeapWord* const dense_prefix_end = dense_prefix(id);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1680
  const RegionData* region = _summary_data.addr_to_region_ptr(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
  const idx_t dense_prefix_bit = _mark_bitmap.addr_to_bit(dense_prefix_end);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1682
  if (dead_space_crosses_boundary(region, dense_prefix_bit)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
    // Only enough dead space is filled so that any remaining dead space to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
    // left is larger than the minimum filler object.  (The remainder is filled
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
    // during the copy/update phase.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
    // The size of the dead space to the right of the boundary is not a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
    // concern, since compaction will be able to use whatever space is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
    // available.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
    // Here '||' is the boundary, 'x' represents a don't care bit and a box
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
    // surrounds the space to be filled with an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
    // In the 32-bit VM, each bit represents two 32-bit words:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
    //                              +---+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
    // a) beg_bits:  ...  x   x   x | 0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
    //    end_bits:  ...  x   x   x | 0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
    //                              +---+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
    // In the 64-bit VM, each bit represents one 64-bit word:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
    //                              +------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
    // b) beg_bits:  ...  x   x   x | 0   ||   0 | x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
    //    end_bits:  ...  x   x   1 | 0   ||   0 | x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
    //                              +------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
    // c) beg_bits:  ...  x   x | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
    //    end_bits:  ...  x   1 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
    //                      +-----------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
    // d) beg_bits:  ...  x | 0   0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
    //    end_bits:  ...  1 | 0   0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
    //                      +-----------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
    // e) beg_bits:  ...  0   0 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
    //    end_bits:  ...  0   0 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
    // Initially assume case a, c or e will apply.
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1719
    size_t obj_len = CollectedHeap::min_fill_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
    HeapWord* obj_beg = dense_prefix_end - obj_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
#ifdef  _LP64
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1723
    if (MinObjAlignment > 1) { // object alignment > heap word size
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1724
      // Cases a, c or e.
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5402
diff changeset
  1725
    } else if (_mark_bitmap.is_obj_end(dense_prefix_bit - 2)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
      // Case b above.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
      obj_beg = dense_prefix_end - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
    } else if (!_mark_bitmap.is_obj_end(dense_prefix_bit - 3) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
               _mark_bitmap.is_obj_end(dense_prefix_bit - 4)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
      // Case d above.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
      obj_beg = dense_prefix_end - 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
      obj_len = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
#endif  // #ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1736
    CollectedHeap::fill_with_object(obj_beg, obj_len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
    _mark_bitmap.mark_obj(obj_beg, obj_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
    _summary_data.add_obj(obj_beg, obj_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
    assert(start_array(id) != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
    start_array(id)->allocate_block(obj_beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
void
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1745
PSParallelCompact::clear_source_region(HeapWord* beg_addr, HeapWord* end_addr)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1746
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1747
  RegionData* const beg_ptr = _summary_data.addr_to_region_ptr(beg_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1748
  HeapWord* const end_aligned_up = _summary_data.region_align_up(end_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1749
  RegionData* const end_ptr = _summary_data.addr_to_region_ptr(end_aligned_up);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1750
  for (RegionData* cur = beg_ptr; cur < end_ptr; ++cur) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1751
    cur->set_source_region(0);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1752
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1753
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1754
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1755
void
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
PSParallelCompact::summarize_space(SpaceId id, bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  assert(id < last_space_id, "id out of range");
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1759
  assert(_space_info[id].dense_prefix() == _space_info[id].space()->bottom() ||
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1760
         ParallelOldGCSplitALot && id == old_space_id,
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1761
         "should have been reset in summarize_spaces_quick()");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  const MutableSpace* space = _space_info[id].space();
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1764
  if (_space_info[id].new_top() != space->bottom()) {
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1765
    HeapWord* dense_prefix_end = compute_dense_prefix(id, maximum_compaction);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1766
    _space_info[id].set_dense_prefix(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
#ifndef PRODUCT
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1769
    if (TraceParallelOldGCDensePrefix) {
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1770
      print_dense_prefix_stats("ratio", id, maximum_compaction,
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1771
                               dense_prefix_end);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1772
      HeapWord* addr = compute_dense_prefix_via_density(id, maximum_compaction);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1773
      print_dense_prefix_stats("density", id, maximum_compaction, addr);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1774
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1777
    // Recompute the summary data, taking into account the dense prefix.  If
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1778
    // every last byte will be reclaimed, then the existing summary data which
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1779
    // compacts everything can be left in place.
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1780
    if (!maximum_compaction && dense_prefix_end != space->bottom()) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1781
      // If dead space crosses the dense prefix boundary, it is (at least
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1782
      // partially) filled with a dummy object, marked live and added to the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1783
      // summary data.  This simplifies the copy/update phase and must be done
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1784
      // before the final locations of objects are determined, to prevent
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1785
      // leaving a fragment of dead space that is too small to fill.
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1786
      fill_dense_prefix_end(id);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1787
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1788
      // Compute the destination of each Region, and thus each object.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1789
      _summary_data.summarize_dense_prefix(space->bottom(), dense_prefix_end);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1790
      _summary_data.summarize(_space_info[id].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1791
                              dense_prefix_end, space->top(), NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1792
                              dense_prefix_end, space->end(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1793
                              _space_info[id].new_top_addr());
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1794
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
  if (TraceParallelOldGCSummaryPhase) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1798
    const size_t region_size = ParallelCompactData::RegionSize;
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1799
    HeapWord* const dense_prefix_end = _space_info[id].dense_prefix();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1800
    const size_t dp_region = _summary_data.addr_to_region_idx(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    const size_t dp_words = pointer_delta(dense_prefix_end, space->bottom());
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1802
    HeapWord* const new_top = _space_info[id].new_top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1803
    const HeapWord* nt_aligned_up = _summary_data.region_align_up(new_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
    const size_t cr_words = pointer_delta(nt_aligned_up, dense_prefix_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
    tty->print_cr("id=%d cap=" SIZE_FORMAT " dp=" PTR_FORMAT " "
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1806
                  "dp_region=" SIZE_FORMAT " " "dp_count=" SIZE_FORMAT " "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
                  "cr_count=" SIZE_FORMAT " " "nt=" PTR_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
                  id, space->capacity_in_words(), dense_prefix_end,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1809
                  dp_region, dp_words / region_size,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1810
                  cr_words / region_size, new_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1814
#ifndef PRODUCT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1815
void PSParallelCompact::summary_phase_msg(SpaceId dst_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1816
                                          HeapWord* dst_beg, HeapWord* dst_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1817
                                          SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1818
                                          HeapWord* src_beg, HeapWord* src_end)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1819
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1820
  if (TraceParallelOldGCSummaryPhase) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1821
    tty->print_cr("summarizing %d [%s] into %d [%s]:  "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1822
                  "src=" PTR_FORMAT "-" PTR_FORMAT " "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1823
                  SIZE_FORMAT "-" SIZE_FORMAT " "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1824
                  "dst=" PTR_FORMAT "-" PTR_FORMAT " "
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1825
                  SIZE_FORMAT "-" SIZE_FORMAT,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1826
                  src_space_id, space_names[src_space_id],
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1827
                  dst_space_id, space_names[dst_space_id],
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1828
                  src_beg, src_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1829
                  _summary_data.addr_to_region_idx(src_beg),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1830
                  _summary_data.addr_to_region_idx(src_end),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1831
                  dst_beg, dst_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1832
                  _summary_data.addr_to_region_idx(dst_beg),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1833
                  _summary_data.addr_to_region_idx(dst_end));
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1834
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1835
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1836
#endif  // #ifndef PRODUCT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1837
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
void PSParallelCompact::summary_phase(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
                                      bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  EventMark m("2 summarize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  TraceTime tm("summary phase", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
  // trace("2");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
  if (TraceParallelOldGCMarkingPhase) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
    tty->print_cr("add_obj_count=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
                  "add_obj_bytes=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
                  add_obj_count, add_obj_size * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
    tty->print_cr("mark_bitmap_count=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
                  "mark_bitmap_bytes=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
                  mark_bitmap_count, mark_bitmap_size * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  // Quick summarization of each space into itself, to see how much is live.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  summarize_spaces_quick();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  if (TraceParallelOldGCSummaryPhase) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
    tty->print_cr("summary_phase:  after summarizing each space to self");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
    Universe::print();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1862
    NOT_PRODUCT(print_region_ranges());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
      NOT_PRODUCT(print_initial_summary_data(_summary_data, _space_info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
  // The amount of live data that will end up in old space (assuming it fits).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  size_t old_space_total_live = 0;
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1870
  assert(perm_space_id < old_space_id, "should not count perm data here");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1871
  for (unsigned int id = old_space_id; id < last_space_id; ++id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
    old_space_total_live += pointer_delta(_space_info[id].new_top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
                                          _space_info[id].space()->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1876
  MutableSpace* const old_space = _space_info[old_space_id].space();
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1877
  const size_t old_capacity = old_space->capacity_in_words();
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1878
  if (old_space_total_live > old_capacity) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
    // XXX - should also try to expand
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
    maximum_compaction = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
  }
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1882
#ifndef PRODUCT
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1883
  if (ParallelOldGCSplitALot && old_space_total_live < old_capacity) {
1683
56dd12dd6cb3 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 1682
diff changeset
  1884
    provoke_split(maximum_compaction);
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1885
  }
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1886
#endif // #ifndef PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
  // Permanent and Old generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  summarize_space(perm_space_id, maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
  summarize_space(old_space_id, maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1892
  // Summarize the remaining spaces in the young gen.  The initial target space
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1893
  // is the old gen.  If a space does not fit entirely into the target, then the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1894
  // remainder is compacted into the space itself and that space becomes the new
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1895
  // target.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1896
  SpaceId dst_space_id = old_space_id;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1897
  HeapWord* dst_space_end = old_space->end();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1898
  HeapWord** new_top_addr = _space_info[dst_space_id].new_top_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1899
  for (unsigned int id = eden_space_id; id < last_space_id; ++id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
    const MutableSpace* space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
    const size_t live = pointer_delta(_space_info[id].new_top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
                                      space->bottom());
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1903
    const size_t available = pointer_delta(dst_space_end, *new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1904
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1905
    NOT_PRODUCT(summary_phase_msg(dst_space_id, *new_top_addr, dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1906
                                  SpaceId(id), space->bottom(), space->top());)
974
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1907
    if (live > 0 && live <= available) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
      // All the live data will fit.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1909
      bool done = _summary_data.summarize(_space_info[id].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1910
                                          space->bottom(), space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1911
                                          NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1912
                                          *new_top_addr, dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1913
                                          new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1914
      assert(done, "space must fit into old gen");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1915
974
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1916
      // Reset the new_top value for the space.
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1917
      _space_info[id].set_new_top(space->bottom());
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1918
    } else if (live > 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1919
      // Attempt to fit part of the source space into the target space.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1920
      HeapWord* next_src_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1921
      bool done = _summary_data.summarize(_space_info[id].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1922
                                          space->bottom(), space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1923
                                          &next_src_addr,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1924
                                          *new_top_addr, dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1925
                                          new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1926
      assert(!done, "space should not fit into old gen");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1927
      assert(next_src_addr != NULL, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1928
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1929
      // The source space becomes the new target, so the remainder is compacted
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1930
      // within the space itself.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1931
      dst_space_id = SpaceId(id);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1932
      dst_space_end = space->end();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1933
      new_top_addr = _space_info[id].new_top_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1934
      NOT_PRODUCT(summary_phase_msg(dst_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1935
                                    space->bottom(), dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1936
                                    SpaceId(id), next_src_addr, space->top());)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1937
      done = _summary_data.summarize(_space_info[id].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1938
                                     next_src_addr, space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1939
                                     NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1940
                                     space->bottom(), dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1941
                                     new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1942
      assert(done, "space must fit when compacted into itself");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1943
      assert(*new_top_addr <= space->top(), "usage should not grow");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  if (TraceParallelOldGCSummaryPhase) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
    tty->print_cr("summary_phase:  after final summarization");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
    Universe::print();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1950
    NOT_PRODUCT(print_region_ranges());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
    if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
      NOT_PRODUCT(print_generic_summary_data(_summary_data, _space_info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
// This method should contain all heap-specific policy for invoking a full
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
// collection.  invoke_no_policy() will only attempt to compact the heap; it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
// will do nothing further.  If we need to bail out for policy reasons, scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
// before full gc, or any other specialized behavior, it needs to be added here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
// Note that this method should only be called from the vm_thread while at a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
// safepoint.
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1964
//
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1965
// Note that the all_soft_refs_clear flag in the collector policy
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1966
// may be true because this method can be called without intervening
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1967
// activity.  For example when the heap space is tight and full measure
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1968
// are being taken to free space.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
void PSParallelCompact::invoke(bool maximum_heap_compaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
  assert(Thread::current() == (Thread*)VMThread::vm_thread(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
         "should be in vm thread");
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1973
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
  GCCause::Cause gc_cause = heap->gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  assert(!heap->is_gc_active(), "not reentrant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  PSAdaptiveSizePolicy* policy = heap->size_policy();
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1979
  IsGCActiveMark mark;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1980
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1981
  if (ScavengeBeforeFullGC) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1982
    PSScavenge::invoke_no_policy();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1984
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1985
  const bool clear_all_soft_refs =
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1986
    heap->collector_policy()->should_clear_all_soft_refs();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1987
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1988
  PSParallelCompact::invoke_no_policy(clear_all_soft_refs ||
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1989
                                      maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1992
bool ParallelCompactData::region_contains(size_t region_index, HeapWord* addr) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1993
  size_t addr_region_index = addr_to_region_idx(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1994
  return region_index == addr_region_index;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
// This method contains no policy. You should probably
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
// be calling invoke() instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  assert(ref_processor() != NULL, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
386
7f121b1192f2 6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents: 1
diff changeset
  2003
  if (GC_locker::check_active_before_gc()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  TimeStamp marking_start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
  TimeStamp compaction_start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
  TimeStamp collection_exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  GCCause::Cause gc_cause = heap->gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
  PSPermGen* perm_gen = heap->perm_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  PSAdaptiveSizePolicy* size_policy = heap->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2018
  // The scope of casr should end after code that can change
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2019
  // CollectorPolicy::_should_clear_all_soft_refs.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2020
  ClearedAllSoftRefs casr(maximum_heap_compaction,
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2021
                          heap->collector_policy());
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2022
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2023
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2024
    // Save information needed to minimize mangling
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2025
    heap->record_gen_tops_before_GC();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2026
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2027
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
  2028
  heap->pre_full_gc_dump();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
  2029
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  _print_phases = PrintGCDetails && PrintParallelOldGCPhaseTimes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  // Make sure data structures are sane, make the heap parsable, and do other
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  // miscellaneous bookkeeping.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  PreGCValues pre_gc_values;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  pre_compact(&pre_gc_values);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2037
  // Get the compaction manager reserved for the VM thread.
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2038
  ParCompactionManager* const vmthread_cm =
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2039
    ParCompactionManager::manager_array(gc_task_manager()->workers());
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2040
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
  // Place after pre_compact() where the number of invocations is incremented.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
    HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
    const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
    // This is useful for debugging but don't change the output the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
    // the customer sees.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
    const char* gc_cause_str = "Full GC";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
    if (is_system_gc && PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
      gc_cause_str = "Full GC (System)";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
    TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
    TraceCollectorStats tcs(counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9178
diff changeset
  2060
    TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
    if (TraceGen1Time) accumulated_time()->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
    // Let the size policy know we're starting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
    size_policy->major_collection_begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
    // When collecting the permanent generation methodOops may be moving,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
    // so we either have to flush all bcp data or convert it into bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
    CodeCache::gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
    Threads::gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
    COMPILER2_PRESENT(DerivedPointerTable::clear());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10524
diff changeset
  2074
    ref_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
  2075
    ref_processor()->setup_policy(maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
    bool marked_for_unloading = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
    marking_start.update();
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2080
    marking_phase(vmthread_cm, maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
    if (TraceParallelOldGCMarkingPhase) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
      gclog_or_tty->print_cr("marking_phase: cas_tries %d  cas_retries %d "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
        "cas_by_another %d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
        mark_bitmap()->cas_tries(), mark_bitmap()->cas_retries(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
        mark_bitmap()->cas_by_another());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
    bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2092
    summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
    COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
    COMPILER2_PRESENT(DerivedPointerTable::set_active(false));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
    // adjust_roots() updates Universe::_intArrayKlassObj which is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
    // needed by the compaction for filling holes in the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
    adjust_roots();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
    compaction_start.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
    // Does the perm gen always have to be done serially because
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
    // klasses are used in the update of an object?
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  2104
    compact_perm(vmthread_cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
9178
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2106
    compact();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
    // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
    // done before resizing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
    post_compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
    // Let the size policy know we're done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
    size_policy->major_collection_end(old_gen->used_in_bytes(), gc_cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
    if (UseAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
      if (PrintAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
        gclog_or_tty->print("AdaptiveSizeStart: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
        gclog_or_tty->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
        gclog_or_tty->print_cr(" collection: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
                       heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
        if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
          gclog_or_tty->print("old_gen_capacity: %d young_gen_capacity: %d"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
            " perm_gen_capacity: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
            old_gen->capacity_in_bytes(), young_gen->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
            perm_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
      // Don't check if the size_policy is ready here.  Let
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
      // the size_policy check that internally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
          ((gc_cause != GCCause::_java_lang_system_gc) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
            UseAdaptiveSizePolicyWithSystemGC)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
        // Calculate optimal free space amounts
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
        assert(young_gen->max_size() >
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
          young_gen->from_space()->capacity_in_bytes() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
          young_gen->to_space()->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
          "Sizes of space in young gen are out-of-bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
        size_t max_eden_size = young_gen->max_size() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
          young_gen->from_space()->capacity_in_bytes() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
          young_gen->to_space()->capacity_in_bytes();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2142
        size_policy->compute_generation_free_space(
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2143
                              young_gen->used_in_bytes(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2144
                              young_gen->eden_space()->used_in_bytes(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2145
                              old_gen->used_in_bytes(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2146
                              perm_gen->used_in_bytes(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2147
                              young_gen->eden_space()->capacity_in_bytes(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2148
                              old_gen->max_gen_size(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2149
                              max_eden_size,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2150
                              true /* full gc*/,
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2151
                              gc_cause,
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  2152
                              heap->collector_policy());
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2153
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2154
        heap->resize_old_gen(
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2155
          size_policy->calculated_old_free_size_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
        // Don't resize the young generation at an major collection.  A
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
        // desired young generation size may have been calculated but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
        // resizing the young generation complicates the code because the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
        // resizing of the old generation may have moved the boundary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
        // between the young generation and the old generation.  Let the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
        // young generation resizing happen at the minor collections.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
      if (PrintAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
        gclog_or_tty->print_cr("AdaptiveSizeStop: collection: %d ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
                       heap->total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
    if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
      PSGCAdaptivePolicyCounters* const counters = heap->gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
      counters->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
      counters->update_old_capacity(old_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
      counters->update_young_capacity(young_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
    heap->resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
    // We collected the perm gen, so we'll resize it here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
    perm_gen->compute_new_size(pre_gc_values.perm_gen_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
    if (TraceGen1Time) accumulated_time()->stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
    if (PrintGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
      if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
        // No GC timestamp here.  This is after GC so it would be confusing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
        young_gen->print_used_change(pre_gc_values.young_gen_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
        old_gen->print_used_change(pre_gc_values.old_gen_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
        heap->print_heap_change(pre_gc_values.heap_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
        // Print perm gen last (print_heap_change() excludes the perm gen).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
        perm_gen->print_used_change(pre_gc_values.perm_gen_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
        heap->print_heap_change(pre_gc_values.heap_used());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
    // Track memory usage and detect low memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
    MemoryService::track_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
    heap->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2202
#ifdef ASSERT
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2203
  for (size_t i = 0; i < ParallelGCThreads + 1; ++i) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2204
    ParCompactionManager* const cm =
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2205
      ParCompactionManager::manager_array(int(i));
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2206
    assert(cm->marking_stack()->is_empty(),       "should be empty");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2207
    assert(cm->region_stack()->is_empty(),        "should be empty");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2208
    assert(cm->revisit_klass_stack()->is_empty(), "should be empty");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2209
  }
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2210
#endif // ASSERT
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2211
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
  if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
    HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
    gclog_or_tty->print(" VerifyAfterGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
    Universe::verify(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
  // Re-verify object start arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
  if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
      VerifyAfterGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
    old_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
    perm_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2225
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2226
    old_gen->object_space()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2227
    perm_gen->object_space()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2228
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  2229
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
  NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
  collection_exit.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
    Universe::print_heap_after_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
  if (PrintGCTaskTimeStamps) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
    gclog_or_tty->print_cr("VM-Thread " INT64_FORMAT " " INT64_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
                           INT64_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
                           marking_start.ticks(), compaction_start.ticks(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
                           collection_exit.ticks());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
    gc_task_manager()->print_task_time_stamps();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
  }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  2244
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
  2245
  heap->post_full_gc_dump();
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
  2246
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  2247
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  2248
  ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  2249
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
bool PSParallelCompact::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
                                             PSYoungGen* young_gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
                                             PSOldGen* old_gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  MutableSpace* const eden_space = young_gen->eden_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
  assert(!eden_space->is_empty(), "eden must be non-empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
  assert(young_gen->virtual_space()->alignment() ==
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
         old_gen->virtual_space()->alignment(), "alignments do not match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  if (!(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  // Both generations must be completely committed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  if (young_gen->virtual_space()->uncommitted_size() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
  if (old_gen->virtual_space()->uncommitted_size() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  // Figure out how much to take from eden.  Include the average amount promoted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
  // in the total; otherwise the next young gen GC will simply bail out to a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
  // full GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  const size_t alignment = old_gen->virtual_space()->alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  const size_t eden_used = eden_space->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
  const size_t promoted = (size_t)size_policy->avg_promoted()->padded_average();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
  const size_t absorb_size = align_size_up(eden_used + promoted, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  const size_t eden_capacity = eden_space->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  if (absorb_size >= eden_capacity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
    return false; // Must leave some space in eden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
  const size_t new_young_size = young_gen->capacity_in_bytes() - absorb_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
  if (new_young_size < young_gen->min_gen_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
    return false; // Respect young gen minimum size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
  if (TraceAdaptiveGCBoundary && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
    gclog_or_tty->print(" absorbing " SIZE_FORMAT "K:  "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
                        "eden " SIZE_FORMAT "K->" SIZE_FORMAT "K "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
                        "from " SIZE_FORMAT "K, to " SIZE_FORMAT "K "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
                        "young_gen " SIZE_FORMAT "K->" SIZE_FORMAT "K ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
                        absorb_size / K,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
                        eden_capacity / K, (eden_capacity - absorb_size) / K,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
                        young_gen->from_space()->used_in_bytes() / K,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
                        young_gen->to_space()->used_in_bytes() / K,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
                        young_gen->capacity_in_bytes() / K, new_young_size / K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  // Fill the unused part of the old gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  MutableSpace* const old_space = old_gen->object_space();
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2304
  HeapWord* const unused_start = old_space->top();
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2305
  size_t const unused_words = pointer_delta(old_space->end(), unused_start);
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2306
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2307
  if (unused_words > 0) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2308
    if (unused_words < CollectedHeap::min_fill_size()) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2309
      return false;  // If the old gen cannot be filled, must give up.
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2310
    }
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2311
    CollectedHeap::fill_with_objects(unused_start, unused_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
  // Take the live data from eden and set both top and end in the old gen to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
  // eden top.  (Need to set end because reset_after_change() mangles the region
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
  // from end to virtual_space->high() in debug builds).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
  HeapWord* const new_top = eden_space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  old_gen->virtual_space()->expand_into(young_gen->virtual_space(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
                                        absorb_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
  young_gen->reset_after_change();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  old_space->set_top(new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
  old_space->set_end(new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  old_gen->reset_after_change();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
  // Update the object start array for the filler object and the data from eden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
  ObjectStartArray* const start_array = old_gen->start_array();
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2327
  for (HeapWord* p = unused_start; p < new_top; p += oop(p)->size()) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2328
    start_array->allocate_block(p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
  // Could update the promoted average here, but it is not typically updated at
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
  // full GCs and the value to use is unclear.  Something like
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
  // cur_promoted_avg + absorb_size / number_of_scavenges_since_last_full_gc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
  size_policy->set_bytes_absorbed_from_eden(absorb_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
GCTaskManager* const PSParallelCompact::gc_task_manager() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
  assert(ParallelScavengeHeap::gc_task_manager() != NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
    "shouldn't return NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
  return ParallelScavengeHeap::gc_task_manager();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
void PSParallelCompact::marking_phase(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
                                      bool maximum_heap_compaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
  // Recursively traverse all live objects and mark them
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
  EventMark m("1 mark object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
  TraceTime tm("marking phase", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
  ParallelScavengeHeap* heap = gc_heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  uint parallel_gc_threads = heap->gc_task_manager()->workers();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2354
  TaskQueueSetSuper* qset = ParCompactionManager::region_array();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
  ParallelTaskTerminator terminator(parallel_gc_threads, qset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
  PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
  PSParallelCompact::FollowStackClosure follow_stack_closure(cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
    TraceTime tm_m("par mark", print_phases(), true, gclog_or_tty);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2363
diff changeset
  2362
    ParallelScavengeHeap::ParStrongRootsScope psrs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
    GCTaskQueue* q = GCTaskQueue::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::universe));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jni_handles));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
    // We scan the thread roots in parallel
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
    Threads::create_thread_roots_marking_tasks(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::object_synchronizer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::flat_profiler));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::management));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::system_dictionary));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmti));
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2363
diff changeset
  2375
    q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::code_cache));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
    if (parallel_gc_threads > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
      for (uint j = 0; j < parallel_gc_threads; j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
        q->enqueue(new StealMarkingTask(&terminator));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
    WaitForBarrierGCTask* fin = WaitForBarrierGCTask::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
    q->enqueue(fin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
    gc_task_manager()->add_list(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
    fin->wait_for();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
    // We have to release the barrier tasks!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
    WaitForBarrierGCTask::destroy(fin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
  // Process reference objects found during marking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
    TraceTime tm_r("reference processing", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
    if (ref_processor()->processing_is_mt()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
      RefProcTaskExecutor task_executor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
      ref_processor()->process_discovered_references(
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1408
diff changeset
  2400
        is_alive_closure(), &mark_and_push_closure, &follow_stack_closure,
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1408
diff changeset
  2401
        &task_executor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
      ref_processor()->process_discovered_references(
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1408
diff changeset
  2404
        is_alive_closure(), &mark_and_push_closure, &follow_stack_closure, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
  TraceTime tm_c("class unloading", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
  // Follow system dictionary roots and unload classes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
  bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
  // Follow code cache roots.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
  CodeCache::do_unloading(is_alive_closure(), &mark_and_push_closure,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
                          purged_class);
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 3916
diff changeset
  2415
  cm->follow_marking_stacks(); // Flush marking stack.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
  // Update subklass/sibling/implementor links of live klasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
  // revisit_klass_stack is used in follow_weak_klass_links().
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2419
  follow_weak_klass_links();
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2420
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2421
  // Revisit memoized MDO's and clear any unmarked weak refs
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2422
  follow_mdo_weak_refs();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
  2424
  // Visit interned string tables and delete unmarked oops
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
  StringTable::unlink(is_alive_closure());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
  2426
  // Clean up unreferenced symbols in symbol table.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
  2427
  SymbolTable::unlink();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 3916
diff changeset
  2429
  assert(cm->marking_stacks_empty(), "marking stacks should be empty");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
// This should be moved to the shared markSweep code!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
class PSAlwaysTrueClosure: public BoolObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
  void do_object(oop p) { ShouldNotReachHere(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
  bool do_object_b(oop p) { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
static PSAlwaysTrueClosure always_true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
void PSParallelCompact::adjust_roots() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
  // Adjust the pointers to reflect the new locations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
  EventMark m("3 adjust roots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
  TraceTime tm("adjust roots", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
  // General strong roots.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
  Universe::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
  JNIHandles::oops_do(adjust_root_pointer_closure());   // Global (strong) JNI handles
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2363
diff changeset
  2448
  Threads::oops_do(adjust_root_pointer_closure(), NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
  ObjectSynchronizer::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
  FlatProfiler::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
  Management::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
  JvmtiExport::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
  // SO_AllClasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
  SystemDictionary::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
  // Now adjust pointers in remaining weak roots.  (All of which should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
  // have been cleared if they pointed to non-surviving objects.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
  // Global (weak) JNI handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2459
  JNIHandles::weak_oops_do(&always_true, adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2460
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
  CodeCache::oops_do(adjust_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
  StringTable::oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
  ref_processor()->weak_oops_do(adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
  // Roots were visited so references into the young gen in roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
  // may have been scanned.  Process them also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
  // Should the reference processor have a span that excludes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
  // young gen objects?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  PSScavenge::reference_processor()->weak_oops_do(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
                                              adjust_root_pointer_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
void PSParallelCompact::compact_perm(ParCompactionManager* cm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
  EventMark m("4 compact perm");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
  TraceTime tm("compact perm gen", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
  // trace("4");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
  gc_heap()->perm_gen()->start_array()->reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
  move_and_update(cm, perm_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2481
void PSParallelCompact::enqueue_region_draining_tasks(GCTaskQueue* q,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2482
                                                      uint parallel_gc_threads)
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2483
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
  TraceTime tm("drain task setup", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
  const unsigned int task_count = MAX2(parallel_gc_threads, 1U);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  for (unsigned int j = 0; j < task_count; j++) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5918
diff changeset
  2488
    q->enqueue(new DrainStacksCompactionTask(j));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2491
  // Find all regions that are available (can be filled immediately) and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
  // distribute them to the thread stacks.  The iteration is done in reverse
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2493
  // order (high to low) so the regions will be removed in ascending order.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
  const ParallelCompactData& sd = PSParallelCompact::summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2497
  size_t fillable_regions = 0;   // A count for diagnostic purposes.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
  unsigned int which = 0;       // The worker thread number.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
  for (unsigned int id = to_space_id; id > perm_space_id; --id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
    SpaceInfo* const space_info = _space_info + id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
    MutableSpace* const space = space_info->space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
    HeapWord* const new_top = space_info->new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2505
    const size_t beg_region = sd.addr_to_region_idx(space_info->dense_prefix());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2506
    const size_t end_region =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2507
      sd.addr_to_region_idx(sd.region_align_up(new_top));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2508
    assert(end_region > 0, "perm gen cannot be empty");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2509
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2510
    for (size_t cur = end_region - 1; cur >= beg_region; --cur) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2511
      if (sd.region(cur)->claim_unsafe()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
        ParCompactionManager* cm = ParCompactionManager::manager_array(which);
5918
73b96456819a 6957084: simplify TaskQueue overflow handling
jcoomes
parents: 5702
diff changeset
  2513
        cm->push_region(cur);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
        if (TraceParallelOldGCCompactionPhase && Verbose) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2516
          const size_t count_mod_8 = fillable_regions & 7;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
          if (count_mod_8 == 0) gclog_or_tty->print("fillable: ");
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  2518
          gclog_or_tty->print(" " SIZE_FORMAT_W(7), cur);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
          if (count_mod_8 == 7) gclog_or_tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2522
        NOT_PRODUCT(++fillable_regions;)
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2523
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2524
        // Assign regions to threads in round-robin fashion.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
        if (++which == task_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
          which = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  if (TraceParallelOldGCCompactionPhase) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2533
    if (Verbose && (fillable_regions & 7) != 0) gclog_or_tty->cr();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2534
    gclog_or_tty->print_cr("%u initially fillable regions", fillable_regions);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
#define PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
void PSParallelCompact::enqueue_dense_prefix_tasks(GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
                                                    uint parallel_gc_threads) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
  TraceTime tm("dense prefix task setup", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
  ParallelCompactData& sd = PSParallelCompact::summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
  // Iterate over all the spaces adding tasks for updating
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2547
  // regions in the dense prefix.  Assume that 1 gc thread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
  // will work on opening the gaps and the remaining gc threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
  // will work on the dense prefix.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2550
  unsigned int space_id;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2551
  for (space_id = old_space_id; space_id < last_space_id; ++ space_id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
    HeapWord* const dense_prefix_end = _space_info[space_id].dense_prefix();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
    const MutableSpace* const space = _space_info[space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
    if (dense_prefix_end == space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
      // There is no dense prefix for this space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2560
    // The dense prefix is before this region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2561
    size_t region_index_end_dense_prefix =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2562
        sd.addr_to_region_idx(dense_prefix_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2563
    RegionData* const dense_prefix_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2564
      sd.region(region_index_end_dense_prefix);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
    assert(dense_prefix_end == space->end() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
           dense_prefix_cp->available() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
           dense_prefix_cp->claimed(),
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2568
           "The region after the dense prefix should always be ready to fill");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2569
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2570
    size_t region_index_start = sd.addr_to_region_idx(space->bottom());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
    // Is there dense prefix work?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2573
    size_t total_dense_prefix_regions =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2574
      region_index_end_dense_prefix - region_index_start;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2575
    // How many regions of the dense prefix should be given to
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
    // each thread?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2577
    if (total_dense_prefix_regions > 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
      uint tasks_for_dense_prefix = 1;
9178
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2579
      if (total_dense_prefix_regions <=
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2580
          (parallel_gc_threads * PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING)) {
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2581
        // Don't over partition.  This assumes that
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2582
        // PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING is a small integer value
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2583
        // so there are not many regions to process.
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2584
        tasks_for_dense_prefix = parallel_gc_threads;
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2585
      } else {
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2586
        // Over partition
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2587
        tasks_for_dense_prefix = parallel_gc_threads *
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2588
          PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
      }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2590
      size_t regions_per_thread = total_dense_prefix_regions /
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
        tasks_for_dense_prefix;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2592
      // Give each thread at least 1 region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2593
      if (regions_per_thread == 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2594
        regions_per_thread = 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
      for (uint k = 0; k < tasks_for_dense_prefix; k++) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2598
        if (region_index_start >= region_index_end_dense_prefix) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
        }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2601
        // region_index_end is not processed
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2602
        size_t region_index_end = MIN2(region_index_start + regions_per_thread,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2603
                                       region_index_end_dense_prefix);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2604
        q->enqueue(new UpdateDensePrefixTask(SpaceId(space_id),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2605
                                             region_index_start,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2606
                                             region_index_end));
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2607
        region_index_start = region_index_end;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
    // This gets any part of the dense prefix that did not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
    // fit evenly.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2612
    if (region_index_start < region_index_end_dense_prefix) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2613
      q->enqueue(new UpdateDensePrefixTask(SpaceId(space_id),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2614
                                           region_index_start,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2615
                                           region_index_end_dense_prefix));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
    }
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2617
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2620
void PSParallelCompact::enqueue_region_stealing_tasks(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
                                     GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
                                     ParallelTaskTerminator* terminator_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
                                     uint parallel_gc_threads) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
  TraceTime tm("steal task setup", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2626
  // Once a thread has drained it's stack, it should try to steal regions from
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
  // other threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
  if (parallel_gc_threads > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
    for (uint j = 0; j < parallel_gc_threads; j++) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2630
      q->enqueue(new StealRegionCompactionTask(terminator_ptr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
void PSParallelCompact::compact() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
  EventMark m("5 compact");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
  // trace("5");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
  TraceTime tm("compaction phase", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
  ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
  old_gen->start_array()->reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
  uint parallel_gc_threads = heap->gc_task_manager()->workers();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2645
  TaskQueueSetSuper* qset = ParCompactionManager::region_array();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
  ParallelTaskTerminator terminator(parallel_gc_threads, qset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
  GCTaskQueue* q = GCTaskQueue::create();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2649
  enqueue_region_draining_tasks(q, parallel_gc_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
  enqueue_dense_prefix_tasks(q, parallel_gc_threads);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2651
  enqueue_region_stealing_tasks(q, &terminator, parallel_gc_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
    TraceTime tm_pc("par compact", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
    WaitForBarrierGCTask* fin = WaitForBarrierGCTask::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
    q->enqueue(fin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
    gc_task_manager()->add_list(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
    fin->wait_for();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
    // We have to release the barrier tasks!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    WaitForBarrierGCTask::destroy(fin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
#ifdef  ASSERT
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2667
    // Verify that all regions have been processed before the deferred updates.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
    // Note that perm_space_id is skipped; this type of verification is not
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2669
    // valid until the perm gen is compacted by regions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
    for (unsigned int id = old_space_id; id < last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
      verify_complete(SpaceId(id));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
    // Update the deferred objects, if any.  Any compaction manager can be used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
    TraceTime tm_du("deferred updates", print_phases(), true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
    ParCompactionManager* cm = ParCompactionManager::manager_array(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
    for (unsigned int id = old_space_id; id < last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
      update_deferred_objects(cm, SpaceId(id));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
void PSParallelCompact::verify_complete(SpaceId space_id) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2688
  // All Regions between space bottom() to new_top() should be marked as filled
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2689
  // and all Regions between new_top() and top() should be available (i.e.,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
  // should have been emptied).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  SpaceInfo si = _space_info[space_id];
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2693
  HeapWord* new_top_addr = sd.region_align_up(si.new_top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2694
  HeapWord* old_top_addr = sd.region_align_up(si.space()->top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2695
  const size_t beg_region = sd.addr_to_region_idx(si.space()->bottom());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2696
  const size_t new_top_region = sd.addr_to_region_idx(new_top_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2697
  const size_t old_top_region = sd.addr_to_region_idx(old_top_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
  bool issued_a_warning = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2701
  size_t cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2702
  for (cur_region = beg_region; cur_region < new_top_region; ++cur_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2703
    const RegionData* const c = sd.region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
    if (!c->completed()) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2705
      warning("region " SIZE_FORMAT " not filled:  "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
              "destination_count=" SIZE_FORMAT,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2707
              cur_region, c->destination_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
      issued_a_warning = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2712
  for (cur_region = new_top_region; cur_region < old_top_region; ++cur_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2713
    const RegionData* const c = sd.region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
    if (!c->available()) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2715
      warning("region " SIZE_FORMAT " not empty:   "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
              "destination_count=" SIZE_FORMAT,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2717
              cur_region, c->destination_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
      issued_a_warning = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
  if (issued_a_warning) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2723
    print_region_ranges();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
void
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2729
PSParallelCompact::follow_weak_klass_links() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
  // All klasses on the revisit stack are marked at this point.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
  // Update and follow all subklass, sibling and implementor links.
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2732
  if (PrintRevisitStats) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2733
    gclog_or_tty->print_cr("#classes in system dictionary = %d",
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2734
                           SystemDictionary::number_of_classes());
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2735
  }
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2736
  for (uint i = 0; i < ParallelGCThreads + 1; i++) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
    ParCompactionManager* cm = ParCompactionManager::manager_array(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
    KeepAliveClosure keep_alive_closure(cm);
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2739
    Stack<Klass*>* const rks = cm->revisit_klass_stack();
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2740
    if (PrintRevisitStats) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2741
      gclog_or_tty->print_cr("Revisit klass stack[%u] length = " SIZE_FORMAT,
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2742
                             i, rks->size());
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2743
    }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2744
    while (!rks->is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2745
      Klass* const k = rks->pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2746
      k->follow_weak_klass_links(is_alive_closure(), &keep_alive_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
    }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2748
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 3916
diff changeset
  2749
    cm->follow_marking_stacks();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
PSParallelCompact::revisit_weak_klass_link(ParCompactionManager* cm, Klass* k) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
  cm->revisit_klass_stack()->push(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2758
void PSParallelCompact::revisit_mdo(ParCompactionManager* cm, DataLayout* p) {
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2759
  cm->revisit_mdo_stack()->push(p);
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2760
}
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2761
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2762
void PSParallelCompact::follow_mdo_weak_refs() {
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2763
  // All strongly reachable oops have been marked at this point;
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2764
  // we can visit and clear any weak references from MDO's which
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2765
  // we memoized during the strong marking phase.
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2766
  if (PrintRevisitStats) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2767
    gclog_or_tty->print_cr("#classes in system dictionary = %d",
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2768
                           SystemDictionary::number_of_classes());
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2769
  }
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2770
  for (uint i = 0; i < ParallelGCThreads + 1; i++) {
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2771
    ParCompactionManager* cm = ParCompactionManager::manager_array(i);
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2772
    Stack<DataLayout*>* rms = cm->revisit_mdo_stack();
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2773
    if (PrintRevisitStats) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2774
      gclog_or_tty->print_cr("Revisit MDO stack[%u] size = " SIZE_FORMAT,
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2775
                             i, rms->size());
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2776
    }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2777
    while (!rms->is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2778
      rms->pop()->follow_weak_refs(is_alive_closure());
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2779
    }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  2780
5076
8b74a4b60b31 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 3916
diff changeset
  2781
    cm->follow_marking_stacks();
3696
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2782
  }
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2783
}
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2784
9e5d9b5e1049 4957990: Perm heap bloat in JVM
ysr
parents: 2363
diff changeset
  2785
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
#ifdef VALIDATE_MARK_SWEEP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
  2788
void PSParallelCompact::track_adjusted_pointer(void* p, bool isroot) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
  if (!ValidateMarkSweep)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
  if (!isroot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
    if (_pointer_tracking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
      guarantee(_adjusted_pointers->contains(p), "should have seen this pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
      _adjusted_pointers->remove(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
    ptrdiff_t index = _root_refs_stack->find(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
    if (index != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
      int l = _root_refs_stack->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
      if (l > 0 && l - 1 != index) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
  2802
        void* last = _root_refs_stack->pop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
        assert(last != p, "should be different");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
        _root_refs_stack->at_put(index, last);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
        _root_refs_stack->remove(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
  2813
void PSParallelCompact::check_adjust_pointer(void* p) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
  _adjusted_pointers->push(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
class AdjusterTracker: public OopClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
  AdjusterTracker() {};
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
  2821
  void do_oop(oop* o)         { PSParallelCompact::check_adjust_pointer(o); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
  2822
  void do_oop(narrowOop* o)   { PSParallelCompact::check_adjust_pointer(o); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
void PSParallelCompact::track_interior_pointers(oop obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
    _adjusted_pointers->clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
    _pointer_tracking = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
    AdjusterTracker checker;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
    obj->oop_iterate(&checker);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
void PSParallelCompact::check_interior_pointers() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
    _pointer_tracking = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
    guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
void PSParallelCompact::reset_live_oop_tracking(bool at_perm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
    guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
    _live_oops_index = at_perm ? _live_oops_index_at_perm : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
void PSParallelCompact::register_live_oop(oop p, size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
    _live_oops->push(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
    _live_oops_size->push(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
    _live_oops_index++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
void PSParallelCompact::validate_live_oop(oop p, size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
    oop obj = _live_oops->at((int)_live_oops_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
    guarantee(obj == p, "should be the same object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
    guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
    _live_oops_index++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
void PSParallelCompact::live_oop_moved_to(HeapWord* q, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
                                  HeapWord* compaction_top) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
  assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
         "should be moved to forwarded location");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
  if (ValidateMarkSweep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
    PSParallelCompact::validate_live_oop(oop(q), size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
    _live_oops_moved_to->push(oop(compaction_top));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
  if (RecordMarkSweepCompaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
    _cur_gc_live_oops->push(q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
    _cur_gc_live_oops_moved_to->push(compaction_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
    _cur_gc_live_oops_size->push(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
void PSParallelCompact::compaction_complete() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
  if (RecordMarkSweepCompaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
    GrowableArray<HeapWord*>* _tmp_live_oops          = _cur_gc_live_oops;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2889
    GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
    GrowableArray<size_t>   * _tmp_live_oops_size     = _cur_gc_live_oops_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
    _cur_gc_live_oops           = _last_gc_live_oops;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
    _cur_gc_live_oops_moved_to  = _last_gc_live_oops_moved_to;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
    _cur_gc_live_oops_size      = _last_gc_live_oops_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
    _last_gc_live_oops          = _tmp_live_oops;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
    _last_gc_live_oops_moved_to = _tmp_live_oops_moved_to;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
    _last_gc_live_oops_size     = _tmp_live_oops_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
void PSParallelCompact::print_new_location_of_heap_address(HeapWord* q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
  if (!RecordMarkSweepCompaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
    tty->print_cr("Requires RecordMarkSweepCompaction to be enabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
  if (_last_gc_live_oops == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
    tty->print_cr("No compaction information gathered yet");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
  for (int i = 0; i < _last_gc_live_oops->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
    HeapWord* old_oop = _last_gc_live_oops->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    size_t    sz      = _last_gc_live_oops_size->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    if (old_oop <= q && q < (old_oop + sz)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
      HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
      size_t offset = (q - old_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
      tty->print_cr("Address " PTR_FORMAT, q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
      tty->print_cr(" Was in oop " PTR_FORMAT ", size %d, at offset %d", old_oop, sz, offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
      tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
  tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
#endif //VALIDATE_MARK_SWEEP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2930
// Update interior oops in the ranges of regions [beg_region, end_region).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
                                                       SpaceId space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2934
                                                       size_t beg_region,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2935
                                                       size_t end_region) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
  ParMarkBitMap* const mbm = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2939
  HeapWord* beg_addr = sd.region_to_addr(beg_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2940
  HeapWord* const end_addr = sd.region_to_addr(end_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2941
  assert(beg_region <= end_region, "bad region range");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  assert(end_addr <= dense_prefix(space_id), "not in the dense prefix");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
#ifdef  ASSERT
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2945
  // Claim the regions to avoid triggering an assert when they are marked as
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
  // filled.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2947
  for (size_t claim_region = beg_region; claim_region < end_region; ++claim_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2948
    assert(sd.region(claim_region)->claim_unsafe(), "claim() failed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
  if (beg_addr != space(space_id)->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
    // Find the first live object or block of dead space that *starts* in this
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2954
    // range of regions.  If a partial object crosses onto the region, skip it;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2955
    // it will be marked for 'deferred update' when the object head is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2956
    // processed.  If dead space crosses onto the region, it is also skipped; it
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2957
    // will be filled when the prior region is processed.  If neither of those
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2958
    // apply, the first word in the region is the start of a live object or dead
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2959
    // space.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
    assert(beg_addr > space(space_id)->bottom(), "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2961
    const RegionData* const cp = sd.region(beg_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
    if (cp->partial_obj_size() != 0) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2963
      beg_addr = sd.partial_obj_end(beg_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
    } else if (dead_space_crosses_boundary(cp, mbm->addr_to_bit(beg_addr))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
      beg_addr = mbm->find_obj_beg(beg_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
  if (beg_addr < end_addr) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2970
    // A live object or block of dead space starts in this range of Regions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
     HeapWord* const dense_prefix_end = dense_prefix(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
    // Create closures and iterate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
    UpdateOnlyClosure update_closure(mbm, cm, space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
    FillClosure fill_closure(cm, space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
    ParMarkBitMap::IterationStatus status;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
    status = mbm->iterate(&update_closure, &fill_closure, beg_addr, end_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
                          dense_prefix_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
    if (status == ParMarkBitMap::incomplete) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
      update_closure.do_addr(update_closure.source());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2984
  // Mark the regions as filled.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2985
  RegionData* const beg_cp = sd.region(beg_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2986
  RegionData* const end_cp = sd.region(end_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2987
  for (RegionData* cp = beg_cp; cp < end_cp; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
    cp->set_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
// Return the SpaceId for the space containing addr.  If addr is not in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
// heap, last_space_id is returned.  In debug mode it expects the address to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
// in the heap and asserts such.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
PSParallelCompact::SpaceId PSParallelCompact::space_id(HeapWord* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
  assert(Universe::heap()->is_in_reserved(addr), "addr not in the heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
  for (unsigned int id = perm_space_id; id < last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
    if (_space_info[id].space()->contains(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
      return SpaceId(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
  assert(false, "no space contains the addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
  return last_space_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
void PSParallelCompact::update_deferred_objects(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
                                                SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
  assert(id < last_space_id, "bad space id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
  const SpaceInfo* const space_info = _space_info + id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  ObjectStartArray* const start_array = space_info->start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  const MutableSpace* const space = space_info->space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
  assert(space_info->dense_prefix() >= space->bottom(), "dense_prefix not set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
  HeapWord* const beg_addr = space_info->dense_prefix();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3019
  HeapWord* const end_addr = sd.region_align_up(space_info->new_top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3020
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3021
  const RegionData* const beg_region = sd.addr_to_region_ptr(beg_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3022
  const RegionData* const end_region = sd.addr_to_region_ptr(end_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3023
  const RegionData* cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3024
  for (cur_region = beg_region; cur_region < end_region; ++cur_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3025
    HeapWord* const addr = cur_region->deferred_obj_addr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
    if (addr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
      if (start_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
        start_array->allocate_block(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
      oop(addr)->update_contents(cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
      assert(oop(addr)->is_oop_or_null(), "should be an oop now");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
// Skip over count live words starting from beg, and return the address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
// next live word.  Unless marked, the word corresponding to beg is assumed to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
// be dead.  Callers must either ensure beg does not correspond to the middle of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
// an object, or account for those live words in some other way.  Callers must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
// also ensure that there are enough live words in the range [beg, end) to skip.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
PSParallelCompact::skip_live_words(HeapWord* beg, HeapWord* end, size_t count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
  assert(count > 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
  ParMarkBitMap* m = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
  idx_t bits_to_skip = m->words_to_bits(count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
  idx_t cur_beg = m->addr_to_bit(beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
  const idx_t search_end = BitMap::word_align_up(m->addr_to_bit(end));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
    cur_beg = m->find_obj_beg(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
    idx_t cur_end = m->find_obj_end(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
    const size_t obj_bits = cur_end - cur_beg + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
    if (obj_bits > bits_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
      return m->bit_to_addr(cur_beg + bits_to_skip);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
    bits_to_skip -= obj_bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
    cur_beg = cur_end + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
  } while (bits_to_skip > 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
  // Skipping the desired number of words landed just past the end of an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
  // Find the start of the next object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
  cur_beg = m->find_obj_beg(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
  assert(cur_beg < m->addr_to_bit(end), "not enough live words to skip");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
  return m->bit_to_addr(cur_beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3069
HeapWord* PSParallelCompact::first_src_addr(HeapWord* const dest_addr,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3070
                                            SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3071
                                            size_t src_region_idx)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
{
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3073
  assert(summary_data().is_region_aligned(dest_addr), "not aligned");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3074
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3075
  const SplitInfo& split_info = _space_info[src_space_id].split_info();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3076
  if (split_info.dest_region_addr() == dest_addr) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3077
    // The partial object ending at the split point contains the first word to
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3078
    // be copied to dest_addr.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3079
    return split_info.first_src_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3080
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3081
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3082
  const ParallelCompactData& sd = summary_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
  ParMarkBitMap* const bitmap = mark_bitmap();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3084
  const size_t RegionSize = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3085
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3086
  assert(sd.is_region_aligned(dest_addr), "not aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3087
  const RegionData* const src_region_ptr = sd.region(src_region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3088
  const size_t partial_obj_size = src_region_ptr->partial_obj_size();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3089
  HeapWord* const src_region_destination = src_region_ptr->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3090
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3091
  assert(dest_addr >= src_region_destination, "wrong src region");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3092
  assert(src_region_ptr->data_size() > 0, "src region cannot be empty");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3093
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3094
  HeapWord* const src_region_beg = sd.region_to_addr(src_region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3095
  HeapWord* const src_region_end = src_region_beg + RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3096
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3097
  HeapWord* addr = src_region_beg;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3098
  if (dest_addr == src_region_destination) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3099
    // Return the first live word in the source region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
    if (partial_obj_size == 0) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3101
      addr = bitmap->find_obj_beg(addr, src_region_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3102
      assert(addr < src_region_end, "no objects start in src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
    return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
  // Must skip some live data.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3108
  size_t words_to_skip = dest_addr - src_region_destination;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3109
  assert(src_region_ptr->data_size() > words_to_skip, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
  if (partial_obj_size >= words_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
    // All the live words to skip are part of the partial object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
    addr += words_to_skip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
    if (partial_obj_size == words_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
      // Find the first live word past the partial object.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3116
      addr = bitmap->find_obj_beg(addr, src_region_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3117
      assert(addr < src_region_end, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
    return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
  // Skip over the partial object (if any).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
  if (partial_obj_size != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
    words_to_skip -= partial_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
    addr += partial_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3128
  // Skip over live words due to objects that start in the region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3129
  addr = skip_live_words(addr, src_region_end, words_to_skip);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3130
  assert(addr < src_region_end, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
  return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
void PSParallelCompact::decrement_destination_counts(ParCompactionManager* cm,
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3135
                                                     SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3136
                                                     size_t beg_region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
                                                     HeapWord* end_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
  ParallelCompactData& sd = summary_data();
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3140
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3141
#ifdef ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3142
  MutableSpace* const src_space = _space_info[src_space_id].space();
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3143
  HeapWord* const beg_addr = sd.region_to_addr(beg_region);
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3144
  assert(src_space->contains(beg_addr) || beg_addr == src_space->end(),
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3145
         "src_space_id does not match beg_addr");
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3146
  assert(src_space->contains(end_addr) || end_addr == src_space->end(),
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3147
         "src_space_id does not match end_addr");
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3148
#endif // #ifdef ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3149
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3150
  RegionData* const beg = sd.region(beg_region);
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3151
  RegionData* const end = sd.addr_to_region_ptr(sd.region_align_up(end_addr));
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3152
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3153
  // Regions up to new_top() are enqueued if they become available.
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3154
  HeapWord* const new_top = _space_info[src_space_id].new_top();
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3155
  RegionData* const enqueue_end =
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3156
    sd.addr_to_region_ptr(sd.region_align_up(new_top));
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3157
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3158
  for (RegionData* cur = beg; cur < end; ++cur) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3159
    assert(cur->data_size() > 0, "region must have live data");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
    cur->decrement_destination_count();
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3161
    if (cur < enqueue_end && cur->available() && cur->claim()) {
5918
73b96456819a 6957084: simplify TaskQueue overflow handling
jcoomes
parents: 5702
diff changeset
  3162
      cm->push_region(sd.region(cur));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3167
size_t PSParallelCompact::next_src_region(MoveAndUpdateClosure& closure,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3168
                                          SpaceId& src_space_id,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3169
                                          HeapWord*& src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3170
                                          HeapWord* end_addr)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3172
  typedef ParallelCompactData::RegionData RegionData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
  ParallelCompactData& sd = PSParallelCompact::summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3175
  const size_t region_size = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3176
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3177
  size_t src_region_idx = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3178
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3179
  // Skip empty regions (if any) up to the top of the space.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3180
  HeapWord* const src_aligned_up = sd.region_align_up(end_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3181
  RegionData* src_region_ptr = sd.addr_to_region_ptr(src_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3182
  HeapWord* const top_aligned_up = sd.region_align_up(src_space_top);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3183
  const RegionData* const top_region_ptr =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3184
    sd.addr_to_region_ptr(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3185
  while (src_region_ptr < top_region_ptr && src_region_ptr->data_size() == 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3186
    ++src_region_ptr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3189
  if (src_region_ptr < top_region_ptr) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3190
    // The next source region is in the current space.  Update src_region_idx
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3191
    // and the source address to match src_region_ptr.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3192
    src_region_idx = sd.region(src_region_ptr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3193
    HeapWord* const src_region_addr = sd.region_to_addr(src_region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3194
    if (src_region_addr > closure.source()) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3195
      closure.set_source(src_region_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
    }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3197
    return src_region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3200
  // Switch to a new source space and find the first non-empty region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
  unsigned int space_id = src_space_id + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
  assert(space_id < last_space_id, "not enough spaces");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
  HeapWord* const destination = closure.destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
    MutableSpace* space = _space_info[space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
    HeapWord* const bottom = space->bottom();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3209
    const RegionData* const bottom_cp = sd.addr_to_region_ptr(bottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
    // Iterate over the spaces that do not compact into themselves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
    if (bottom_cp->destination() != bottom) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3213
      HeapWord* const top_aligned_up = sd.region_align_up(space->top());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3214
      const RegionData* const top_cp = sd.addr_to_region_ptr(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3215
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3216
      for (const RegionData* src_cp = bottom_cp; src_cp < top_cp; ++src_cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
        if (src_cp->live_obj_size() > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
          // Found it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
          assert(src_cp->destination() == destination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
                 "first live obj in the space must match the destination");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
          assert(src_cp->partial_obj_size() == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
                 "a space cannot begin with a partial obj");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
          src_space_id = SpaceId(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
          src_space_top = space->top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3226
          const size_t src_region_idx = sd.region(src_cp);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3227
          closure.set_source(sd.region_to_addr(src_region_idx));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3228
          return src_region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
          assert(src_cp->data_size() == 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  } while (++space_id < last_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3236
  assert(false, "no source region was found");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3240
void PSParallelCompact::fill_region(ParCompactionManager* cm, size_t region_idx)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
  typedef ParMarkBitMap::IterationStatus IterationStatus;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3243
  const size_t RegionSize = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  ParMarkBitMap* const bitmap = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3246
  RegionData* const region_ptr = sd.region(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  // Get the items needed to construct the closure.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3249
  HeapWord* dest_addr = sd.region_to_addr(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
  SpaceId dest_space_id = space_id(dest_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
  ObjectStartArray* start_array = _space_info[dest_space_id].start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
  HeapWord* new_top = _space_info[dest_space_id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
  assert(dest_addr < new_top, "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3254
  const size_t words = MIN2(pointer_delta(new_top, dest_addr), RegionSize);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3255
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3256
  // Get the source region and related info.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3257
  size_t src_region_idx = region_ptr->source_region();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3258
  SpaceId src_space_id = space_id(sd.region_to_addr(src_region_idx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
  HeapWord* src_space_top = _space_info[src_space_id].space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
  MoveAndUpdateClosure closure(bitmap, cm, start_array, dest_addr, words);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  3262
  closure.set_source(first_src_addr(dest_addr, src_space_id, src_region_idx));
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3263
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3264
  // Adjust src_region_idx to prepare for decrementing destination counts (the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3265
  // destination count is not decremented when a region is copied to itself).
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3266
  if (src_region_idx == region_idx) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3267
    src_region_idx += 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
  if (bitmap->is_unmarked(closure.source())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
    // The first source word is in the middle of an object; copy the remainder
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
    // of the object or as much as will fit.  The fact that pointer updates were
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
    // deferred will be noted when the object header is processed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
    HeapWord* const old_src_addr = closure.source();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
    closure.copy_partial_obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
    if (closure.is_full()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3277
      decrement_destination_counts(cm, src_space_id, src_region_idx,
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3278
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3279
      region_ptr->set_deferred_obj_addr(NULL);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3280
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3284
    HeapWord* const end_addr = sd.region_align_down(closure.source());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3285
    if (sd.region_align_down(old_src_addr) != end_addr) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3286
      // The partial object was copied from more than one source region.
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3287
      decrement_destination_counts(cm, src_space_id, src_region_idx, end_addr);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3288
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3289
      // Move to the next source region, possibly switching spaces as well.  All
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
      // args except end_addr may be modified.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3291
      src_region_idx = next_src_region(closure, src_space_id, src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3292
                                       end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
    HeapWord* const cur_addr = closure.source();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3298
    HeapWord* const end_addr = MIN2(sd.region_align_up(cur_addr + 1),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
                                    src_space_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
    IterationStatus status = bitmap->iterate(&closure, cur_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
    if (status == ParMarkBitMap::incomplete) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3303
      // The last obj that starts in the source region does not end in the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3304
      // region.
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 5343
diff changeset
  3305
      assert(closure.source() < end_addr, "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3306
      HeapWord* const obj_beg = closure.source();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
      HeapWord* const range_end = MIN2(obj_beg + closure.words_remaining(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
                                       src_space_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
      HeapWord* const obj_end = bitmap->find_obj_end(obj_beg, range_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
      if (obj_end < range_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
        // The end was found; the entire object will fit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
        status = closure.do_addr(obj_beg, bitmap->obj_size(obj_beg, obj_end));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
        assert(status != ParMarkBitMap::would_overflow, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
        // The end was not found; the object will not fit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
        assert(range_end < src_space_top, "obj cannot cross space boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
        status = ParMarkBitMap::would_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
    if (status == ParMarkBitMap::would_overflow) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
      // The last object did not fit.  Note that interior oop updates were
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3323
      // deferred, then copy enough of the object to fill the region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3324
      region_ptr->set_deferred_obj_addr(closure.destination());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
      status = closure.copy_until_full(); // copies from closure.source()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3327
      decrement_destination_counts(cm, src_space_id, src_region_idx,
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3328
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3329
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
    if (status == ParMarkBitMap::full) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3334
      decrement_destination_counts(cm, src_space_id, src_region_idx,
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3335
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3336
      region_ptr->set_deferred_obj_addr(NULL);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3337
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3341
    decrement_destination_counts(cm, src_space_id, src_region_idx, end_addr);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3342
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3343
    // Move to the next source region, possibly switching spaces as well.  All
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
    // args except end_addr may be modified.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3345
    src_region_idx = next_src_region(closure, src_space_id, src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3346
                                     end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  } while (true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
PSParallelCompact::move_and_update(ParCompactionManager* cm, SpaceId space_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
  const MutableSpace* sp = space(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
  if (sp->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
  ParallelCompactData& sd = PSParallelCompact::summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
  ParMarkBitMap* const bitmap = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
  HeapWord* const dp_addr = dense_prefix(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
  HeapWord* beg_addr = sp->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
  HeapWord* end_addr = sp->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
  assert(beg_addr <= dp_addr && dp_addr <= end_addr, "bad dense prefix");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  if (cm->should_verify_only()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
    VerifyUpdateClosure verify_update(cm, sp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
    bitmap->iterate(&verify_update, beg_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
  if (cm->should_reset_only()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
    ResetObjectsClosure reset_objects(cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
    bitmap->iterate(&reset_objects, beg_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3378
  const size_t beg_region = sd.addr_to_region_idx(beg_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3379
  const size_t dp_region = sd.addr_to_region_idx(dp_addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3380
  if (beg_region < dp_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3381
    update_and_deadwood_in_dense_prefix(cm, space_id, beg_region, dp_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3384
  // The destination of the first live object that starts in the region is one
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3385
  // past the end of the partial object entering the region (if any).
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3386
  HeapWord* const dest_addr = sd.partial_obj_end(dp_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  HeapWord* const new_top = _space_info[space_id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  assert(new_top >= dest_addr, "bad new_top value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
  const size_t words = pointer_delta(new_top, dest_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
  if (words > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
    ObjectStartArray* start_array = _space_info[space_id].start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
    MoveAndUpdateClosure closure(bitmap, cm, start_array, dest_addr, words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
    ParMarkBitMap::IterationStatus status;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
    status = bitmap->iterate(&closure, dest_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
    assert(status == ParMarkBitMap::full, "iteration not complete");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
    assert(bitmap->find_obj_beg(closure.source(), end_addr) == end_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
           "live objects skipped because closure is full");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
jlong PSParallelCompact::millis_since_last_gc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
  jlong ret_val = os::javaTimeMillis() - _time_of_last_gc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
  // XXX See note in genCollectedHeap::millis_since_last_gc().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
  if (ret_val < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
    NOT_PRODUCT(warning("time warp: %d", ret_val);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
  return ret_val;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
void PSParallelCompact::reset_millis_since_last_gc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
  _time_of_last_gc = os::javaTimeMillis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
ParMarkBitMap::IterationStatus MoveAndUpdateClosure::copy_until_full()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
  if (source() != destination()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3420
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
    Copy::aligned_conjoint_words(source(), destination(), words_remaining());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
  update_state(words_remaining());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
  assert(is_full(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
  return ParMarkBitMap::full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
void MoveAndUpdateClosure::copy_partial_obj()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
  size_t words = words_remaining();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
  HeapWord* const range_end = MIN2(source() + words, bitmap()->region_end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  HeapWord* const end_addr = bitmap()->find_obj_end(source(), range_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
  if (end_addr < range_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
    words = bitmap()->obj_size(source(), end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
  // This test is necessary; if omitted, the pointer updates to a partial object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
  // that crosses the dense prefix boundary could be overwritten.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  if (source() != destination()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3441
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
    Copy::aligned_conjoint_words(source(), destination(), words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
  update_state(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
  assert(destination() != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
  assert(bitmap()->obj_size(addr) == words, "bad size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  _source = addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
  assert(PSParallelCompact::summary_data().calc_new_pointer(source()) ==
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
         destination(), "wrong destination");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
  if (words > words_remaining()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
    return ParMarkBitMap::would_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
  // The start_array must be updated even if the object is not moving.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
  if (_start_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
    _start_array->allocate_block(destination());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
  if (destination() != source()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3466
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
    Copy::aligned_conjoint_words(source(), destination(), words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
  oop moved_oop = (oop) destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
  moved_oop->update_contents(compaction_manager());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
  assert(moved_oop->is_oop_or_null(), "Object should be whole at this point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
  update_state(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  assert(destination() == (HeapWord*)moved_oop + moved_oop->size(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
  return is_full() ? ParMarkBitMap::full : ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
UpdateOnlyClosure::UpdateOnlyClosure(ParMarkBitMap* mbm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
                                     ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
                                     PSParallelCompact::SpaceId space_id) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  ParMarkBitMapClosure(mbm, cm),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  _space_id(space_id),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
  _start_array(PSParallelCompact::start_array(space_id))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
// Updates the references in the object to their new values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
UpdateOnlyClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
  do_addr(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
  return ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
// Verify the new location using the forwarding pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
// from MarkSweep::mark_sweep_phase2().  Set the mark_word
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
// to the initial value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
PSParallelCompact::VerifyUpdateClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
  // The second arg (words) is not used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
  oop obj = (oop) addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
  HeapWord* forwarding_ptr = (HeapWord*) obj->mark()->decode_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
  HeapWord* new_pointer = summary_data().calc_new_pointer(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
  if (forwarding_ptr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
    // The object is dead or not moving.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
    assert(bitmap()->is_unmarked(obj) || (new_pointer == (HeapWord*) obj),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
           "Object liveness is wrong.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
    return ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
  }
9178
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  3510
  assert(HeapMaximumCompactionInterval > 1 || MarkSweepAlwaysCompactCount > 1 ||
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  3511
         forwarding_ptr == new_pointer, "new location is incorrect");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
  return ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
// Reset objects modified for debug checking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
PSParallelCompact::ResetObjectsClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
  // The second arg (words) is not used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
  oop obj = (oop) addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
  obj->init_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
  return ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
// Prepare for compaction.  This method is executed once
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
// (i.e., by a single thread) before compaction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
// Save the updated location of the intArrayKlassObj for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
// filling holes in the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
void PSParallelCompact::compact_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
  _updated_int_array_klass_obj = (klassOop)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
    summary_data().calc_new_pointer(Universe::intArrayKlassObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532