src/hotspot/share/gc/parallel/psParallelCompact.cpp
author stefank
Mon, 25 Nov 2019 12:31:39 +0100
changeset 59249 29b0d0b61615
parent 59008 333c2b653434
permissions -rw-r--r--
8234737: Harmonize parameter order in Atomic - add Reviewed-by: rehn, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
53536
482109fae02b 8213229: Investigate treating StringTable as weak in young collections
tschatzl
parents: 53117
diff changeset
     2
 * Copyright (c) 2005, 2019, 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"
42650
1f304d0c888b 8171008: Integrate AOT compiler into JDK
kvn
parents: 42638
diff changeset
    26
#include "aot/aotLoader.hpp"
51959
db0c3952de52 8209645: Split ClassLoaderData and ClassLoaderDataGraph into separate files
coleenp
parents: 51801
diff changeset
    27
#include "classfile/classLoaderDataGraph.hpp"
50752
9d62da00bf15 8204540: Automatic oop closure devirtualization
stefank
parents: 50606
diff changeset
    28
#include "classfile/javaClasses.inline.hpp"
24426
0a69c8cdfca9 8038654: Separate SymbolTable and StringTable code
gziemski
parents: 24092
diff changeset
    29
#include "classfile/stringTable.hpp"
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33230
diff changeset
    30
#include "classfile/symbolTable.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    31
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    32
#include "code/codeCache.hpp"
54678
93f09ca4a7f8 8198505: Remove CollectorPolicy and its subclasses
stefank
parents: 54669
diff changeset
    33
#include "gc/parallel/parallelArguments.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    34
#include "gc/parallel/parallelScavengeHeap.inline.hpp"
46502
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
    35
#include "gc/parallel/parMarkBitMap.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    36
#include "gc/parallel/psAdaptiveSizePolicy.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    37
#include "gc/parallel/psCompactionManager.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    38
#include "gc/parallel/psOldGen.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    39
#include "gc/parallel/psParallelCompact.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    40
#include "gc/parallel/psPromotionManager.inline.hpp"
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
    41
#include "gc/parallel/psRootType.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    42
#include "gc/parallel/psScavenge.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    43
#include "gc/parallel/psYoungGen.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    44
#include "gc/shared/gcCause.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    45
#include "gc/shared/gcHeapSummary.hpp"
33107
77bf0d2069a3 8134953: Make the GC ID available in a central place
brutisso
parents: 33105
diff changeset
    46
#include "gc/shared/gcId.hpp"
49594
898ef81cbc0e 8200106: Move NoSafepointVerifier out from gcLocker.hpp
stefank
parents: 49592
diff changeset
    47
#include "gc/shared/gcLocker.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    48
#include "gc/shared/gcTimer.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    49
#include "gc/shared/gcTrace.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
    50
#include "gc/shared/gcTraceTime.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    51
#include "gc/shared/isGCActiveMark.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    52
#include "gc/shared/referencePolicy.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    53
#include "gc/shared/referenceProcessor.hpp"
50605
7f63c74f0974 8202845: Refactor reference processing for improved parallelism
tschatzl
parents: 50500
diff changeset
    54
#include "gc/shared/referenceProcessorPhaseTimes.hpp"
58980
47c20fc6a517 8189737: Make HeapRegion not derive from Space
tschatzl
parents: 57773
diff changeset
    55
#include "gc/shared/spaceDecorator.inline.hpp"
47648
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
    56
#include "gc/shared/weakProcessor.hpp"
57767
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
    57
#include "gc/shared/workerPolicy.hpp"
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
    58
#include "gc/shared/workgroup.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
    59
#include "logging/log.hpp"
50752
9d62da00bf15 8204540: Automatic oop closure devirtualization
stefank
parents: 50606
diff changeset
    60
#include "memory/iterator.inline.hpp"
37248
11a660dbbb8e 8132524: Missing includes to resourceArea.hpp
jprovino
parents: 37242
diff changeset
    61
#include "memory/resourceArea.hpp"
54786
ebf733a324d4 8223624: Cleanup includes of universe.hpp
stefank
parents: 54678
diff changeset
    62
#include "memory/universe.hpp"
49592
77fb0be7d19f 8199946: Move load/store and encode/decode out of oopDesc
stefank
parents: 49389
diff changeset
    63
#include "oops/access.inline.hpp"
50752
9d62da00bf15 8204540: Automatic oop closure devirtualization
stefank
parents: 50606
diff changeset
    64
#include "oops/instanceClassLoaderKlass.inline.hpp"
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29798
diff changeset
    65
#include "oops/instanceKlass.inline.hpp"
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29798
diff changeset
    66
#include "oops/instanceMirrorKlass.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    67
#include "oops/methodData.hpp"
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29798
diff changeset
    68
#include "oops/objArrayKlass.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    69
#include "oops/oop.inline.hpp"
40655
9f644073d3a0 8157907: Incorrect inclusion of atomic.hpp instead of atomic.inline.hpp
dholmes
parents: 38311
diff changeset
    70
#include "runtime/atomic.hpp"
49361
1956d0ec092a 8199319: Remove handles.inline.hpp include from reflectionUtils.hpp
stefank
parents: 49164
diff changeset
    71
#include "runtime/handles.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    72
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    73
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    74
#include "services/management.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    75
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    76
#include "services/memoryService.hpp"
46625
edefffab74e2 8183552: Move align functions to align.hpp
stefank
parents: 46619
diff changeset
    77
#include "utilities/align.hpp"
46560
388aa8d67c80 8181449: Fix debug.hpp / globalDefinitions.hpp dependency inversion
kbarrett
parents: 46505
diff changeset
    78
#include "utilities/debug.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    79
#include "utilities/events.hpp"
46560
388aa8d67c80 8181449: Fix debug.hpp / globalDefinitions.hpp dependency inversion
kbarrett
parents: 46505
diff changeset
    80
#include "utilities/formatBuffer.hpp"
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49969
diff changeset
    81
#include "utilities/macros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6762
diff changeset
    82
#include "utilities/stack.inline.hpp"
54669
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
    83
#if INCLUDE_JVMCI
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
    84
#include "jvmci/jvmci.hpp"
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
    85
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#include <math.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// All sizes are in HeapWords.
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
    90
const size_t ParallelCompactData::Log2RegionSize  = 16; // 64K words
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    91
const size_t ParallelCompactData::RegionSize      = (size_t)1 << Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    92
const size_t ParallelCompactData::RegionSizeBytes =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    93
  RegionSize << LogHeapWordSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    94
const size_t ParallelCompactData::RegionSizeOffsetMask = RegionSize - 1;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
    95
const size_t ParallelCompactData::RegionAddrOffsetMask = RegionSizeBytes - 1;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
    96
const size_t ParallelCompactData::RegionAddrMask       = ~RegionAddrOffsetMask;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
    97
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
    98
const size_t ParallelCompactData::Log2BlockSize   = 7; // 128 words
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
    99
const size_t ParallelCompactData::BlockSize       = (size_t)1 << Log2BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   100
const size_t ParallelCompactData::BlockSizeBytes  =
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   101
  BlockSize << LogHeapWordSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   102
const size_t ParallelCompactData::BlockSizeOffsetMask = BlockSize - 1;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   103
const size_t ParallelCompactData::BlockAddrOffsetMask = BlockSizeBytes - 1;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   104
const size_t ParallelCompactData::BlockAddrMask       = ~BlockAddrOffsetMask;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   105
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   106
const size_t ParallelCompactData::BlocksPerRegion = RegionSize / BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   107
const size_t ParallelCompactData::Log2BlocksPerRegion =
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   108
  Log2RegionSize - Log2BlockSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   110
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   111
ParallelCompactData::RegionData::dc_shift = 27;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   112
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   113
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   114
ParallelCompactData::RegionData::dc_mask = ~0U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   115
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   116
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   117
ParallelCompactData::RegionData::dc_one = 0x1U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   118
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   119
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   120
ParallelCompactData::RegionData::los_mask = ~dc_mask;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   121
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   122
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   123
ParallelCompactData::RegionData::dc_claimed = 0x8U << dc_shift;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   124
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   125
const ParallelCompactData::RegionData::region_sz_t
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   126
ParallelCompactData::RegionData::dc_completed = 0xcU << dc_shift;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
SpaceInfo PSParallelCompact::_space_info[PSParallelCompact::last_space_id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49821
diff changeset
   130
SpanSubjectToDiscoveryClosure PSParallelCompact::_span_based_discoverer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
ReferenceProcessor* PSParallelCompact::_ref_processor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
double PSParallelCompact::_dwl_mean;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
double PSParallelCompact::_dwl_std_dev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
double PSParallelCompact::_dwl_first_term;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
double PSParallelCompact::_dwl_adjustment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
bool   PSParallelCompact::_dwl_initialized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   141
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
   142
                       HeapWord* destination)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   143
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   144
  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
   145
  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
   146
  assert(destination != NULL, "invalid destination argument");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   147
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   148
  _src_region_idx = src_region_idx;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   149
  _partial_obj_size = partial_obj_size;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   150
  _destination = destination;
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
  // 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
   153
  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
   154
  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
   155
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   156
  // 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
   157
  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
   158
  const ParallelCompactData& sd = PSParallelCompact::summary_data();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   159
  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
   160
  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
   161
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   162
  if (beg_region_addr == end_region_addr) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   163
    // One destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   164
    _destination_count = 1;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   165
    if (end_region_addr == destination) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   166
      // 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
   167
      // 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
   168
      _dest_region_addr = end_region_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   169
      _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
   170
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   171
  } else {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   172
    // 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
   173
    // 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
   174
    // 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
   175
    _destination_count = 2;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   176
    _dest_region_addr = end_region_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   177
    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
   178
    assert(ofs < _partial_obj_size, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   179
    _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
   180
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   181
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   182
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   183
void SplitInfo::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
  _src_region_idx = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   186
  _partial_obj_size = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   187
  _destination = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   188
  _destination_count = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   189
  _dest_region_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   190
  _first_src_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   191
  assert(!is_valid(), "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   192
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   193
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   194
#ifdef  ASSERT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   195
void SplitInfo::verify_clear()
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   196
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   197
  assert(_src_region_idx == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   198
  assert(_partial_obj_size == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   199
  assert(_destination == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   200
  assert(_destination_count == 0, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   201
  assert(_dest_region_addr == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   202
  assert(_first_src_addr == NULL, "not clear");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   203
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   204
#endif  // #ifdef ASSERT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   205
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   206
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
   207
void PSParallelCompact::print_on_error(outputStream* st) {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
   208
  _mark_bitmap.print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
   209
}
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
   210
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
const char* PSParallelCompact::space_names[] = {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   213
  "old ", "eden", "from", "to  "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   216
void PSParallelCompact::print_region_ranges() {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   217
  if (!log_develop_is_enabled(Trace, gc, compaction)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   218
    return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   219
  }
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 37146
diff changeset
   220
  Log(gc, compaction) log;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   221
  ResourceMark rm;
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46625
diff changeset
   222
  LogStream ls(log.trace());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46625
diff changeset
   223
  Universe::print_on(&ls);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   224
  log.trace("space  bottom     top        end        new_top");
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   225
  log.trace("------ ---------- ---------- ---------- ----------");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  for (unsigned int id = 0; id < last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    const MutableSpace* space = _space_info[id].space();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   229
    log.trace("%u %s "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   230
              SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   231
              SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " ",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   232
              id, space_names[id],
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   233
              summary_data().addr_to_region_idx(space->bottom()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   234
              summary_data().addr_to_region_idx(space->top()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   235
              summary_data().addr_to_region_idx(space->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   236
              summary_data().addr_to_region_idx(_space_info[id].new_top()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
void
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   241
print_generic_summary_region(size_t i, const ParallelCompactData::RegionData* c)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   243
#define REGION_IDX_FORMAT        SIZE_FORMAT_W(7)
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   244
#define REGION_DATA_FORMAT       SIZE_FORMAT_W(5)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  ParallelCompactData& sd = PSParallelCompact::summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   247
  size_t dci = c->destination() ? sd.addr_to_region_idx(c->destination()) : 0;
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   248
  log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   249
      REGION_IDX_FORMAT " " PTR_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   250
      REGION_IDX_FORMAT " " PTR_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   251
      REGION_DATA_FORMAT " " REGION_DATA_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   252
      REGION_DATA_FORMAT " " REGION_IDX_FORMAT " %d",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   253
      i, p2i(c->data_location()), dci, p2i(c->destination()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   254
      c->partial_obj_size(), c->live_obj_size(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   255
      c->data_size(), c->source_region(), c->destination_count());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   256
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   257
#undef  REGION_IDX_FORMAT
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   258
#undef  REGION_DATA_FORMAT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
print_generic_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
                           HeapWord* const beg_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
                           HeapWord* const end_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  size_t total_words = 0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   267
  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
   268
  const size_t last = summary_data.addr_to_region_idx(end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  HeapWord* pdest = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
38149
f0f1c01a930c 8154743: Internal Error: psParallelCompact.hpp assert(addr >= _region_start) failed: bad addr
jmasa
parents: 38074
diff changeset
   271
  while (i < last) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   272
    ParallelCompactData::RegionData* c = summary_data.region(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    if (c->data_size() != 0 || c->destination() != pdest) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   274
      print_generic_summary_region(i, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
      total_words += c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
      pdest = c->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    ++i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   281
  log_develop_trace(gc, compaction)("summary_data_bytes=" SIZE_FORMAT, total_words * HeapWordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
void
42638
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   285
PSParallelCompact::print_generic_summary_data(ParallelCompactData& summary_data,
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   286
                                              HeapWord* const beg_addr,
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   287
                                              HeapWord* const end_addr) {
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   288
  ::print_generic_summary_data(summary_data,beg_addr, end_addr);
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   289
}
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   290
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 40655
diff changeset
   291
void
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
print_generic_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
                           SpaceInfo* space_info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
{
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   295
  if (!log_develop_is_enabled(Trace, gc, compaction)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   296
    return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   297
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   298
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  for (unsigned int id = 0; id < PSParallelCompact::last_space_id; ++id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    const MutableSpace* space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    print_generic_summary_data(summary_data, space->bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
                               MAX2(space->top(), space_info[id].new_top()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
print_initial_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
                           const MutableSpace* space) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  if (space->top() == space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   313
  const size_t region_size = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   314
  typedef ParallelCompactData::RegionData RegionData;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   315
  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
   316
  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
   317
  const RegionData* c = summary_data.region(end_region - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  HeapWord* end_addr = c->destination() + c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  const size_t live_in_space = pointer_delta(end_addr, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   321
  // 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
   322
  size_t full_region_count = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   323
  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
   324
  while (i < end_region && summary_data.region(i)->data_size() == region_size) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   325
    ParallelCompactData::RegionData* c = summary_data.region(i);
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   326
    log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   327
        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   328
        i, p2i(c->destination()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   329
        c->partial_obj_size(), c->live_obj_size(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   330
        c->data_size(), c->source_region(), c->destination_count());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   331
    ++full_region_count;
1
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
  size_t live_to_right = live_in_space - full_region_count * region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  double max_reclaimed_ratio = 0.0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   338
  size_t max_reclaimed_ratio_region = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  size_t max_dead_to_right = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  size_t max_live_to_right = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   342
  // 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
   343
  // the region or to the right of it.  The remaining regions are empty (and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // 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
   345
  while (i < end_region && live_to_right > 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   346
    c = summary_data.region(i);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   347
    HeapWord* const region_addr = summary_data.region_to_addr(i);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   348
    const size_t used_to_right = pointer_delta(space->top(), region_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    const size_t dead_to_right = used_to_right - live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    const double reclaimed_ratio = double(dead_to_right) / live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    if (reclaimed_ratio > max_reclaimed_ratio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
            max_reclaimed_ratio = reclaimed_ratio;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   354
            max_reclaimed_ratio_region = i;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
            max_dead_to_right = dead_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
            max_live_to_right = live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   359
    ParallelCompactData::RegionData* c = summary_data.region(i);
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   360
    log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   361
        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d"
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   362
        "%12.10f " SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   363
        i, p2i(c->destination()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   364
        c->partial_obj_size(), c->live_obj_size(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   365
        c->data_size(), c->source_region(), c->destination_count(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   366
        reclaimed_ratio, dead_to_right, live_to_right);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   367
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    live_to_right -= c->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    ++i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   373
  // 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
   374
  if (i < end_region) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   375
    ParallelCompactData::RegionData* c = summary_data.region(i);
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   376
    log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   377
        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   378
         i, p2i(c->destination()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   379
         c->partial_obj_size(), c->live_obj_size(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   380
         c->data_size(), c->source_region(), c->destination_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   383
  log_develop_trace(gc, compaction)("max:  " SIZE_FORMAT_W(4) " d2r=" SIZE_FORMAT_W(10) " l2r=" SIZE_FORMAT_W(10) " max_ratio=%14.12f",
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   384
                                    max_reclaimed_ratio_region, max_dead_to_right, max_live_to_right, max_reclaimed_ratio);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
print_initial_summary_data(ParallelCompactData& summary_data,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
                           SpaceInfo* space_info) {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   390
  if (!log_develop_is_enabled(Trace, gc, compaction)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   391
    return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   392
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   393
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   394
  unsigned int id = PSParallelCompact::old_space_id;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  const MutableSpace* space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    print_initial_summary_data(summary_data, space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  } while (++id < PSParallelCompact::eden_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    space = space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    print_generic_summary_data(summary_data, space->bottom(), space->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  } while (++id < PSParallelCompact::last_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
size_t add_obj_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
size_t add_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
size_t mark_bitmap_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
size_t mark_bitmap_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
54264
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   415
ParallelCompactData::ParallelCompactData() :
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   416
  _region_start(NULL),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   417
  DEBUG_ONLY(_region_end(NULL) COMMA)
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   418
  _region_vspace(NULL),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   419
  _reserved_byte_size(0),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   420
  _region_data(NULL),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   421
  _region_count(0),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   422
  _block_vspace(NULL),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   423
  _block_data(NULL),
41af8d0546bc 8221260: Initialize more class members on construction, remove some unused ones
lkorinth
parents: 54178
diff changeset
   424
  _block_count(0) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
bool ParallelCompactData::initialize(MemRegion covered_region)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  _region_start = covered_region.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  const size_t region_size = covered_region.word_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  DEBUG_ONLY(_region_end = _region_start + region_size;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   432
  assert(region_align_down(_region_start) == _region_start,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
         "region start not aligned");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   434
  assert((region_size & RegionSizeOffsetMask) == 0,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   435
         "region size not a multiple of RegionSize");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   436
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   437
  bool result = initialize_region_data(region_size) && initialize_block_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
PSVirtualSpace*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
ParallelCompactData::create_vspace(size_t count, size_t element_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  const size_t raw_bytes = count * element_size;
28631
a56cae1b428d 8066875: VirtualSpace does not use large pages
ehelin
parents: 28212
diff changeset
   445
  const size_t page_sz = os::page_size_for_region_aligned(raw_bytes, 10);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  const size_t granularity = os::vm_allocation_granularity();
46619
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46560
diff changeset
   447
  _reserved_byte_size = align_up(raw_bytes, MAX2(page_sz, granularity));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    MAX2(page_sz, granularity);
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   451
  ReservedSpace rs(_reserved_byte_size, rs_align, rs_align > 0);
37462
58bb9394a98b 8152491: Convert TracePageSizes to use UL
stefank
parents: 37260
diff changeset
   452
  os::trace_page_sizes("Parallel Compact Data", raw_bytes, raw_bytes, page_sz, rs.base(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
                       rs.size());
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12630
diff changeset
   454
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12630
diff changeset
   455
  MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12630
diff changeset
   456
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  if (vspace != 0) {
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   459
    if (vspace->expand_by(_reserved_byte_size)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
      return vspace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    delete vspace;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 781
diff changeset
   463
    // Release memory reserved in the space.
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 781
diff changeset
   464
    rs.release();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   470
bool ParallelCompactData::initialize_region_data(size_t region_size)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   472
  const size_t count = (region_size + RegionSizeOffsetMask) >> Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   473
  _region_vspace = create_vspace(count, sizeof(RegionData));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   474
  if (_region_vspace != 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   475
    _region_data = (RegionData*)_region_vspace->reserved_low_addr();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   476
    _region_count = count;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   482
bool ParallelCompactData::initialize_block_data()
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   483
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   484
  assert(_region_count != 0, "region data must be initialized first");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   485
  const size_t count = _region_count << Log2BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   486
  _block_vspace = create_vspace(count, sizeof(BlockData));
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   487
  if (_block_vspace != 0) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   488
    _block_data = (BlockData*)_block_vspace->reserved_low_addr();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   489
    _block_count = count;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   490
    return true;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   491
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   492
  return false;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   493
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   494
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
void ParallelCompactData::clear()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   497
  memset(_region_data, 0, _region_vspace->committed_size());
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   498
  memset(_block_data, 0, _block_vspace->committed_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   501
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
   502
  assert(beg_region <= _region_count, "beg_region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   503
  assert(end_region <= _region_count, "end_region out of range");
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   504
  assert(RegionSize % BlockSize == 0, "RegionSize not a multiple of BlockSize");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   505
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   506
  const size_t region_cnt = end_region - beg_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   507
  memset(_region_data + beg_region, 0, region_cnt * sizeof(RegionData));
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   508
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   509
  const size_t beg_block = beg_region * BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   510
  const size_t block_cnt = region_cnt * BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   511
  memset(_block_data + beg_block, 0, block_cnt * sizeof(BlockData));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   514
HeapWord* ParallelCompactData::partial_obj_end(size_t region_idx) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   516
  const RegionData* cur_cp = region(region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   517
  const RegionData* const end_cp = region(region_count() - 1);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   518
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   519
  HeapWord* result = region_to_addr(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  if (cur_cp < end_cp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
      result += cur_cp->partial_obj_size();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   523
    } while (cur_cp->partial_obj_size() == RegionSize && ++cur_cp < end_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  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
   531
  const size_t beg_region = obj_ofs >> Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   532
  const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
47552
8a3599d60996 8186838: Generalize Atomic::inc/dec with templates
eosterlund
parents: 47546
diff changeset
   534
  DEBUG_ONLY(Atomic::inc(&add_obj_count);)
59249
29b0d0b61615 8234737: Harmonize parameter order in Atomic - add
stefank
parents: 59008
diff changeset
   535
  DEBUG_ONLY(Atomic::add(&add_obj_size, len);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   537
  if (beg_region == end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   538
    // All in one region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   539
    _region_data[beg_region].add_live_obj(len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   543
  // First region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   544
  const size_t beg_ofs = region_offset(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   545
  _region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   547
  Klass* klass = ((oop)addr)->klass();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   548
  // Middle regions--completely spanned by this object.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   549
  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
   550
    _region_data[region].set_partial_obj_size(RegionSize);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   551
    _region_data[region].set_partial_obj_addr(addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   554
  // Last region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   555
  const size_t end_ofs = region_offset(addr + len - 1);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   556
  _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
   557
  _region_data[end_region].set_partial_obj_addr(addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
ParallelCompactData::summarize_dense_prefix(HeapWord* beg, HeapWord* end)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   563
  assert(region_offset(beg) == 0, "not RegionSize aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   564
  assert(region_offset(end) == 0, "not RegionSize aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   565
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   566
  size_t cur_region = addr_to_region_idx(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   567
  const size_t end_region = addr_to_region_idx(end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  HeapWord* addr = beg;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   569
  while (cur_region < end_region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   570
    _region_data[cur_region].set_destination(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   571
    _region_data[cur_region].set_destination_count(0);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   572
    _region_data[cur_region].set_source_region(cur_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   573
    _region_data[cur_region].set_data_location(addr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   574
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   575
    // Update live_obj_size so the region appears completely full.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   576
    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
   577
    _region_data[cur_region].set_live_obj_size(live_size);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   578
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   579
    ++cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   580
    addr += RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   584
// 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
   585
// split point.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   586
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   587
// 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
   588
// 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
   589
// region (an "easy" split, no extra bookkeeping required).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   590
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   591
// 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
   592
// 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
   593
// 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
   594
// 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
   595
// 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
   596
// 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
   597
// 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
   598
// 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
   599
// split).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   600
HeapWord*
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   601
ParallelCompactData::summarize_split_space(size_t src_region,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   602
                                           SplitInfo& split_info,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   603
                                           HeapWord* destination,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   604
                                           HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   605
                                           HeapWord** target_next)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   606
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   607
  assert(destination <= target_end, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   608
  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
   609
    "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
   610
  assert(is_region_aligned(target_end), "sanity");
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   611
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   612
  size_t split_region = src_region;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   613
  HeapWord* split_destination = destination;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   614
  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
   615
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   616
  if (destination + partial_obj_size > target_end) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   617
    // 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
   618
    // 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
   619
    // destination space.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   620
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   621
    // 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
   622
    // region containing it.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   623
    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
   624
    split_region = addr_to_region_idx(overflow_obj);
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
    // 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
   627
    // 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
   628
    // implies a region must be filled).
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
    // 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
   631
    // 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
   632
    // 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
   633
    // object as opposed to just one field.)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   634
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   635
    // 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
   636
    // 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
   637
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   638
    //         max(top, max(new_top, clear_top))
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   639
    //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   640
    // 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
   641
    // to target_end.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   642
    const RegionData* const sr = region(split_region);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   643
    const size_t beg_idx =
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   644
      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
   645
                                         sr->partial_obj_size()));
2363
f09f17e0ebc7 6810474: par compact - crash in summary_phase with very full heap
jcoomes
parents: 2154
diff changeset
   646
    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
   647
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   648
    log_develop_trace(gc, compaction)("split:  clearing source_region field in [" SIZE_FORMAT ", " SIZE_FORMAT ")", beg_idx, end_idx);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   649
    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
   650
      _region_data[idx].set_source_region(0);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   651
    }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   652
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   653
    // 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
   654
    split_destination = sr->destination();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   655
    partial_obj_size = sr->partial_obj_size();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   656
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   657
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   658
  // 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
   659
  if (partial_obj_size != 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   660
    _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
   661
    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
   662
  }
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
  // Setup the continuation addresses.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   665
  *target_next = split_destination + partial_obj_size;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   666
  HeapWord* const source_next = region_to_addr(split_region) + partial_obj_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   668
  if (log_develop_is_enabled(Trace, gc, compaction)) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   669
    const char * split_type = partial_obj_size == 0 ? "easy" : "hard";
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   670
    log_develop_trace(gc, compaction)("%s split:  src=" PTR_FORMAT " src_c=" SIZE_FORMAT " pos=" SIZE_FORMAT,
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   671
                                      split_type, p2i(source_next), split_region, partial_obj_size);
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   672
    log_develop_trace(gc, compaction)("%s split:  dst=" PTR_FORMAT " dst_c=" SIZE_FORMAT " tn=" PTR_FORMAT,
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   673
                                      split_type, p2i(split_destination),
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   674
                                      addr_to_region_idx(split_destination),
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   675
                                      p2i(*target_next));
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   676
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   677
    if (partial_obj_size != 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   678
      HeapWord* const po_beg = split_info.destination();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   679
      HeapWord* const po_end = po_beg + split_info.partial_obj_size();
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   680
      log_develop_trace(gc, compaction)("%s split:  po_beg=" PTR_FORMAT " " SIZE_FORMAT " po_end=" PTR_FORMAT " " SIZE_FORMAT,
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   681
                                        split_type,
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   682
                                        p2i(po_beg), addr_to_region_idx(po_beg),
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   683
                                        p2i(po_end), addr_to_region_idx(po_end));
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   684
    }
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
  return source_next;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   688
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   689
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   690
bool ParallelCompactData::summarize(SplitInfo& split_info,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   691
                                    HeapWord* source_beg, HeapWord* source_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   692
                                    HeapWord** source_next,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   693
                                    HeapWord* target_beg, HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   694
                                    HeapWord** target_next)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   695
{
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   696
  HeapWord* const source_next_val = source_next == NULL ? NULL : *source_next;
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   697
  log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   698
      "sb=" PTR_FORMAT " se=" PTR_FORMAT " sn=" PTR_FORMAT
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   699
      "tb=" PTR_FORMAT " te=" PTR_FORMAT " tn=" PTR_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   700
      p2i(source_beg), p2i(source_end), p2i(source_next_val),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   701
      p2i(target_beg), p2i(target_end), p2i(*target_next));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   703
  size_t cur_region = addr_to_region_idx(source_beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   704
  const size_t end_region = addr_to_region_idx(region_align_up(source_end));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  HeapWord *dest_addr = target_beg;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   707
  while (cur_region < end_region) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   708
    // 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
   709
    _region_data[cur_region].set_destination(dest_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   710
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   711
    size_t words = _region_data[cur_region].data_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
    if (words > 0) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   713
      // 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
   714
      // 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
   715
      // target space and the rest is copied elsewhere.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   716
      if (dest_addr + words > target_end) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   717
        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
   718
        *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
   719
                                             target_end, target_next);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   720
        return false;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   721
      }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   722
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   723
      // 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
   724
      // 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
   725
      // 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
   726
      // destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   727
      //
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   728
      // 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
   729
      // 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
   730
      // 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
   731
      // available and can be claimed and then filled.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   732
      uint destination_count = 0;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   733
      if (split_info.is_split(cur_region)) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   734
        // 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
   735
        // 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
   736
        // 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
   737
        // 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
   738
        // cross a destination region boundary.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   739
        destination_count = split_info.destination_count();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   740
        if (destination_count == 2) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   741
          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
   742
          _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
   743
        }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   744
      }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   745
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
      HeapWord* const last_addr = dest_addr + words - 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   747
      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
   748
      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
   749
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   750
      // Initially assume that the destination regions will be the same and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
      // 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
   752
      // 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
   753
      // completely into itself.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   754
      destination_count += cur_region == dest_region_2 ? 0 : 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   755
      if (dest_region_1 != dest_region_2) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   756
        // Destination regions differ; adjust destination_count.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
        destination_count += 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   758
        // 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
   759
        _region_data[dest_region_2].set_source_region(cur_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   760
      } else if (region_offset(dest_addr) == 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   761
        // 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
   762
        // region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   763
        _region_data[dest_region_1].set_source_region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   766
      _region_data[cur_region].set_destination_count(destination_count);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   767
      _region_data[cur_region].set_data_location(region_to_addr(cur_region));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
      dest_addr += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   771
    ++cur_region;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  *target_next = dest_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   778
HeapWord* ParallelCompactData::calc_new_pointer(HeapWord* addr, ParCompactionManager* cm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  assert(addr != NULL, "Should detect NULL oop earlier");
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
   780
  assert(ParallelScavengeHeap::heap()->is_in(addr), "not in heap");
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   781
  assert(PSParallelCompact::mark_bitmap()->is_marked(addr), "not marked");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   783
  // Region covering the object.
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   784
  RegionData* const region_ptr = addr_to_region_ptr(addr);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   785
  HeapWord* result = region_ptr->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   786
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   787
  // If the entire Region is live, the new location is region->destination + the
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   788
  // offset of the object within in the Region.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   789
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   790
  // Run some performance tests to determine if this special case pays off.  It
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   791
  // is worth it for pointers into the dense prefix.  If the optimization to
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   792
  // avoid pointer updates in regions that only point to the dense prefix is
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   793
  // ever implemented, this should be revisited.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   794
  if (region_ptr->data_size() == RegionSize) {
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   795
    result += region_offset(addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   799
  // Otherwise, the new location is region->destination + block offset + the
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   800
  // number of live words in the Block that are (a) to the left of addr and (b)
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   801
  // due to objects that start in the Block.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   802
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   803
  // Fill in the block table if necessary.  This is unsynchronized, so multiple
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   804
  // threads may fill the block table for a region (harmless, since it is
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   805
  // idempotent).
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   806
  if (!region_ptr->blocks_filled()) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   807
    PSParallelCompact::fill_blocks(addr_to_region_idx(addr));
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   808
    region_ptr->set_blocks_filled();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   809
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   810
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   811
  HeapWord* const search_start = block_align_down(addr);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   812
  const size_t block_offset = addr_to_block_ptr(addr)->offset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  const ParMarkBitMap* bitmap = PSParallelCompact::mark_bitmap();
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   815
  const size_t live = bitmap->live_words_in_range(cm, search_start, oop(addr));
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   816
  result += block_offset + live;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   817
  DEBUG_ONLY(PSParallelCompact::check_new_location(addr, result));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   821
#ifdef ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
void ParallelCompactData::verify_clear(const PSVirtualSpace* vspace)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  const size_t* const beg = (const size_t*)vspace->committed_low_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  const size_t* const end = (const size_t*)vspace->committed_high_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  for (const size_t* p = beg; p < end; ++p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
    assert(*p == 0, "not zero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
void ParallelCompactData::verify_clear()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   833
  verify_clear(_region_vspace);
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
   834
  verify_clear(_block_vspace);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   838
STWGCTimer          PSParallelCompact::_gc_timer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   839
ParallelOldTracer   PSParallelCompact::_gc_tracer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
elapsedTimer        PSParallelCompact::_accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
unsigned int        PSParallelCompact::_total_invocations = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
unsigned int        PSParallelCompact::_maximum_compaction_gc_num = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
jlong               PSParallelCompact::_time_of_last_gc = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
CollectorCounters*  PSParallelCompact::_counters = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
ParMarkBitMap       PSParallelCompact::_mark_bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
ParallelCompactData PSParallelCompact::_summary_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
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
   849
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 252
diff changeset
   850
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
   851
52118
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   852
class PCReferenceProcessor: public ReferenceProcessor {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   853
public:
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   854
  PCReferenceProcessor(
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   855
    BoolObjectClosure* is_subject_to_discovery,
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   856
    BoolObjectClosure* is_alive_non_header) :
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   857
      ReferenceProcessor(is_subject_to_discovery,
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   858
      ParallelRefProcEnabled && (ParallelGCThreads > 1), // mt processing
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   859
      ParallelGCThreads,   // mt processing degree
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   860
      true,                // mt discovery
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   861
      ParallelGCThreads,   // mt discovery degree
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   862
      true,                // atomic_discovery
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   863
      is_alive_non_header) {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   864
  }
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   865
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   866
  template<typename T> bool discover(oop obj, ReferenceType type) {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   867
    T* referent_addr = (T*) java_lang_ref_Reference::referent_addr_raw(obj);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   868
    T heap_oop = RawAccess<>::oop_load(referent_addr);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   869
    oop referent = CompressedOops::decode_not_null(heap_oop);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   870
    return PSParallelCompact::mark_bitmap()->is_unmarked(referent)
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   871
        && ReferenceProcessor::discover_reference(obj, type);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   872
  }
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   873
  virtual bool discover_reference(oop obj, ReferenceType type) {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   874
    if (UseCompressedOops) {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   875
      return discover<narrowOop>(obj, type);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   876
    } else {
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   877
      return discover<oop>(obj, type);
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   878
    }
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   879
  }
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   880
};
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   881
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
void PSParallelCompact::post_initialize() {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
   883
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49821
diff changeset
   884
  _span_based_discoverer.set_span(heap->reserved_region());
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8076
diff changeset
   885
  _ref_processor =
52118
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   886
    new PCReferenceProcessor(&_span_based_discoverer,
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   887
                             &_is_alive_closure); // non-header is alive closure
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
   888
53726
5ef581e59d91 8214236: sun.gc.collector.2.name should be changed
cito
parents: 53587
diff changeset
   889
  _counters = new CollectorCounters("Parallel full collection pauses", 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // Initialize static fields in ParCompactionManager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  ParCompactionManager::initialize(mark_bitmap());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
bool PSParallelCompact::initialize() {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
   896
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  MemRegion mr = heap->reserved_region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  // Was the old gen get allocated successfully?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  if (!heap->old_gen()->is_allocated()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  initialize_space_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  initialize_dead_wood_limiter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  if (!_mark_bitmap.initialize(mr)) {
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   908
    vm_shutdown_during_initialization(
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   909
      err_msg("Unable to allocate " SIZE_FORMAT "KB bitmaps for parallel "
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   910
      "garbage collection for the requested " SIZE_FORMAT "KB heap.",
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   911
      _mark_bitmap.reserved_byte_size()/K, mr.byte_size()/K));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  if (!_summary_data.initialize(mr)) {
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   916
    vm_shutdown_during_initialization(
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   917
      err_msg("Unable to allocate " SIZE_FORMAT "KB card tables for parallel "
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   918
      "garbage collection for the requested " SIZE_FORMAT "KB heap.",
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   919
      _summary_data.reserved_byte_size()/K, mr.byte_size()/K));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
void PSParallelCompact::initialize_space_info()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  memset(&_space_info, 0, sizeof(_space_info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
   930
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  PSYoungGen* young_gen = heap->young_gen();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   932
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  _space_info[old_space_id].set_space(heap->old_gen()->object_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  _space_info[eden_space_id].set_space(young_gen->eden_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  _space_info[from_space_id].set_space(young_gen->from_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  _space_info[to_space_id].set_space(young_gen->to_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  _space_info[old_space_id].set_start_array(heap->old_gen()->start_array());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
void PSParallelCompact::initialize_dead_wood_limiter()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  const size_t max = 100;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  _dwl_mean = double(MIN2(ParallelOldDeadWoodLimiterMean, max)) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  _dwl_std_dev = double(MIN2(ParallelOldDeadWoodLimiterStdDev, max)) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  _dwl_first_term = 1.0 / (sqrt(2.0 * M_PI) * _dwl_std_dev);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  DEBUG_ONLY(_dwl_initialized = true;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  _dwl_adjustment = normal_distribution(1.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
PSParallelCompact::clear_data_covering_space(SpaceId id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  // At this point, top is the value before GC, new_top() is the value that will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  // be set at the end of GC.  The marking bitmap is cleared to top; nothing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  // should be marked above top.  The summary data is cleared to the larger of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  // top & new_top.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  HeapWord* const bot = space->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  HeapWord* const top = space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  HeapWord* const max_top = MAX2(top, _space_info[id].new_top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  const idx_t beg_bit = _mark_bitmap.addr_to_bit(bot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  const idx_t end_bit = BitMap::word_align_up(_mark_bitmap.addr_to_bit(top));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  _mark_bitmap.clear_range(beg_bit, end_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   967
  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
   968
  const size_t end_region =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
   969
    _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
   970
  _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
   971
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   972
  // Clear the data used to 'split' regions.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   973
  SplitInfo& split_info = _space_info[id].split_info();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   974
  if (split_info.is_valid()) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   975
    split_info.clear();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   976
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   977
  DEBUG_ONLY(split_info.verify_clear();)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
   980
void PSParallelCompact::pre_compact()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  // Update the from & to space pointers in space_info, since they are swapped
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  // at each young gen gc.  Do the update unconditionally (even though a
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31634
diff changeset
   984
  // promotion failure does not swap spaces) because an unknown number of young
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  // collections will have swapped the spaces an unknown number of times.
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
   986
  GCTraceTime(Debug, gc, phases) tm("Pre Compact", &_gc_timer);
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
   987
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  _space_info[from_space_id].set_space(heap->young_gen()->from_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  _space_info[to_space_id].set_space(heap->young_gen()->to_space());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  DEBUG_ONLY(add_obj_count = add_obj_size = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  DEBUG_ONLY(mark_bitmap_count = mark_bitmap_size = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  // 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
   995
  heap->increment_total_collections(true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  // We need to track unique mark sweep invocations as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  _total_invocations++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11251
diff changeset
  1000
  heap->print_heap_before_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1001
  heap->trace_heap_before_gc(&_gc_tracer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  // Fill in TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  heap->ensure_parsability(true);  // retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    HandleMark hm;  // Discard invalid handles created during verification
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1008
    Universe::verify("Before GC");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  // Verify object start arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
      VerifyBeforeGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
    heap->old_gen()->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  DEBUG_ONLY(mark_bitmap()->verify_clear();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  DEBUG_ONLY(summary_data().verify_clear();)
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1019
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  1020
  ParCompactionManager::reset_all_bitmap_query_caches();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
void PSParallelCompact::post_compact()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
{
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1025
  GCTraceTime(Info, gc, phases) tm("Post Compact", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1027
  for (unsigned int id = old_space_id; id < last_space_id; ++id) {
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1028
    // Clear the marking bitmap, summary data and split info.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
    clear_data_covering_space(SpaceId(id));
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1030
    // 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
  1031
    _space_info[id].publish_new_top();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  MutableSpace* const eden_space = _space_info[eden_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  MutableSpace* const from_space = _space_info[from_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  MutableSpace* const to_space   = _space_info[to_space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  1038
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  bool eden_empty = eden_space->is_empty();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  if (!eden_empty) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    eden_empty = absorb_live_data_from_eden(heap->size_policy(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
                                            heap->young_gen(), heap->old_gen());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  // Update heap occupancy information which is used as input to the soft ref
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  // clearing policy at the next gc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  Universe::update_heap_info_at_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  bool young_gen_empty = eden_empty && from_space->is_empty() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    to_space->is_empty();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49047
diff changeset
  1052
  PSCardTable* ct = heap->card_table();
29325
0e86e64c66e5 8069016: Add BarrierSet downcast support
kbarrett
parents: 28631
diff changeset
  1053
  MemRegion old_mr = heap->old_gen()->reserved();
0e86e64c66e5 8069016: Add BarrierSet downcast support
kbarrett
parents: 28631
diff changeset
  1054
  if (young_gen_empty) {
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49047
diff changeset
  1055
    ct->clear(MemRegion(old_mr.start(), old_mr.end()));
29325
0e86e64c66e5 8069016: Add BarrierSet downcast support
kbarrett
parents: 28631
diff changeset
  1056
  } else {
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49047
diff changeset
  1057
    ct->invalidate(MemRegion(old_mr.start(), old_mr.end()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1060
  // Delete metaspaces for unloaded class loaders and clean up loader_data graph
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1061
  ClassLoaderDataGraph::purge();
49389
9ef2eee8ca7c 8199430: Rename MetaspaceAux to something more meaningful
stuefe
parents: 49361
diff changeset
  1062
  MetaspaceUtils::verify_metrics();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1063
54178
98e21d4da074 8220609: Cleanups in ScavengableNMethods
stefank
parents: 54122
diff changeset
  1064
  heap->prune_scavengable_nmethods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
47799
1772ebf07d1f 8152470: Add COMPILER2_OR_JVMCI definition
jcm
parents: 47676
diff changeset
  1066
#if COMPILER2_OR_JVMCI
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1067
  DerivedPointerTable::update_pointers();
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1068
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1070
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1071
    heap->gen_mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1072
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1073
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
  // Update time of last GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  reset_millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
PSParallelCompact::compute_dense_prefix_via_density(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
                                                    bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1082
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  const ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  const MutableSpace* const space = _space_info[id].space();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1086
  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
  1087
  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
  1088
  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
  1089
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1090
  // Skip full regions at the beginning of the space--they are necessarily part
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  // of the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  size_t full_count = 0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1093
  const RegionData* cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1094
  for (cp = beg_cp; cp < end_cp && cp->data_size() == region_size; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    ++full_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  assert(total_invocations() >= _maximum_compaction_gc_num, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  const size_t gcs_since_max = total_invocations() - _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  const bool interval_ended = gcs_since_max > HeapMaximumCompactionInterval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  if (maximum_compaction || cp == end_cp || interval_ended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    _maximum_compaction_gc_num = total_invocations();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1103
    return sd.region_to_addr(cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  HeapWord* const new_top = _space_info[id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  const size_t space_live = pointer_delta(new_top, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  const size_t space_used = space->used_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  const size_t space_capacity = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  const double cur_density = double(space_live) / space_capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  const double deadwood_density =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
    (1.0 - cur_density) * (1.0 - cur_density) * cur_density * cur_density;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  const size_t deadwood_goal = size_t(space_capacity * deadwood_density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  if (TraceParallelOldGCDensePrefix) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
    tty->print_cr("cur_dens=%5.3f dw_dens=%5.3f dw_goal=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
                  cur_density, deadwood_density, deadwood_goal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
    tty->print_cr("space_live=" SIZE_FORMAT " " "space_used=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
                  "space_cap=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
                  space_live, space_used,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
                  space_capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  // XXX - Use binary search?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1126
  HeapWord* dense_prefix = sd.region_to_addr(cp);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1127
  const RegionData* full_cp = cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1128
  const RegionData* const top_cp = sd.addr_to_region_ptr(space->top() - 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  while (cp < end_cp) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1130
    HeapWord* region_destination = cp->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1131
    const size_t cur_deadwood = pointer_delta(dense_prefix, region_destination);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
    if (TraceParallelOldGCDensePrefix && Verbose) {
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1133
      tty->print_cr("c#=" SIZE_FORMAT_W(4) " dst=" PTR_FORMAT " "
29798
451c73fdf690 8076071: parallelScavenge: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29792
diff changeset
  1134
                    "dp=" PTR_FORMAT " " "cdw=" SIZE_FORMAT_W(8),
451c73fdf690 8076071: parallelScavenge: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29792
diff changeset
  1135
                    sd.region(cp), p2i(region_destination),
451c73fdf690 8076071: parallelScavenge: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29792
diff changeset
  1136
                    p2i(dense_prefix), cur_deadwood);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    if (cur_deadwood >= deadwood_goal) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1140
      // 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
  1141
      // 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
  1142
      // iterate backwards over those sparse regions, looking for the region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1143
      // 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
  1144
      size_t space_to_left = sd.region(cp) * region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
      size_t live_to_left = space_to_left - cur_deadwood;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
      size_t space_to_right = space_capacity - space_to_left;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
      size_t live_to_right = space_live - live_to_left;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
      double density_to_right = double(live_to_right) / space_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
      while (cp > full_cp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
        --cp;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1151
        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
  1152
          cp->data_size();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1153
        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
  1154
        double prev_region_density_to_right =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1155
          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
  1156
        if (density_to_right <= prev_region_density_to_right) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
          return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
        if (TraceParallelOldGCDensePrefix && Verbose) {
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1160
          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
  1161
                        "pc_d2r=%10.8f", sd.region(cp), density_to_right,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1162
                        prev_region_density_to_right);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
        }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1164
        dense_prefix -= region_size;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1165
        live_to_right = prev_region_live_to_right;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1166
        space_to_right = prev_region_space_to_right;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1167
        density_to_right = prev_region_density_to_right;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
      return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1172
    dense_prefix += region_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
    ++cp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  return dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
void PSParallelCompact::print_dense_prefix_stats(const char* const algorithm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
                                                 const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
                                                 const bool maximum_compaction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
                                                 HeapWord* const addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1185
  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
  1186
  RegionData* const cp = summary_data().region(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  const MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  HeapWord* const new_top = _space_info[id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  const size_t space_live = pointer_delta(new_top, space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  const size_t dead_to_left = pointer_delta(addr, cp->destination());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  const size_t space_cap = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  const double dead_to_left_pct = double(dead_to_left) / space_cap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  const size_t live_to_right = new_top - cp->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  const size_t dead_to_right = space->top() - addr - live_to_right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
972
b86fd2f84aaf 6718283: existing uses of *_FORMAT_W() were broken by 6521491
jcoomes
parents: 971
diff changeset
  1197
  tty->print_cr("%s=" PTR_FORMAT " dpc=" SIZE_FORMAT_W(5) " "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
                "spl=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
                "d2l=" SIZE_FORMAT " d2l%%=%6.4f "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
                "d2r=" SIZE_FORMAT " l2r=" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
                " ratio=%10.8f",
29798
451c73fdf690 8076071: parallelScavenge: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29792
diff changeset
  1202
                algorithm, p2i(addr), region_idx,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
                space_live,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
                dead_to_left, dead_to_left_pct,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
                dead_to_right, live_to_right,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
                double(dead_to_right) / live_to_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
// Return a fraction indicating how much of the generation can be treated as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
// "dead wood" (i.e., not reclaimed).  The function uses a normal distribution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
// based on the density of live objects in the generation to determine a limit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
// which is then adjusted so the return value is min_percent when the density is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
// 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
// The following table shows some return values for a different values of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
// standard deviation (ParallelOldDeadWoodLimiterStdDev); the mean is 0.5 and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
// min_percent is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
//                          fraction allowed as dead wood
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
//         -----------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
// 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
  1223
// ------- ---------- ---------- ---------- ---------- ---------- ----------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
// 0.00000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
// 0.05000 0.03193096 0.02836880 0.02550828 0.02319280 0.02130337 0.01974941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
// 0.10000 0.05247504 0.04547452 0.03988045 0.03537016 0.03170171 0.02869272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
// 0.15000 0.07135702 0.06111390 0.05296419 0.04641639 0.04110601 0.03676066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
// 0.20000 0.08831616 0.07509618 0.06461766 0.05622444 0.04943437 0.04388975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
// 0.25000 0.10311208 0.08724696 0.07471205 0.06469760 0.05661313 0.05002313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
// 0.30000 0.11553050 0.09741183 0.08313394 0.07175114 0.06257797 0.05511132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
// 0.35000 0.12538832 0.10545958 0.08978741 0.07731366 0.06727491 0.05911289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
// 0.40000 0.13253818 0.11128511 0.09459590 0.08132834 0.07066107 0.06199500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
// 0.45000 0.13687208 0.11481163 0.09750361 0.08375387 0.07270534 0.06373386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
// 0.50000 0.13832410 0.11599237 0.09847664 0.08456518 0.07338887 0.06431510
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
// 0.55000 0.13687208 0.11481163 0.09750361 0.08375387 0.07270534 0.06373386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
// 0.60000 0.13253818 0.11128511 0.09459590 0.08132834 0.07066107 0.06199500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
// 0.65000 0.12538832 0.10545958 0.08978741 0.07731366 0.06727491 0.05911289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
// 0.70000 0.11553050 0.09741183 0.08313394 0.07175114 0.06257797 0.05511132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
// 0.75000 0.10311208 0.08724696 0.07471205 0.06469760 0.05661313 0.05002313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
// 0.80000 0.08831616 0.07509618 0.06461766 0.05622444 0.04943437 0.04388975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
// 0.85000 0.07135702 0.06111390 0.05296419 0.04641639 0.04110601 0.03676066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
// 0.90000 0.05247504 0.04547452 0.03988045 0.03537016 0.03170171 0.02869272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
// 0.95000 0.03193096 0.02836880 0.02550828 0.02319280 0.02130337 0.01974941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
// 1.00000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000 0.01000000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
double PSParallelCompact::dead_wood_limiter(double density, size_t min_percent)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
  assert(_dwl_initialized, "uninitialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  // The raw limit is the value of the normal distribution at x = density.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  const double raw_limit = normal_distribution(density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  // Adjust the raw limit so it becomes the minimum when the density is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  // First subtract the adjustment value (which is simply the precomputed value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  // normal_distribution(1.0)); this yields a value of 0 when the density is 1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  // Then add the minimum value, so the minimum is returned when the density is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
  // 1.  Finally, prevent negative values, which occur when the mean is not 0.5.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  const double min = double(min_percent) / 100.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  const double limit = raw_limit - _dwl_adjustment + min;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  return MAX2(limit, 0.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1264
ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1265
PSParallelCompact::first_dead_space_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1266
                                           const RegionData* end)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1268
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1270
  size_t left = sd.region(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1271
  size_t right = end > beg ? sd.region(end) - 1 : left;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
  // Binary search.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
  while (left < right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
    // Equivalent to (left + right) / 2, but does not overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
    const size_t middle = left + (right - left) / 2;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1277
    RegionData* const middle_ptr = sd.region(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
    HeapWord* const dest = middle_ptr->destination();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1279
    HeapWord* const addr = sd.region_to_addr(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
    assert(dest != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
    assert(dest <= addr, "must move left");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    if (middle > left && dest < addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
      right = middle - 1;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1285
    } else if (middle < right && middle_ptr->data_size() == region_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
      left = middle + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
      return middle_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1291
  return sd.region(left);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1294
ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1295
PSParallelCompact::dead_wood_limit_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1296
                                          const RegionData* end,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1297
                                          size_t dead_words)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1300
  size_t left = sd.region(beg);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1301
  size_t right = end > beg ? sd.region(end) - 1 : left;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  // Binary search.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  while (left < right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    // Equivalent to (left + right) / 2, but does not overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
    const size_t middle = left + (right - left) / 2;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1307
    RegionData* const middle_ptr = sd.region(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    HeapWord* const dest = middle_ptr->destination();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1309
    HeapWord* const addr = sd.region_to_addr(middle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
    assert(dest != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
    assert(dest <= addr, "must move left");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
    const size_t dead_to_left = pointer_delta(addr, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
    if (middle > left && dead_to_left > dead_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
      right = middle - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
    } else if (middle < right && dead_to_left < dead_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
      left = middle + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
      return middle_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
  }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1322
  return sd.region(left);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
// The result is valid during the summary phase, after the initial summarization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
// of each space into itself, and before final summarization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
inline double
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1328
PSParallelCompact::reclaimed_ratio(const RegionData* const cp,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
                                   HeapWord* const bottom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
                                   HeapWord* const top,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
                                   HeapWord* const new_top)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  assert(cp != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  assert(bottom != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  assert(top != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
  assert(new_top != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  assert(top >= new_top, "summary data problem?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  assert(new_top > bottom, "space is empty; should not be here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  assert(new_top >= cp->destination(), "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1342
  assert(top >= sd.region_to_addr(cp), "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
  HeapWord* const destination = cp->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  const size_t dense_prefix_live  = pointer_delta(destination, bottom);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  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
  1347
  const size_t compacted_region_used = pointer_delta(top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1348
                                                     sd.region_to_addr(cp));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  const size_t reclaimable = compacted_region_used - compacted_region_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  const double divisor = dense_prefix_live + 1.25 * compacted_region_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  return double(reclaimable) / divisor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
// 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
  1356
// compacted region.  The address is always on a region boundary.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1358
// 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
  1359
// 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
  1360
// 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
  1361
// 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
  1362
// 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
  1363
// 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
  1364
// (maximum) reclaimed_ratio() is selected.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
PSParallelCompact::compute_dense_prefix(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
                                        bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1369
  const size_t region_size = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  const ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  const MutableSpace* const space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  HeapWord* const top = space->top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1374
  HeapWord* const top_aligned_up = sd.region_align_up(top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  HeapWord* const new_top = _space_info[id].new_top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1376
  HeapWord* const new_top_aligned_up = sd.region_align_up(new_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  HeapWord* const bottom = space->bottom();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1378
  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
  1379
  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
  1380
  const RegionData* const new_top_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1381
    sd.addr_to_region_ptr(new_top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1382
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1383
  // Skip full regions at the beginning of the space--they are necessarily part
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
  // of the dense prefix.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1385
  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
  1386
  assert(full_cp->destination() == sd.region_to_addr(full_cp) ||
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
         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
  1388
  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
  1389
         "region must have dead space");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
  // The gc number is saved whenever a maximum compaction is done, and used to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
  // determine when the maximum compaction interval has expired.  This avoids
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
  // successive max compactions for different reasons.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
  assert(total_invocations() >= _maximum_compaction_gc_num, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
  const size_t gcs_since_max = total_invocations() - _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
  const bool interval_ended = gcs_since_max > HeapMaximumCompactionInterval ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
    total_invocations() == HeapFirstMaximumCompactionCount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  if (maximum_compaction || full_cp == top_cp || interval_ended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
    _maximum_compaction_gc_num = total_invocations();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1400
    return sd.region_to_addr(full_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  const size_t space_live = pointer_delta(new_top, bottom);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  const size_t space_used = space->used_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  const size_t space_capacity = space->capacity_in_words();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  const double density = double(space_live) / double(space_capacity);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1408
  const size_t min_percent_free = MarkSweepDeadRatio;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  const double limiter = dead_wood_limiter(density, min_percent_free);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  const size_t dead_wood_max = space_used - space_live;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  const size_t dead_wood_limit = MIN2(size_t(space_capacity * limiter),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
                                      dead_wood_max);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  if (TraceParallelOldGCDensePrefix) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
    tty->print_cr("space_live=" SIZE_FORMAT " " "space_used=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
                  "space_cap=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
                  space_live, space_used,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
                  space_capacity);
24092
e274d864545a 8039743: Use correct format specifier to print size_t values and pointers in the GC code
stefank
parents: 23854
diff changeset
  1419
    tty->print_cr("dead_wood_limiter(%6.4f, " SIZE_FORMAT ")=%6.4f "
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
                  "dead_wood_max=" SIZE_FORMAT " dead_wood_limit=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
                  density, min_percent_free, limiter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
                  dead_wood_max, dead_wood_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1425
  // 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
  1426
  const RegionData* const limit_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1427
    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
  1428
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1429
  // Scan from the first region with dead space to the limit region and find the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
  // one with the best (largest) reclaimed ratio.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
  double best_ratio = 0.0;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1432
  const RegionData* best_cp = full_cp;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1433
  for (const RegionData* cp = full_cp; cp < limit_cp; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
    double tmp_ratio = reclaimed_ratio(cp, bottom, top, new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
    if (tmp_ratio > best_ratio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
      best_cp = cp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
      best_ratio = tmp_ratio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1441
  return sd.region_to_addr(best_cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
void PSParallelCompact::summarize_spaces_quick()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  for (unsigned int i = 0; i < last_space_id; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
    const MutableSpace* space = _space_info[i].space();
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1448
    HeapWord** nta = _space_info[i].new_top_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1449
    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
  1450
                                          space->bottom(), space->top(), NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1451
                                          space->bottom(), space->end(), nta);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1452
    assert(result, "space must fit into itself");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
    _space_info[i].set_dense_prefix(space->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
void PSParallelCompact::fill_dense_prefix_end(SpaceId id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
  HeapWord* const dense_prefix_end = dense_prefix(id);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1460
  const RegionData* region = _summary_data.addr_to_region_ptr(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  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
  1462
  if (dead_space_crosses_boundary(region, dense_prefix_bit)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
    // Only enough dead space is filled so that any remaining dead space to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
    // left is larger than the minimum filler object.  (The remainder is filled
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
    // during the copy/update phase.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
    // The size of the dead space to the right of the boundary is not a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
    // concern, since compaction will be able to use whatever space is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
    // available.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
    // Here '||' is the boundary, 'x' represents a don't care bit and a box
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    // surrounds the space to be filled with an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
    // In the 32-bit VM, each bit represents two 32-bit words:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
    //                              +---+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
    // a) beg_bits:  ...  x   x   x | 0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
    //    end_bits:  ...  x   x   x | 0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
    //                              +---+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
    // In the 64-bit VM, each bit represents one 64-bit word:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
    //                              +------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
    // b) beg_bits:  ...  x   x   x | 0   ||   0 | x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
    //    end_bits:  ...  x   x   1 | 0   ||   0 | x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    //                              +------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    // c) beg_bits:  ...  x   x | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
    //    end_bits:  ...  x   1 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
    //                      +-----------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
    // d) beg_bits:  ...  x | 0   0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
    //    end_bits:  ...  1 | 0   0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
    //                      +-----------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
    // e) beg_bits:  ...  0   0 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
    //    end_bits:  ...  0   0 | 0   0 | ||   0   x  x  ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
    //                          +-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
    // 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
  1499
    size_t obj_len = CollectedHeap::min_fill_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    HeapWord* obj_beg = dense_prefix_end - obj_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
#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
  1503
    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
  1504
      // 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
  1505
    } else if (_mark_bitmap.is_obj_end(dense_prefix_bit - 2)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
      // Case b above.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
      obj_beg = dense_prefix_end - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
    } else if (!_mark_bitmap.is_obj_end(dense_prefix_bit - 3) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
               _mark_bitmap.is_obj_end(dense_prefix_bit - 4)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
      // Case d above.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
      obj_beg = dense_prefix_end - 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
      obj_len = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
#endif  // #ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1516
    CollectedHeap::fill_with_object(obj_beg, obj_len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
    _mark_bitmap.mark_obj(obj_beg, obj_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
    _summary_data.add_obj(obj_beg, obj_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
    assert(start_array(id) != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
    start_array(id)->allocate_block(obj_beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
PSParallelCompact::summarize_space(SpaceId id, bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  assert(id < last_space_id, "id out of range");
33227
b00ec45f8c2c 8139277: Remove ScavengeWithObjectsInToSpace, ParallelOldGCSplitALot, ParallelOldGCSplitInterval, PSAdjustTenuredGenForMinorPause and PSAdjustYoungGenForMajorPause
david
parents: 33107
diff changeset
  1528
  assert(_space_info[id].dense_prefix() == _space_info[id].space()->bottom(),
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1529
         "should have been reset in summarize_spaces_quick()");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  const MutableSpace* space = _space_info[id].space();
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1532
  if (_space_info[id].new_top() != space->bottom()) {
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1533
    HeapWord* dense_prefix_end = compute_dense_prefix(id, maximum_compaction);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1534
    _space_info[id].set_dense_prefix(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
#ifndef PRODUCT
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1537
    if (TraceParallelOldGCDensePrefix) {
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1538
      print_dense_prefix_stats("ratio", id, maximum_compaction,
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1539
                               dense_prefix_end);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1540
      HeapWord* addr = compute_dense_prefix_via_density(id, maximum_compaction);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1541
      print_dense_prefix_stats("density", id, maximum_compaction, addr);
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1542
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
1670
0deb85ea62d5 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 1669
diff changeset
  1545
    // 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
  1546
    // 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
  1547
    // compacts everything can be left in place.
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1548
    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
  1549
      // 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
  1550
      // 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
  1551
      // 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
  1552
      // 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
  1553
      // 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
  1554
      fill_dense_prefix_end(id);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1555
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1556
      // 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
  1557
      _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
  1558
      _summary_data.summarize(_space_info[id].split_info(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1559
                              dense_prefix_end, space->top(), NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1560
                              dense_prefix_end, space->end(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1561
                              _space_info[id].new_top_addr());
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1562
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1565
  if (log_develop_is_enabled(Trace, gc, compaction)) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1566
    const size_t region_size = ParallelCompactData::RegionSize;
973
f00c7826d8c6 6483129: par compact assertion failure (new_top > bottom)
jcoomes
parents: 972
diff changeset
  1567
    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
  1568
    const size_t dp_region = _summary_data.addr_to_region_idx(dense_prefix_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
    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
  1570
    HeapWord* const new_top = _space_info[id].new_top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  1571
    const HeapWord* nt_aligned_up = _summary_data.region_align_up(new_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    const size_t cr_words = pointer_delta(nt_aligned_up, dense_prefix_end);
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1573
    log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1574
        "id=%d cap=" SIZE_FORMAT " dp=" PTR_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1575
        "dp_region=" SIZE_FORMAT " " "dp_count=" SIZE_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1576
        "cr_count=" SIZE_FORMAT " " "nt=" PTR_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1577
        id, space->capacity_in_words(), p2i(dense_prefix_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1578
        dp_region, dp_words / region_size,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1579
        cr_words / region_size, p2i(new_top));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1583
#ifndef PRODUCT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1584
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
  1585
                                          HeapWord* dst_beg, HeapWord* dst_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1586
                                          SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1587
                                          HeapWord* src_beg, HeapWord* src_end)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1588
{
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1589
  log_develop_trace(gc, compaction)(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1590
      "Summarizing %d [%s] into %d [%s]:  "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1591
      "src=" PTR_FORMAT "-" PTR_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1592
      SIZE_FORMAT "-" SIZE_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1593
      "dst=" PTR_FORMAT "-" PTR_FORMAT " "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1594
      SIZE_FORMAT "-" SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1595
      src_space_id, space_names[src_space_id],
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1596
      dst_space_id, space_names[dst_space_id],
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1597
      p2i(src_beg), p2i(src_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1598
      _summary_data.addr_to_region_idx(src_beg),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1599
      _summary_data.addr_to_region_idx(src_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1600
      p2i(dst_beg), p2i(dst_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1601
      _summary_data.addr_to_region_idx(dst_beg),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1602
      _summary_data.addr_to_region_idx(dst_end));
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1603
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1604
#endif  // #ifndef PRODUCT
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1605
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
void PSParallelCompact::summary_phase(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
                                      bool maximum_compaction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
{
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1609
  GCTraceTime(Info, gc, phases) tm("Summary Phase", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
  if (TraceParallelOldGCMarkingPhase) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
    tty->print_cr("add_obj_count=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
                  "add_obj_bytes=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
                  add_obj_count, add_obj_size * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
    tty->print_cr("mark_bitmap_count=" SIZE_FORMAT " "
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
                  "mark_bitmap_bytes=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
                  mark_bitmap_count, mark_bitmap_size * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  // Quick summarization of each space into itself, to see how much is live.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
  summarize_spaces_quick();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1625
  log_develop_trace(gc, compaction)("summary phase:  after summarizing each space to self");
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1626
  NOT_PRODUCT(print_region_ranges());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1627
  NOT_PRODUCT(print_initial_summary_data(_summary_data, _space_info));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  // The amount of live data that will end up in old space (assuming it fits).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  size_t old_space_total_live = 0;
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1631
  for (unsigned int id = old_space_id; id < last_space_id; ++id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
    old_space_total_live += pointer_delta(_space_info[id].new_top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
                                          _space_info[id].space()->bottom());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1636
  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
  1637
  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
  1638
  if (old_space_total_live > old_capacity) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
    // XXX - should also try to expand
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
    maximum_compaction = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1643
  // Old generations.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
  summarize_space(old_space_id, maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1646
  // 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
  1647
  // 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
  1648
  // 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
  1649
  // target.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1650
  SpaceId dst_space_id = old_space_id;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1651
  HeapWord* dst_space_end = old_space->end();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1652
  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
  1653
  for (unsigned int id = eden_space_id; id < last_space_id; ++id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
    const MutableSpace* space = _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
    const size_t live = pointer_delta(_space_info[id].new_top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
                                      space->bottom());
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1657
    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
  1658
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1659
    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
  1660
                                  SpaceId(id), space->bottom(), space->top());)
974
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1661
    if (live > 0 && live <= available) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
      // All the live data will fit.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1663
      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
  1664
                                          space->bottom(), space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1665
                                          NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1666
                                          *new_top_addr, dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1667
                                          new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1668
      assert(done, "space must fit into old gen");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1669
974
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1670
      // Reset the new_top value for the space.
6bbfda0c2a55 6724367: par compact could clear less young gen summary data
jcoomes
parents: 973
diff changeset
  1671
      _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
  1672
    } else if (live > 0) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1673
      // 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
  1674
      HeapWord* next_src_addr = NULL;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1675
      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
  1676
                                          space->bottom(), space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1677
                                          &next_src_addr,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1678
                                          *new_top_addr, dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1679
                                          new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1680
      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
  1681
      assert(next_src_addr != NULL, "sanity");
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1682
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1683
      // 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
  1684
      // within the space itself.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1685
      dst_space_id = SpaceId(id);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1686
      dst_space_end = space->end();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1687
      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
  1688
      NOT_PRODUCT(summary_phase_msg(dst_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1689
                                    space->bottom(), dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1690
                                    SpaceId(id), next_src_addr, space->top());)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1691
      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
  1692
                                     next_src_addr, space->top(),
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1693
                                     NULL,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1694
                                     space->bottom(), dst_space_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1695
                                     new_top_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1696
      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
  1697
      assert(*new_top_addr <= space->top(), "usage should not grow");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  1701
  log_develop_trace(gc, compaction)("Summary_phase:  after final summarization");
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1702
  NOT_PRODUCT(print_region_ranges());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1703
  NOT_PRODUCT(print_initial_summary_data(_summary_data, _space_info));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
// This method should contain all heap-specific policy for invoking a full
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
// collection.  invoke_no_policy() will only attempt to compact the heap; it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
// will do nothing further.  If we need to bail out for policy reasons, scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
// before full gc, or any other specialized behavior, it needs to be added here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
// Note that this method should only be called from the vm_thread while at a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
// safepoint.
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1713
//
54678
93f09ca4a7f8 8198505: Remove CollectorPolicy and its subclasses
stefank
parents: 54669
diff changeset
  1714
// Note that the all_soft_refs_clear flag in the soft ref policy
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1715
// 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
  1716
// 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
  1717
// are being taken to free space.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
void PSParallelCompact::invoke(bool maximum_heap_compaction) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
  assert(Thread::current() == (Thread*)VMThread::vm_thread(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
         "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
  1722
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  1723
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
  GCCause::Cause gc_cause = heap->gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
  assert(!heap->is_gc_active(), "not reentrant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  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
  1728
  IsGCActiveMark mark;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1729
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1730
  if (ScavengeBeforeFullGC) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1731
    PSScavenge::invoke_no_policy();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
  }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1733
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1734
  const bool clear_all_soft_refs =
49047
8f004146e407 8198515: Extract SoftReferencePolicy code out of CollectorPolicy
stefank
parents: 49041
diff changeset
  1735
    heap->soft_ref_policy()->should_clear_all_soft_refs();
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1736
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1737
  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
  1738
                                      maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
// This method contains no policy. You should probably
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
// be calling invoke() instead.
11757
cdf6204b114a 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 11636
diff changeset
  1743
bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  assert(ref_processor() != NULL, "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
  1747
  if (GCLocker::check_active_before_gc()) {
11757
cdf6204b114a 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 11636
diff changeset
  1748
    return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  1751
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1752
33107
77bf0d2069a3 8134953: Make the GC ID available in a central place
brutisso
parents: 33105
diff changeset
  1753
  GCIdMark gc_id_mark;
21767
41eaa9a17059 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 20317
diff changeset
  1754
  _gc_timer.register_gc_start();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1755
  _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1756
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
  TimeStamp marking_start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  TimeStamp compaction_start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
  TimeStamp collection_exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  GCCause::Cause gc_cause = heap->gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  PSYoungGen* young_gen = heap->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  PSAdaptiveSizePolicy* size_policy = heap->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1766
  // The scope of casr should end after code that can change
54678
93f09ca4a7f8 8198505: Remove CollectorPolicy and its subclasses
stefank
parents: 54669
diff changeset
  1767
  // SoftRefPolicy::_should_clear_all_soft_refs.
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1768
  ClearedAllSoftRefs casr(maximum_heap_compaction,
49047
8f004146e407 8198515: Extract SoftReferencePolicy code out of CollectorPolicy
stefank
parents: 49041
diff changeset
  1769
                          heap->soft_ref_policy());
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5076
diff changeset
  1770
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1771
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1772
    // 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
  1773
    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
  1774
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1775
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
  // Make sure data structures are sane, make the heap parsable, and do other
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
  // miscellaneous bookkeeping.
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1778
  pre_compact();
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1779
57662
f81dbe27a7b1 8227225: ParallelGC: add subspace transitions for young gen for gc+heap=info log lines
tonyp
parents: 55740
diff changeset
  1780
  const PreGenGCValues pre_gc_values = heap->get_pre_gc_values();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1782
  // Get the compaction manager reserved for the VM thread.
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1783
  ParCompactionManager* const vmthread_cm =
57773
5cbc3bd9fdfd 8224665: Parallel GC: Use WorkGang (7: remove task manager)
lkorinth
parents: 57769
diff changeset
  1784
    ParCompactionManager::manager_array(ParallelScavengeHeap::heap()->workers().total_workers());
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1785
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
    HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
57767
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1790
    const uint active_workers =
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1791
      WorkerPolicy::calc_active_workers(ParallelScavengeHeap::heap()->workers().total_workers(),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1792
                                        ParallelScavengeHeap::heap()->workers().active_workers(),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1793
                                        Threads::number_of_non_daemon_threads());
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1794
    ParallelScavengeHeap::heap()->workers().update_active_workers(active_workers);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  1795
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1796
    GCTraceCPUTime tcpu;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1797
    GCTraceTime(Info, gc) tm("Pause Full", NULL, gc_cause, true);
35939
05df7e64ecfc 8149035: Make the full_gc_dump() calls be recorded as part of the GC
brutisso
parents: 35901
diff changeset
  1798
05df7e64ecfc 8149035: Make the full_gc_dump() calls be recorded as part of the GC
brutisso
parents: 35901
diff changeset
  1799
    heap->pre_full_gc_dump(&_gc_timer);
05df7e64ecfc 8149035: Make the full_gc_dump() calls be recorded as part of the GC
brutisso
parents: 35901
diff changeset
  1800
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    TraceCollectorStats tcs(counters());
48168
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47799
diff changeset
  1802
    TraceMemoryManagerStats tms(heap->old_gc_manager(), gc_cause);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
47546
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
  1804
    if (log_is_enabled(Debug, gc, heap, exit)) {
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
  1805
      accumulated_time()->start();
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
  1806
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
    // Let the size policy know we're starting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
    size_policy->major_collection_begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
47799
1772ebf07d1f 8152470: Add COMPILER2_OR_JVMCI definition
jcm
parents: 47676
diff changeset
  1811
#if COMPILER2_OR_JVMCI
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1812
    DerivedPointerTable::clear();
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1813
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
28212
647b7d0efb88 8066827: Remove ReferenceProcessor::clean_up_discovered_references()
kbarrett
parents: 27887
diff changeset
  1815
    ref_processor()->enable_discovery();
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
  1816
    ref_processor()->setup_policy(maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
    bool marked_for_unloading = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
    marking_start.update();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1821
    marking_phase(vmthread_cm, maximum_heap_compaction, &_gc_tracer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
12630
ddf6ee008138 7166894: Add gc cause to GC logging for all collectors
brutisso
parents: 11757
diff changeset
  1823
    bool max_on_system_gc = UseMaximumCompactionOnSystemGC
31032
8e72621ca186 8072913: [REDO] GCCause should distinguish jcmd GC.run from System.gc()
ysuenaga
parents: 30876
diff changeset
  1824
      && GCCause::is_user_requested_gc(gc_cause);
756
dc1ba65c5d1e 6676016: ParallelOldGC leaks memory
jcoomes
parents: 389
diff changeset
  1825
    summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
47799
1772ebf07d1f 8152470: Add COMPILER2_OR_JVMCI definition
jcm
parents: 47676
diff changeset
  1827
#if COMPILER2_OR_JVMCI
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1828
    assert(DerivedPointerTable::is_active(), "Sanity");
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1829
    DerivedPointerTable::set_active(false);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32623
diff changeset
  1830
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
    // adjust_roots() updates Universe::_intArrayKlassObj which is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
    // needed by the compaction for filling holes in the dense prefix.
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  1834
    adjust_roots(vmthread_cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
    compaction_start.update();
9178
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  1837
    compact();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
    // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
    // done before resizing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
    post_compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
    // Let the size policy know we're done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
    size_policy->major_collection_end(old_gen->used_in_bytes(), gc_cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
    if (UseAdaptiveSizePolicy) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1847
      log_debug(gc, ergo)("AdaptiveSizeStart: collection: %d ", heap->total_collections());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1848
      log_trace(gc, ergo)("old_gen_capacity: " SIZE_FORMAT " young_gen_capacity: " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1849
                          old_gen->capacity_in_bytes(), young_gen->capacity_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
      // Don't check if the size_policy is ready here.  Let
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
      // the size_policy check that internally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
      if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
31634
0aa645cd8cc3 7012980: PSOldGen is increased if there is no space in Metaspace
jmasa
parents: 31330
diff changeset
  1854
          AdaptiveSizePolicy::should_update_promo_stats(gc_cause)) {
23226
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1855
        // Swap the survivor spaces if from_space is empty. The
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1856
        // resize_young_gen() called below is normally used after
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1857
        // a successful young GC and swapping of survivor spaces;
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1858
        // otherwise, it will fail to resize the young gen with
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1859
        // the current implementation.
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1860
        if (young_gen->from_space()->is_empty()) {
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1861
          young_gen->from_space()->clear(SpaceDecorator::Mangle);
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1862
          young_gen->swap_spaces();
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1863
        }
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1864
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
        // Calculate optimal free space amounts
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
        assert(young_gen->max_size() >
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
          young_gen->from_space()->capacity_in_bytes() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
          young_gen->to_space()->capacity_in_bytes(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
          "Sizes of space in young gen are out-of-bounds");
17393
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1870
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1871
        size_t young_live = young_gen->used_in_bytes();
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1872
        size_t eden_live = young_gen->eden_space()->used_in_bytes();
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1873
        size_t old_live = old_gen->used_in_bytes();
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1874
        size_t cur_eden = young_gen->eden_space()->capacity_in_bytes();
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1875
        size_t max_old_gen_size = old_gen->max_gen_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
        size_t max_eden_size = young_gen->max_size() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
          young_gen->from_space()->capacity_in_bytes() -
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
          young_gen->to_space()->capacity_in_bytes();
17393
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1879
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1880
        // Used for diagnostics
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1881
        size_policy->clear_generation_free_space_flags();
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1882
17842
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1883
        size_policy->compute_generations_free_space(young_live,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1884
                                                    eden_live,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1885
                                                    old_live,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1886
                                                    cur_eden,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1887
                                                    max_old_gen_size,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1888
                                                    max_eden_size,
0d11fa49f81f 8007762: Rename a bunch of methods in size policy across collectors
tamao
parents: 17627
diff changeset
  1889
                                                    true /* full gc*/);
17393
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1890
54085
ab87b06dfdc0 8212206: Refactor AdaptiveSizePolicy to separate out code related to GC overhead
manc
parents: 53726
diff changeset
  1891
        size_policy->check_gc_overhead_limit(eden_live,
17393
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1892
                                             max_old_gen_size,
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1893
                                             max_eden_size,
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1894
                                             true /* full gc*/,
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1895
                                             gc_cause,
49047
8f004146e407 8198515: Extract SoftReferencePolicy code out of CollectorPolicy
stefank
parents: 49041
diff changeset
  1896
                                             heap->soft_ref_policy());
17393
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1897
7e99f263902c 8007763: Refactoring: split up compute_generation_free_space() into two functions for class PSAdaptiveSizePolicy
tamao
parents: 17390
diff changeset
  1898
        size_policy->decay_supplemental_growth(true /* full gc*/);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1899
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1900
        heap->resize_old_gen(
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1901
          size_policy->calculated_old_free_size_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
23226
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1903
        heap->resize_young_gen(size_policy->calculated_eden_size_in_bytes(),
3a3de05bb757 7098155: Resize young gen at full collections for UseParallelGC
jmasa
parents: 22551
diff changeset
  1904
                               size_policy->calculated_survivor_size_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
      }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1906
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1907
      log_debug(gc, ergo)("AdaptiveSizeStop: collection: %d ", heap->total_collections());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
    if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
      PSGCAdaptivePolicyCounters* const counters = heap->gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
      counters->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
      counters->update_old_capacity(old_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
      counters->update_young_capacity(young_gen->capacity_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
    heap->resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22221
diff changeset
  1919
    // Resize the metaspace capacity after a collection
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1920
    MetaspaceGC::compute_new_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
47546
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
  1922
    if (log_is_enabled(Debug, gc, heap, exit)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1923
      accumulated_time()->stop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
57662
f81dbe27a7b1 8227225: ParallelGC: add subspace transitions for young gen for gc+heap=info log lines
tonyp
parents: 55740
diff changeset
  1926
    heap->print_heap_change(pre_gc_values);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1927
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
    // Track memory usage and detect low memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
    MemoryService::track_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
    heap->update_counters();
35939
05df7e64ecfc 8149035: Make the full_gc_dump() calls be recorded as part of the GC
brutisso
parents: 35901
diff changeset
  1931
05df7e64ecfc 8149035: Make the full_gc_dump() calls be recorded as part of the GC
brutisso
parents: 35901
diff changeset
  1932
    heap->post_full_gc_dump(&_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1935
#ifdef ASSERT
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1936
  for (size_t i = 0; i < ParallelGCThreads + 1; ++i) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1937
    ParCompactionManager* const cm =
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1938
      ParCompactionManager::manager_array(int(i));
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1939
    assert(cm->marking_stack()->is_empty(),       "should be empty");
38179
d2c90d6c5bf4 8155966: Assertion failures when -XX:+UseParallelGC -XX:ParallelGCThreads=1
jmasa
parents: 38170
diff changeset
  1940
    assert(cm->region_stack()->is_empty(), "Region stack " SIZE_FORMAT " is not empty", i);
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1941
  }
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1942
#endif // ASSERT
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 6759
diff changeset
  1943
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
    HandleMark hm;  // Discard invalid handles created during verification
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1946
    Universe::verify("After GC");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
  // Re-verify object start arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
  if (VerifyObjectStartArray &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
      VerifyAfterGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
    old_gen->verify_object_start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1955
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1956
    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
  1957
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 756
diff changeset
  1958
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
  NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
  collection_exit.update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11251
diff changeset
  1963
  heap->print_heap_after_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1964
  heap->trace_heap_after_gc(&_gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1965
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1966
  log_debug(gc, task, time)("VM-Thread " JLONG_FORMAT " " JLONG_FORMAT " " JLONG_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1967
                         marking_start.ticks(), compaction_start.ticks(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1968
                         collection_exit.ticks());
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  1969
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  1970
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  1971
  ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1683
diff changeset
  1972
#endif
11757
cdf6204b114a 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 11636
diff changeset
  1973
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1974
  AdaptiveSizePolicyOutput::print(size_policy, heap->total_collections());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  1975
21767
41eaa9a17059 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 20317
diff changeset
  1976
  _gc_timer.register_gc_end();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1977
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1978
  _gc_tracer.report_dense_prefix(dense_prefix(old_space_id));
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1979
  _gc_tracer.report_gc_end(_gc_timer.gc_end(), _gc_timer.time_partitions());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1980
11757
cdf6204b114a 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 11636
diff changeset
  1981
  return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
bool PSParallelCompact::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
                                             PSYoungGen* young_gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
                                             PSOldGen* old_gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  MutableSpace* const eden_space = young_gen->eden_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  assert(!eden_space->is_empty(), "eden must be non-empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  assert(young_gen->virtual_space()->alignment() ==
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
         old_gen->virtual_space()->alignment(), "alignments do not match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
57773
5cbc3bd9fdfd 8224665: Parallel GC: Use WorkGang (7: remove task manager)
lkorinth
parents: 57769
diff changeset
  1992
  // We also return false when it's a heterogeneous heap because old generation cannot absorb data from eden
53117
37930c6ba6d7 8211424: Allocation of old generation of java heap on alternate memory devices - Parallel GC
sangheki
parents: 52905
diff changeset
  1993
  // when it is allocated on different memory (example, nv-dimm) than young.
37930c6ba6d7 8211424: Allocation of old generation of java heap on alternate memory devices - Parallel GC
sangheki
parents: 52905
diff changeset
  1994
  if (!(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary) ||
54678
93f09ca4a7f8 8198505: Remove CollectorPolicy and its subclasses
stefank
parents: 54669
diff changeset
  1995
      ParallelArguments::is_heterogeneous_heap()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
  // Both generations must be completely committed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  if (young_gen->virtual_space()->uncommitted_size() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  if (old_gen->virtual_space()->uncommitted_size() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  // Figure out how much to take from eden.  Include the average amount promoted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
  // in the total; otherwise the next young gen GC will simply bail out to a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
  // full GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
  const size_t alignment = old_gen->virtual_space()->alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  const size_t eden_used = eden_space->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  const size_t promoted = (size_t)size_policy->avg_promoted()->padded_average();
46619
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46560
diff changeset
  2013
  const size_t absorb_size = align_up(eden_used + promoted, alignment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
  const size_t eden_capacity = eden_space->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  if (absorb_size >= eden_capacity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
    return false; // Must leave some space in eden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
  const size_t new_young_size = young_gen->capacity_in_bytes() - absorb_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  if (new_young_size < young_gen->min_gen_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
    return false; // Respect young gen minimum size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
51978
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2025
  log_trace(gc, ergo, heap)(" absorbing " SIZE_FORMAT "K:  "
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2026
                            "eden " SIZE_FORMAT "K->" SIZE_FORMAT "K "
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2027
                            "from " SIZE_FORMAT "K, to " SIZE_FORMAT "K "
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2028
                            "young_gen " SIZE_FORMAT "K->" SIZE_FORMAT "K ",
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2029
                            absorb_size / K,
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2030
                            eden_capacity / K, (eden_capacity - absorb_size) / K,
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2031
                            young_gen->from_space()->used_in_bytes() / K,
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2032
                            young_gen->to_space()->used_in_bytes() / K,
4756af2308a1 8210716: Detailed GC logging request misses some
manc
parents: 51959
diff changeset
  2033
                            young_gen->capacity_in_bytes() / K, new_young_size / K);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  // Fill the unused part of the old gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  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
  2037
  HeapWord* const unused_start = old_space->top();
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2038
  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
  2039
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2040
  if (unused_words > 0) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2041
    if (unused_words < CollectedHeap::min_fill_size()) {
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2042
      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
  2043
    }
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  2044
    CollectedHeap::fill_with_objects(unused_start, unused_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
  // Take the live data from eden and set both top and end in the old gen to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  // eden top.  (Need to set end because reset_after_change() mangles the region
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
  // from end to virtual_space->high() in debug builds).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
  HeapWord* const new_top = eden_space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  old_gen->virtual_space()->expand_into(young_gen->virtual_space(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
                                        absorb_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  young_gen->reset_after_change();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
  old_space->set_top(new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  old_space->set_end(new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  old_gen->reset_after_change();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
  // Update the object start array for the filler object and the data from eden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  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
  2060
  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
  2061
    start_array->allocate_block(p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
  // Could update the promoted average here, but it is not typically updated at
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
  // full GCs and the value to use is unclear.  Something like
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
  // cur_promoted_avg + absorb_size / number_of_scavenges_since_last_full_gc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  size_policy->set_bytes_absorbed_from_eden(absorb_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
50058
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2073
class PCAddThreadRootsMarkingTaskClosure : public ThreadClosure {
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2074
private:
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2075
  uint _worker_id;
50058
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2076
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2077
public:
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2078
  PCAddThreadRootsMarkingTaskClosure(uint worker_id) : _worker_id(worker_id) { }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2079
  void do_thread(Thread* thread) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2080
    assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2081
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2082
    ResourceMark rm;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2083
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2084
    ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(_worker_id);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2085
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2086
    PCMarkAndPushClosure mark_and_push_closure(cm);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2087
    MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2088
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2089
    thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2090
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2091
    // Do the real work
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2092
    cm->follow_marking_stacks();
50058
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2093
  }
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2094
};
f7e564cacfbc 8202649: Move the Parallel GC specific task creation functions out of Threads
stefank
parents: 50049
diff changeset
  2095
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2096
static void mark_from_roots_work(ParallelRootType::Value root_type, uint worker_id) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2097
  assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2098
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2099
  ParCompactionManager* cm =
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2100
    ParCompactionManager::gc_thread_compaction_manager(worker_id);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2101
  PCMarkAndPushClosure mark_and_push_closure(cm);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2102
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2103
  switch (root_type) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2104
    case ParallelRootType::universe:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2105
      Universe::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2106
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2107
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2108
    case ParallelRootType::jni_handles:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2109
      JNIHandles::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2110
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2111
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2112
    case ParallelRootType::object_synchronizer:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2113
      ObjectSynchronizer::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2114
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2115
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2116
    case ParallelRootType::management:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2117
      Management::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2118
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2119
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2120
    case ParallelRootType::jvmti:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2121
      JvmtiExport::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2122
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2123
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2124
    case ParallelRootType::system_dictionary:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2125
      SystemDictionary::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2126
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2127
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2128
    case ParallelRootType::class_loader_data:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2129
      {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2130
        CLDToOopClosure cld_closure(&mark_and_push_closure, ClassLoaderData::_claim_strong);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2131
        ClassLoaderDataGraph::always_strong_cld_do(&cld_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2132
      }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2133
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2134
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2135
    case ParallelRootType::code_cache:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2136
      // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2137
      //ScavengableNMethods::scavengable_nmethods_do(CodeBlobToOopClosure(&mark_and_push_closure));
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2138
      AOTLoader::oops_do(&mark_and_push_closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2139
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2140
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2141
    case ParallelRootType::sentinel:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2142
    DEBUG_ONLY(default:) // DEBUG_ONLY hack will create compile error on release builds (-Wswitch) and runtime check on debug builds
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2143
      fatal("Bad enumeration value: %u", root_type);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2144
      break;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2145
  }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2146
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2147
  // Do the real work
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2148
  cm->follow_marking_stacks();
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2149
}
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2150
57767
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2151
static void steal_marking_work(ParallelTaskTerminator& terminator, uint worker_id) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2152
  assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2153
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2154
  ParCompactionManager* cm =
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2155
    ParCompactionManager::gc_thread_compaction_manager(worker_id);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2156
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2157
  oop obj = NULL;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2158
  ObjArrayTask task;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2159
  do {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2160
    while (ParCompactionManager::steal_objarray(worker_id,  task)) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2161
      cm->follow_array((objArrayOop)task.obj(), task.index());
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2162
      cm->follow_marking_stacks();
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2163
    }
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2164
    while (ParCompactionManager::steal(worker_id, obj)) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2165
      cm->follow_contents(obj);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2166
      cm->follow_marking_stacks();
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2167
    }
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2168
  } while (!terminator.offer_termination());
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2169
}
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2170
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2171
class MarkFromRootsTask : public AbstractGangTask {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2172
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2173
  StrongRootsScope _strong_roots_scope; // needed for Threads::possibly_parallel_threads_do
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2174
  SequentialSubTasksDone _subtasks;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2175
  TaskTerminator _terminator;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2176
  uint _active_workers;
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2177
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2178
public:
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2179
  MarkFromRootsTask(uint active_workers) :
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2180
      AbstractGangTask("MarkFromRootsTask"),
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2181
      _strong_roots_scope(active_workers),
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2182
      _subtasks(),
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2183
      _terminator(active_workers, ParCompactionManager::stack_array()),
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2184
      _active_workers(active_workers) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2185
    _subtasks.set_n_threads(active_workers);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2186
    _subtasks.set_n_tasks(ParallelRootType::sentinel);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2187
  }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2188
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2189
  virtual void work(uint worker_id) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2190
    for (uint task = 0; _subtasks.try_claim_task(task); /*empty*/ ) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2191
      mark_from_roots_work(static_cast<ParallelRootType::Value>(task), worker_id);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2192
    }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2193
    _subtasks.all_tasks_completed();
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2194
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2195
    PCAddThreadRootsMarkingTaskClosure closure(worker_id);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2196
    Threads::possibly_parallel_threads_do(true /*parallel */, &closure);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2197
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2198
    if (_active_workers > 1) {
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2199
      steal_marking_work(*_terminator.terminator(), worker_id);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2200
    }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2201
  }
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2202
};
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2203
57767
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2204
class PCRefProcTask : public AbstractGangTask {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2205
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2206
  ProcessTask& _task;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2207
  uint _ergo_workers;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2208
  TaskTerminator _terminator;
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2209
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2210
public:
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2211
  PCRefProcTask(ProcessTask& task, uint ergo_workers) :
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2212
      AbstractGangTask("PCRefProcTask"),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2213
      _task(task),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2214
      _ergo_workers(ergo_workers),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2215
      _terminator(_ergo_workers, ParCompactionManager::stack_array()) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2216
  }
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2217
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2218
  virtual void work(uint worker_id) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2219
    ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2220
    assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2221
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2222
    ParCompactionManager* cm =
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2223
      ParCompactionManager::gc_thread_compaction_manager(worker_id);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2224
    PCMarkAndPushClosure mark_and_push_closure(cm);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2225
    ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2226
    _task.work(worker_id, *PSParallelCompact::is_alive_closure(),
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2227
               mark_and_push_closure, follow_stack_closure);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2228
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2229
    steal_marking_work(*_terminator.terminator(), worker_id);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2230
  }
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2231
};
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2232
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2233
class RefProcTaskExecutor: public AbstractRefProcTaskExecutor {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2234
  void execute(ProcessTask& process_task, uint ergo_workers) {
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2235
    assert(ParallelScavengeHeap::heap()->workers().active_workers() == ergo_workers,
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2236
           "Ergonomically chosen workers (%u) must be equal to active workers (%u)",
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2237
           ergo_workers, ParallelScavengeHeap::heap()->workers().active_workers());
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2238
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2239
    PCRefProcTask task(process_task, ergo_workers);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2240
    ParallelScavengeHeap::heap()->workers().run_task(&task);
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2241
  }
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2242
};
b3e44e1b135d 8224659: Parallel GC: Use WorkGang (1: PCRefProcTask)
lkorinth
parents: 57662
diff changeset
  2243
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
void PSParallelCompact::marking_phase(ParCompactionManager* cm,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2245
                                      bool maximum_heap_compaction,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2246
                                      ParallelOldTracer *gc_tracer) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
  // Recursively traverse all live objects and mark them
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2248
  GCTraceTime(Info, gc, phases) tm("Marking Phase", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  2250
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
57773
5cbc3bd9fdfd 8224665: Parallel GC: Use WorkGang (7: remove task manager)
lkorinth
parents: 57769
diff changeset
  2251
  uint active_gc_threads = ParallelScavengeHeap::heap()->workers().active_workers();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
52118
49f627781c2a 8211446: Replace oop_pc_follow_contents with oop_iterate and closure
lkorinth
parents: 51978
diff changeset
  2253
  PCMarkAndPushClosure mark_and_push_closure(cm);
30556
750fee2bdb45 8078345: Move PSParallelCompact::mark_and_push to ParCompactionManager
stefank
parents: 30555
diff changeset
  2254
  ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2256
  // Need new claim bits before marking starts.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2257
  ClassLoaderDataGraph::clear_claimed_marks();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2258
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2260
    GCTraceTime(Debug, gc, phases) tm("Par Mark", &_gc_timer);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2261
57768
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2262
    MarkFromRootsTask task(active_gc_threads);
fc82b6cb8b14 8224660: Parallel GC: Use WorkGang (2: MarksFromRootsTask)
lkorinth
parents: 57767
diff changeset
  2263
    ParallelScavengeHeap::heap()->workers().run_task(&task);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
  // Process reference objects found during marking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2268
    GCTraceTime(Debug, gc, phases) tm("Reference Processing", &_gc_timer);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2269
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2270
    ReferenceProcessorStats stats;
50396
7f48bff40a9a 8204094: assert(worker_i < _length) failed: Worker 15 is greater than max: 11 at ReferenceProcessorPhaseTimes
sangheki
parents: 50297
diff changeset
  2271
    ReferenceProcessorPhaseTimes pt(&_gc_timer, ref_processor()->max_num_queues());
50500
ade54c345982 8204617: ParallelGC parallel reference processing does not set MT degree in reference processor
tschatzl
parents: 50396
diff changeset
  2272
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
    if (ref_processor()->processing_is_mt()) {
50500
ade54c345982 8204617: ParallelGC parallel reference processing does not set MT degree in reference processor
tschatzl
parents: 50396
diff changeset
  2274
      ref_processor()->set_active_mt_degree(active_gc_threads);
ade54c345982 8204617: ParallelGC parallel reference processing does not set MT degree in reference processor
tschatzl
parents: 50396
diff changeset
  2275
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
      RefProcTaskExecutor task_executor;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2277
      stats = ref_processor()->process_discovered_references(
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1408
diff changeset
  2278
        is_alive_closure(), &mark_and_push_closure, &follow_stack_closure,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46701
diff changeset
  2279
        &task_executor, &pt);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
    } else {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2281
      stats = ref_processor()->process_discovered_references(
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2282
        is_alive_closure(), &mark_and_push_closure, &follow_stack_closure, NULL,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46701
diff changeset
  2283
        &pt);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
    }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2285
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2286
    gc_tracer->report_gc_reference_stats(stats);
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46701
diff changeset
  2287
    pt.print_all_references();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
47676
b1c020fc35a3 8189748: More precise closures for WeakProcessor::weak_oops_do calls
stefank
parents: 47648
diff changeset
  2290
  // This is the point where the entire marking should have completed.
b1c020fc35a3 8189748: More precise closures for WeakProcessor::weak_oops_do calls
stefank
parents: 47648
diff changeset
  2291
  assert(cm->marking_stacks_empty(), "Marking should have completed");
b1c020fc35a3 8189748: More precise closures for WeakProcessor::weak_oops_do calls
stefank
parents: 47648
diff changeset
  2292
47648
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
  2293
  {
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
  2294
    GCTraceTime(Debug, gc, phases) tm("Weak Processing", &_gc_timer);
47676
b1c020fc35a3 8189748: More precise closures for WeakProcessor::weak_oops_do calls
stefank
parents: 47648
diff changeset
  2295
    WeakProcessor::weak_oops_do(is_alive_closure(), &do_nothing_cl);
47648
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
  2296
  }
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
  2297
37140
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2298
  {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2299
    GCTraceTime(Debug, gc, phases) tm_m("Class Unloading", &_gc_timer);
37140
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2300
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2301
    // Follow system dictionary roots and unload classes.
50297
580744d900c8 8202813: Move vm_weak processing from SystemDictionary to WeakProcessor
coleenp
parents: 50277
diff changeset
  2302
    bool purged_class = SystemDictionary::do_unloading(&_gc_timer);
37140
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2303
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2304
    // Unload nmethods.
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2305
    CodeCache::do_unloading(is_alive_closure(), purged_class);
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2306
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2307
    // Prune dead klasses from subklass/sibling/implementor lists.
49969
8624981f1ffa 8202447: Fix unloading_occurred to mean unloading_occurred
coleenp
parents: 49967
diff changeset
  2308
    Klass::clean_weak_klass_links(purged_class);
54669
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
  2309
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
  2310
    // Clean JVMCI metadata handles.
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
  2311
    JVMCI_ONLY(JVMCI::do_unloading(purged_class));
37140
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2312
  }
b62549ead2cf 8027423: Parallel compact GC class unloading measurement includes symbol and string table time
stefank
parents: 37106
diff changeset
  2313
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  2314
  _gc_tracer.report_object_count_after_gc(is_alive_closure());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2317
void PSParallelCompact::adjust_roots(ParCompactionManager* cm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  // Adjust the pointers to reflect the new locations
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2319
  GCTraceTime(Info, gc, phases) tm("Adjust Roots", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2321
  // Need new claim bits when tracing through and adjusting pointers.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2322
  ClassLoaderDataGraph::clear_claimed_marks();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2323
52119
88916200bdd7 8211447: Replace oop_pc_update_pointers with oop_iterate and closure
lkorinth
parents: 52118
diff changeset
  2324
  PCAdjustPointerClosure oop_closure(cm);
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2325
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
  // General strong roots.
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2327
  Universe::oops_do(&oop_closure);
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2328
  JNIHandles::oops_do(&oop_closure);   // Global (strong) JNI handles
38074
8475fdc6dcc3 8154580: Save mirror in interpreter frame to enable cleanups of CLDClosure
coleenp
parents: 37462
diff changeset
  2329
  Threads::oops_do(&oop_closure, NULL);
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2330
  ObjectSynchronizer::oops_do(&oop_closure);
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2331
  Management::oops_do(&oop_closure);
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2332
  JvmtiExport::oops_do(&oop_closure);
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2333
  SystemDictionary::oops_do(&oop_closure);
52141
de6dc206a92b 8210330: Make CLD claiming allow multiple claim bits
eosterlund
parents: 52119
diff changeset
  2334
  CLDToOopClosure cld_closure(&oop_closure, ClassLoaderData::_claim_strong);
51470
84d3126858d5 8209738: Remove ClassLoaderDataGraph::*oops_do functions
coleenp
parents: 51332
diff changeset
  2335
  ClassLoaderDataGraph::cld_do(&cld_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
  // Now adjust pointers in remaining weak roots.  (All of which should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
  // have been cleared if they pointed to non-surviving objects.)
47648
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47634
diff changeset
  2339
  WeakProcessor::oops_do(&oop_closure);
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2340
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2341
  CodeBlobToOopClosure adjust_from_blobs(&oop_closure, CodeBlobToOopClosure::FixRelocations);
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
  2342
  CodeCache::blobs_do(&adjust_from_blobs);
54669
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
  2343
  AOT_ONLY(AOTLoader::oops_do(&oop_closure);)
ad45b3802d4e 8220623: [JVMCI] Update JVMCI to support JVMCI based Compiler compiled into shared library
kvn
parents: 54264
diff changeset
  2344
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2345
  ref_processor()->weak_oops_do(&oop_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
  // Roots were visited so references into the young gen in roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
  // may have been scanned.  Process them also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
  // Should the reference processor have a span that excludes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
  // young gen objects?
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  2350
  PSScavenge::reference_processor()->weak_oops_do(&oop_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2353
// Helper class to print 8 region numbers per line and then print the total at the end.
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2354
class FillableRegionLogger : public StackObj {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2355
private:
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 37146
diff changeset
  2356
  Log(gc, compaction) log;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2357
  static const int LineLength = 8;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2358
  size_t _regions[LineLength];
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2359
  int _next_index;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2360
  bool _enabled;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2361
  size_t _total_regions;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2362
public:
51332
c25572739e7c 8208669: GC changes to allow enabling -Wreorder
tschatzl
parents: 50752
diff changeset
  2363
  FillableRegionLogger() : _next_index(0), _enabled(log_develop_is_enabled(Trace, gc, compaction)), _total_regions(0) { }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2364
  ~FillableRegionLogger() {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2365
    log.trace(SIZE_FORMAT " initially fillable regions", _total_regions);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2366
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2367
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2368
  void print_line() {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2369
    if (!_enabled || _next_index == 0) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2370
      return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2371
    }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2372
    FormatBuffer<> line("Fillable: ");
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2373
    for (int i = 0; i < _next_index; i++) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2374
      line.append(" " SIZE_FORMAT_W(7), _regions[i]);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2375
    }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2376
    log.trace("%s", line.buffer());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2377
    _next_index = 0;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2378
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2379
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2380
  void handle(size_t region) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2381
    if (!_enabled) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2382
      return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2383
    }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2384
    _regions[_next_index++] = region;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2385
    if (_next_index == LineLength) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2386
      print_line();
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2387
    }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2388
    _total_regions++;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2389
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2390
};
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2391
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2392
void PSParallelCompact::prepare_region_draining_tasks(uint parallel_gc_threads)
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2393
{
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2394
  GCTraceTime(Trace, gc, phases) tm("Drain Task Setup", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
  2396
  // Find the threads that are active
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2397
  uint worker_id = 0;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
  2398
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2399
  // Find all regions that are available (can be filled immediately) and
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
  // 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
  2401
  // order (high to low) so the regions will be removed in ascending order.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
  const ParallelCompactData& sd = PSParallelCompact::summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2405
  // id + 1 is used to test termination so unsigned  can
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2406
  // be used with an old_space_id == 0.
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2407
  FillableRegionLogger region_logger;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2408
  for (unsigned int id = to_space_id; id + 1 > old_space_id; --id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
    SpaceInfo* const space_info = _space_info + id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
    MutableSpace* const space = space_info->space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
    HeapWord* const new_top = space_info->new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2413
    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
  2414
    const size_t end_region =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2415
      sd.addr_to_region_idx(sd.region_align_up(new_top));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2416
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2417
    for (size_t cur = end_region - 1; cur + 1 > beg_region; --cur) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2418
      if (sd.region(cur)->claim_unsafe()) {
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2419
        ParCompactionManager* cm = ParCompactionManager::manager_array(worker_id);
38170
ff88a25a7799 8150994: UseParallelGC fails with UseDynamicNumberOfGCThreads with specjbb2005
jmasa
parents: 38149
diff changeset
  2420
        cm->region_stack()->push(cur);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2421
        region_logger.handle(cur);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10670
diff changeset
  2422
        // Assign regions to tasks in round-robin fashion.
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2423
        if (++worker_id == parallel_gc_threads) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2424
          worker_id = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
    }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2428
    region_logger.print_line();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2432
class TaskQueue : StackObj {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2433
  volatile uint _counter;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2434
  uint _size;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2435
  uint _insert_index;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2436
  PSParallelCompact::UpdateDensePrefixTask* _backing_array;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2437
public:
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2438
  explicit TaskQueue(uint size) : _counter(0), _size(size), _insert_index(0), _backing_array(NULL) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2439
    _backing_array = NEW_C_HEAP_ARRAY(PSParallelCompact::UpdateDensePrefixTask, _size, mtGC);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2440
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2441
  ~TaskQueue() {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2442
    assert(_counter >= _insert_index, "not all queue elements were claimed");
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2443
    FREE_C_HEAP_ARRAY(T, _backing_array);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2444
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2445
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2446
  void push(const PSParallelCompact::UpdateDensePrefixTask& value) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2447
    assert(_insert_index < _size, "too small backing array");
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2448
    _backing_array[_insert_index++] = value;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2449
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2450
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2451
  bool try_claim(PSParallelCompact::UpdateDensePrefixTask& reference) {
59249
29b0d0b61615 8234737: Harmonize parameter order in Atomic - add
stefank
parents: 59008
diff changeset
  2452
    uint claimed = Atomic::add(&_counter, 1u) - 1; // -1 is so that we start with zero
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2453
    if (claimed < _insert_index) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2454
      reference = _backing_array[claimed];
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2455
      return true;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2456
    } else {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2457
      return false;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2458
    }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2459
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2460
};
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2461
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
#define PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2464
void PSParallelCompact::enqueue_dense_prefix_tasks(TaskQueue& task_queue,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2465
                                                   uint parallel_gc_threads) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2466
  GCTraceTime(Trace, gc, phases) tm("Dense Prefix Task Setup", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  ParallelCompactData& sd = PSParallelCompact::summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
  // Iterate over all the spaces adding tasks for updating
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2471
  // regions in the dense prefix.  Assume that 1 gc thread
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
  // will work on opening the gaps and the remaining gc threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
  // will work on the dense prefix.
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2474
  unsigned int space_id;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2475
  for (space_id = old_space_id; space_id < last_space_id; ++ space_id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
    HeapWord* const dense_prefix_end = _space_info[space_id].dense_prefix();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
    const MutableSpace* const space = _space_info[space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
    if (dense_prefix_end == space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
      // There is no dense prefix for this space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2484
    // The dense prefix is before this region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2485
    size_t region_index_end_dense_prefix =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2486
        sd.addr_to_region_idx(dense_prefix_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2487
    RegionData* const dense_prefix_cp =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2488
      sd.region(region_index_end_dense_prefix);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
    assert(dense_prefix_end == space->end() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
           dense_prefix_cp->available() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
           dense_prefix_cp->claimed(),
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2492
           "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
  2493
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2494
    size_t region_index_start = sd.addr_to_region_idx(space->bottom());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
    // Is there dense prefix work?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2497
    size_t total_dense_prefix_regions =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2498
      region_index_end_dense_prefix - region_index_start;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2499
    // How many regions of the dense prefix should be given to
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
    // each thread?
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2501
    if (total_dense_prefix_regions > 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
      uint tasks_for_dense_prefix = 1;
9178
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2503
      if (total_dense_prefix_regions <=
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2504
          (parallel_gc_threads * PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING)) {
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2505
        // Don't over partition.  This assumes that
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2506
        // PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING is a small integer value
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2507
        // so there are not many regions to process.
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2508
        tasks_for_dense_prefix = parallel_gc_threads;
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2509
      } else {
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2510
        // Over partition
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2511
        tasks_for_dense_prefix = parallel_gc_threads *
1a022d4f1bc3 6841742: par compact - remove unused/unsupported options
jcoomes
parents: 8688
diff changeset
  2512
          PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
      }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2514
      size_t regions_per_thread = total_dense_prefix_regions /
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
        tasks_for_dense_prefix;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2516
      // Give each thread at least 1 region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2517
      if (regions_per_thread == 0) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2518
        regions_per_thread = 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
      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
  2522
        if (region_index_start >= region_index_end_dense_prefix) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
        }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2525
        // region_index_end is not processed
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2526
        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
  2527
                                       region_index_end_dense_prefix);
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2528
        task_queue.push(UpdateDensePrefixTask(SpaceId(space_id),
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2529
                                              region_index_start,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2530
                                              region_index_end));
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2531
        region_index_start = region_index_end;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
    // This gets any part of the dense prefix that did not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
    // fit evenly.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2536
    if (region_index_start < region_index_end_dense_prefix) {
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2537
      task_queue.push(UpdateDensePrefixTask(SpaceId(space_id),
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2538
                                            region_index_start,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2539
                                            region_index_end_dense_prefix));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
    }
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2541
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2544
#ifdef ASSERT
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2545
// Write a histogram of the number of times the block table was filled for a
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2546
// region.
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2547
void PSParallelCompact::write_block_fill_histogram()
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2548
{
35901
f5028c67e7cb 8147918: Rename develop_log_is_enabled() to log_develop_is_enabled()
pliden
parents: 35877
diff changeset
  2549
  if (!log_develop_is_enabled(Trace, gc, compaction)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2550
    return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2551
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2552
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 37146
diff changeset
  2553
  Log(gc, compaction) log;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2554
  ResourceMark rm;
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46625
diff changeset
  2555
  LogStream ls(log.trace());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46625
diff changeset
  2556
  outputStream* out = &ls;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2557
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2558
  typedef ParallelCompactData::RegionData rd_t;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2559
  ParallelCompactData& sd = summary_data();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2560
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2561
  for (unsigned int id = old_space_id; id < last_space_id; ++id) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2562
    MutableSpace* const spc = _space_info[id].space();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2563
    if (spc->bottom() != spc->top()) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2564
      const rd_t* const beg = sd.addr_to_region_ptr(spc->bottom());
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2565
      HeapWord* const top_aligned_up = sd.region_align_up(spc->top());
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2566
      const rd_t* const end = sd.addr_to_region_ptr(top_aligned_up);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2567
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2568
      size_t histo[5] = { 0, 0, 0, 0, 0 };
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2569
      const size_t histo_len = sizeof(histo) / sizeof(size_t);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2570
      const size_t region_cnt = pointer_delta(end, beg, sizeof(rd_t));
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2571
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2572
      for (const rd_t* cur = beg; cur < end; ++cur) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2573
        ++histo[MIN2(cur->blocks_filled_count(), histo_len - 1)];
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2574
      }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2575
      out->print("Block fill histogram: %u %-4s" SIZE_FORMAT_W(5), id, space_names[id], region_cnt);
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2576
      for (size_t i = 0; i < histo_len; ++i) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2577
        out->print(" " SIZE_FORMAT_W(5) " %5.1f%%",
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2578
                   histo[i], 100.0 * histo[i] / region_cnt);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2579
      }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2580
      out->cr();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2581
    }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2582
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2583
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2584
#endif // #ifdef ASSERT
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2585
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2586
static void compaction_with_stealing_work(ParallelTaskTerminator* terminator, uint worker_id) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2587
  assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2588
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2589
  ParCompactionManager* cm =
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2590
    ParCompactionManager::gc_thread_compaction_manager(worker_id);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2591
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2592
  // Drain the stacks that have been preloaded with regions
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2593
  // that are ready to fill.
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2594
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2595
  cm->drain_region_stacks();
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2596
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2597
  guarantee(cm->region_stack()->is_empty(), "Not empty");
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2598
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2599
  size_t region_index = 0;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2600
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2601
  while (true) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2602
    if (ParCompactionManager::steal(worker_id, region_index)) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2603
      PSParallelCompact::fill_and_update_region(cm, region_index);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2604
      cm->drain_region_stacks();
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2605
    } else {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2606
      if (terminator->offer_termination()) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2607
        break;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2608
      }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2609
      // Go around again.
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2610
    }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2611
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2612
  return;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2613
}
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2614
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2615
class UpdateDensePrefixAndCompactionTask: public AbstractGangTask {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2616
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2617
  TaskQueue& _tq;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2618
  TaskTerminator _terminator;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2619
  uint _active_workers;
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2620
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2621
public:
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2622
  UpdateDensePrefixAndCompactionTask(TaskQueue& tq, uint active_workers) :
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2623
      AbstractGangTask("UpdateDensePrefixAndCompactionTask"),
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2624
      _tq(tq),
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2625
      _terminator(active_workers, ParCompactionManager::region_array()),
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2626
      _active_workers(active_workers) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2627
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2628
  virtual void work(uint worker_id) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2629
    ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(worker_id);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2630
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2631
    for (PSParallelCompact::UpdateDensePrefixTask task; _tq.try_claim(task); /* empty */) {
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2632
      PSParallelCompact::update_and_deadwood_in_dense_prefix(cm,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2633
                                                             task._space_id,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2634
                                                             task._region_index_start,
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2635
                                                             task._region_index_end);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2636
    }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2637
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2638
    // Once a thread has drained it's stack, it should try to steal regions from
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2639
    // other threads.
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2640
    compaction_with_stealing_work(_terminator.terminator(), worker_id);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2641
  }
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2642
};
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2643
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
void PSParallelCompact::compact() {
37146
209e0fe518bb 8152100: Rework and unify the GC phase logging
stefank
parents: 37140
diff changeset
  2645
  GCTraceTime(Info, gc, phases) tm("Compaction Phase", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  2647
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
  PSOldGen* old_gen = heap->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
  old_gen->start_array()->reset();
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2650
  uint active_gc_threads = ParallelScavengeHeap::heap()->workers().active_workers();
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2651
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2652
  // for [0..last_space_id)
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2653
  //     for [0..active_gc_threads * PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING)
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2654
  //         push
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2655
  //     push
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2656
  //
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2657
  // max push count is thus: last_space_id * (active_gc_threads * PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING + 1)
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2658
  TaskQueue task_queue(last_space_id * (active_gc_threads * PAR_OLD_DENSE_PREFIX_OVER_PARTITIONING + 1));
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2659
  prepare_region_draining_tasks(active_gc_threads);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2660
  enqueue_dense_prefix_tasks(task_queue, active_gc_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
  {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2663
    GCTraceTime(Trace, gc, phases) tm("Par Compact", &_gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
57769
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2665
    UpdateDensePrefixAndCompactionTask task(task_queue, active_gc_threads);
f7ca942a2714 8224661: Parallel GC: Use WorkGang (3: UpdateDensePrefixAndCompactionTask)
lkorinth
parents: 57768
diff changeset
  2666
    ParallelScavengeHeap::heap()->workers().run_task(&task);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
#ifdef  ASSERT
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2669
    // Verify that all regions have been processed before the deferred updates.
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.
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2678
    GCTraceTime(Trace, gc, phases) tm("Deferred Updates", &_gc_timer);
1
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
  }
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  2684
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34666
diff changeset
  2685
  DEBUG_ONLY(write_block_fill_histogram());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
void PSParallelCompact::verify_complete(SpaceId space_id) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2690
  // 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
  2691
  // and all Regions between new_top() and top() should be available (i.e.,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  // should have been emptied).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
  SpaceInfo si = _space_info[space_id];
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2695
  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
  2696
  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
  2697
  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
  2698
  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
  2699
  const size_t old_top_region = sd.addr_to_region_idx(old_top_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
  bool issued_a_warning = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2703
  size_t cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2704
  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
  2705
    const RegionData* const c = sd.region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
    if (!c->completed()) {
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 36581
diff changeset
  2707
      log_warning(gc)("region " SIZE_FORMAT " not filled: destination_count=%u",
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 36581
diff changeset
  2708
                      cur_region, c->destination_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
      issued_a_warning = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2713
  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
  2714
    const RegionData* const c = sd.region(cur_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
    if (!c->available()) {
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 36581
diff changeset
  2716
      log_warning(gc)("region " SIZE_FORMAT " not empty: destination_count=%u",
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 36581
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
29792
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2728
inline void UpdateOnlyClosure::do_addr(HeapWord* addr) {
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2729
  _start_array->allocate_block(addr);
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2730
  compaction_manager()->update_contents(oop(addr));
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2731
}
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2732
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2733
// Update interior oops in the ranges of regions [beg_region, end_region).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
                                                       SpaceId space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2737
                                                       size_t beg_region,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2738
                                                       size_t end_region) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
  ParMarkBitMap* const mbm = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2742
  HeapWord* beg_addr = sd.region_to_addr(beg_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2743
  HeapWord* const end_addr = sd.region_to_addr(end_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2744
  assert(beg_region <= end_region, "bad region range");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
  assert(end_addr <= dense_prefix(space_id), "not in the dense prefix");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
#ifdef  ASSERT
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2748
  // Claim the regions to avoid triggering an assert when they are marked as
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
  // filled.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2750
  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
  2751
    assert(sd.region(claim_region)->claim_unsafe(), "claim() failed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
  if (beg_addr != space(space_id)->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
    // 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
  2757
    // 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
  2758
    // 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
  2759
    // 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
  2760
    // 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
  2761
    // 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
  2762
    // space.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
    assert(beg_addr > space(space_id)->bottom(), "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2764
    const RegionData* const cp = sd.region(beg_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
    if (cp->partial_obj_size() != 0) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2766
      beg_addr = sd.partial_obj_end(beg_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
    } else if (dead_space_crosses_boundary(cp, mbm->addr_to_bit(beg_addr))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
      beg_addr = mbm->find_obj_beg(beg_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
  if (beg_addr < end_addr) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2773
    // A live object or block of dead space starts in this range of Regions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
     HeapWord* const dense_prefix_end = dense_prefix(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
    // Create closures and iterate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
    UpdateOnlyClosure update_closure(mbm, cm, space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
    FillClosure fill_closure(cm, space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
    ParMarkBitMap::IterationStatus status;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
    status = mbm->iterate(&update_closure, &fill_closure, beg_addr, end_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
                          dense_prefix_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
    if (status == ParMarkBitMap::incomplete) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
      update_closure.do_addr(update_closure.source());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2787
  // Mark the regions as filled.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2788
  RegionData* const beg_cp = sd.region(beg_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2789
  RegionData* const end_cp = sd.region(end_region);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2790
  for (RegionData* cp = beg_cp; cp < end_cp; ++cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
    cp->set_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
// Return the SpaceId for the space containing addr.  If addr is not in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
// heap, last_space_id is returned.  In debug mode it expects the address to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
// in the heap and asserts such.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
PSParallelCompact::SpaceId PSParallelCompact::space_id(HeapWord* addr) {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30150
diff changeset
  2799
  assert(ParallelScavengeHeap::heap()->is_in_reserved(addr), "addr not in the heap");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2801
  for (unsigned int id = old_space_id; id < last_space_id; ++id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
    if (_space_info[id].space()->contains(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
      return SpaceId(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
  assert(false, "no space contains the addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
  return last_space_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
void PSParallelCompact::update_deferred_objects(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
                                                SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2813
  assert(id < last_space_id, "bad space id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
  ParallelCompactData& sd = summary_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
  const SpaceInfo* const space_info = _space_info + id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
  ObjectStartArray* const start_array = space_info->start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
  const MutableSpace* const space = space_info->space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
  assert(space_info->dense_prefix() >= space->bottom(), "dense_prefix not set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
  HeapWord* const beg_addr = space_info->dense_prefix();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2822
  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
  2823
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2824
  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
  2825
  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
  2826
  const RegionData* cur_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2827
  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
  2828
    HeapWord* const addr = cur_region->deferred_obj_addr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
    if (addr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
      if (start_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
        start_array->allocate_block(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
      }
29792
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  2833
      cm->update_contents(oop(addr));
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
  2834
      assert(oopDesc::is_oop_or_null(oop(addr)), "Expected an oop or NULL at " PTR_FORMAT, p2i(oop(addr)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
// Skip over count live words starting from beg, and return the address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
// next live word.  Unless marked, the word corresponding to beg is assumed to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
// be dead.  Callers must either ensure beg does not correspond to the middle of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
// an object, or account for those live words in some other way.  Callers must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
// also ensure that there are enough live words in the range [beg, end) to skip.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
PSParallelCompact::skip_live_words(HeapWord* beg, HeapWord* end, size_t count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
  assert(count > 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
  ParMarkBitMap* m = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
  idx_t bits_to_skip = m->words_to_bits(count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
  idx_t cur_beg = m->addr_to_bit(beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
  const idx_t search_end = BitMap::word_align_up(m->addr_to_bit(end));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
    cur_beg = m->find_obj_beg(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
    idx_t cur_end = m->find_obj_end(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
    const size_t obj_bits = cur_end - cur_beg + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
    if (obj_bits > bits_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
      return m->bit_to_addr(cur_beg + bits_to_skip);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
    bits_to_skip -= obj_bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
    cur_beg = cur_end + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
  } while (bits_to_skip > 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
  // Skipping the desired number of words landed just past the end of an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
  // Find the start of the next object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
  cur_beg = m->find_obj_beg(cur_beg, search_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
  assert(cur_beg < m->addr_to_bit(end), "not enough live words to skip");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
  return m->bit_to_addr(cur_beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2872
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
  2873
                                            SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2874
                                            size_t src_region_idx)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
{
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2876
  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
  2877
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2878
  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
  2879
  if (split_info.dest_region_addr() == dest_addr) {
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2880
    // 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
  2881
    // be copied to dest_addr.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2882
    return split_info.first_src_addr();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2883
  }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2884
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  2885
  const ParallelCompactData& sd = summary_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
  ParMarkBitMap* const bitmap = mark_bitmap();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2887
  const size_t RegionSize = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2888
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2889
  assert(sd.is_region_aligned(dest_addr), "not aligned");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2890
  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
  2891
  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
  2892
  HeapWord* const src_region_destination = src_region_ptr->destination();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2893
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2894
  assert(dest_addr >= src_region_destination, "wrong src region");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2895
  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
  2896
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2897
  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
  2898
  HeapWord* const src_region_end = src_region_beg + RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2899
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2900
  HeapWord* addr = src_region_beg;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2901
  if (dest_addr == src_region_destination) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2902
    // Return the first live word in the source region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
    if (partial_obj_size == 0) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2904
      addr = bitmap->find_obj_beg(addr, src_region_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2905
      assert(addr < src_region_end, "no objects start in src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
    return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
  // Must skip some live data.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2911
  size_t words_to_skip = dest_addr - src_region_destination;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2912
  assert(src_region_ptr->data_size() > words_to_skip, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
  if (partial_obj_size >= words_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    // All the live words to skip are part of the partial object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    addr += words_to_skip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
    if (partial_obj_size == words_to_skip) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
      // Find the first live word past the partial object.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2919
      addr = bitmap->find_obj_beg(addr, src_region_end);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2920
      assert(addr < src_region_end, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
    return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
  // Skip over the partial object (if any).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
  if (partial_obj_size != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
    words_to_skip -= partial_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
    addr += partial_obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2931
  // 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
  2932
  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
  2933
  assert(addr < src_region_end, "wrong src region");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
  return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
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
  2938
                                                     SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2939
                                                     size_t beg_region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
                                                     HeapWord* end_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  ParallelCompactData& sd = summary_data();
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2943
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2944
#ifdef ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2945
  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
  2946
  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
  2947
  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
  2948
         "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
  2949
  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
  2950
         "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
  2951
#endif // #ifdef ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2952
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2953
  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
  2954
  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
  2955
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2956
  // 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
  2957
  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
  2958
  RegionData* const enqueue_end =
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2959
    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
  2960
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2961
  for (RegionData* cur = beg; cur < end; ++cur) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2962
    assert(cur->data_size() > 0, "region must have live data");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
    cur->decrement_destination_count();
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  2964
    if (cur < enqueue_end && cur->available() && cur->claim()) {
5918
73b96456819a 6957084: simplify TaskQueue overflow handling
jcoomes
parents: 5702
diff changeset
  2965
      cm->push_region(sd.region(cur));
1
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
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2970
size_t PSParallelCompact::next_src_region(MoveAndUpdateClosure& closure,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2971
                                          SpaceId& src_space_id,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2972
                                          HeapWord*& src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2973
                                          HeapWord* end_addr)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2975
  typedef ParallelCompactData::RegionData RegionData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
  ParallelCompactData& sd = PSParallelCompact::summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2978
  const size_t region_size = ParallelCompactData::RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2979
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2980
  size_t src_region_idx = 0;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2981
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2982
  // 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
  2983
  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
  2984
  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
  2985
  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
  2986
  const RegionData* const top_region_ptr =
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2987
    sd.addr_to_region_ptr(top_aligned_up);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2988
  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
  2989
    ++src_region_ptr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2992
  if (src_region_ptr < top_region_ptr) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2993
    // 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
  2994
    // and the source address to match src_region_ptr.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2995
    src_region_idx = sd.region(src_region_ptr);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2996
    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
  2997
    if (src_region_addr > closure.source()) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  2998
      closure.set_source(src_region_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
    }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3000
    return src_region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3003
  // Switch to a new source space and find the first non-empty region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
  unsigned int space_id = src_space_id + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
  assert(space_id < last_space_id, "not enough spaces");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
  HeapWord* const destination = closure.destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
    MutableSpace* space = _space_info[space_id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
    HeapWord* const bottom = space->bottom();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3012
    const RegionData* const bottom_cp = sd.addr_to_region_ptr(bottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
    // Iterate over the spaces that do not compact into themselves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
    if (bottom_cp->destination() != bottom) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3016
      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
  3017
      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
  3018
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3019
      for (const RegionData* src_cp = bottom_cp; src_cp < top_cp; ++src_cp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
        if (src_cp->live_obj_size() > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
          // Found it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
          assert(src_cp->destination() == destination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
                 "first live obj in the space must match the destination");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
          assert(src_cp->partial_obj_size() == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
                 "a space cannot begin with a partial obj");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
          src_space_id = SpaceId(space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
          src_space_top = space->top();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3029
          const size_t src_region_idx = sd.region(src_cp);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3030
          closure.set_source(sd.region_to_addr(src_region_idx));
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3031
          return src_region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
          assert(src_cp->data_size() == 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  } while (++space_id < last_space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3039
  assert(false, "no source region was found");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3043
void PSParallelCompact::fill_region(ParCompactionManager* cm, size_t region_idx)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
  typedef ParMarkBitMap::IterationStatus IterationStatus;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3046
  const size_t RegionSize = ParallelCompactData::RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
  ParMarkBitMap* const bitmap = mark_bitmap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
  ParallelCompactData& sd = summary_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3049
  RegionData* const region_ptr = sd.region(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
  // Get the items needed to construct the closure.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3052
  HeapWord* dest_addr = sd.region_to_addr(region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
  SpaceId dest_space_id = space_id(dest_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
  ObjectStartArray* start_array = _space_info[dest_space_id].start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
  HeapWord* new_top = _space_info[dest_space_id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
  assert(dest_addr < new_top, "sanity");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3057
  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
  3058
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3059
  // Get the source region and related info.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3060
  size_t src_region_idx = region_ptr->source_region();
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3061
  SpaceId src_space_id = space_id(sd.region_to_addr(src_region_idx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
  HeapWord* src_space_top = _space_info[src_space_id].space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
  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
  3065
  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
  3066
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3067
  // 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
  3068
  // 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
  3069
  if (src_region_idx == region_idx) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3070
    src_region_idx += 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
  if (bitmap->is_unmarked(closure.source())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
    // The first source word is in the middle of an object; copy the remainder
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
    // of the object or as much as will fit.  The fact that pointer updates were
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
    // deferred will be noted when the object header is processed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
    HeapWord* const old_src_addr = closure.source();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
    closure.copy_partial_obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
    if (closure.is_full()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3080
      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
  3081
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3082
      region_ptr->set_deferred_obj_addr(NULL);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3083
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3087
    HeapWord* const end_addr = sd.region_align_down(closure.source());
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3088
    if (sd.region_align_down(old_src_addr) != end_addr) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3089
      // 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
  3090
      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
  3091
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3092
      // Move to the next source region, possibly switching spaces as well.  All
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
      // args except end_addr may be modified.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3094
      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
  3095
                                       end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
    HeapWord* const cur_addr = closure.source();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3101
    HeapWord* const end_addr = MIN2(sd.region_align_up(cur_addr + 1),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
                                    src_space_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
    IterationStatus status = bitmap->iterate(&closure, cur_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
    if (status == ParMarkBitMap::incomplete) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3106
      // 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
  3107
      // region.
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 5343
diff changeset
  3108
      assert(closure.source() < end_addr, "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
      HeapWord* const obj_beg = closure.source();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
      HeapWord* const range_end = MIN2(obj_beg + closure.words_remaining(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
                                       src_space_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
      HeapWord* const obj_end = bitmap->find_obj_end(obj_beg, range_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
      if (obj_end < range_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
        // The end was found; the entire object will fit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
        status = closure.do_addr(obj_beg, bitmap->obj_size(obj_beg, obj_end));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
        assert(status != ParMarkBitMap::would_overflow, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
        // The end was not found; the object will not fit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
        assert(range_end < src_space_top, "obj cannot cross space boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
        status = ParMarkBitMap::would_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
    if (status == ParMarkBitMap::would_overflow) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
      // 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
  3126
      // 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
  3127
      region_ptr->set_deferred_obj_addr(closure.destination());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
      status = closure.copy_until_full(); // copies from closure.source()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3130
      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
  3131
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3132
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
    if (status == ParMarkBitMap::full) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3137
      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
  3138
                                   closure.source());
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3139
      region_ptr->set_deferred_obj_addr(NULL);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3140
      region_ptr->set_completed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3144
    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
  3145
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3146
    // Move to the next source region, possibly switching spaces as well.  All
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
    // args except end_addr may be modified.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 1406
diff changeset
  3148
    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
  3149
                                     end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
  } while (true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3153
void PSParallelCompact::fill_blocks(size_t region_idx)
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3154
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3155
  // Fill in the block table elements for the specified region.  Each block
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3156
  // table element holds the number of live words in the region that are to the
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3157
  // left of the first object that starts in the block.  Thus only blocks in
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3158
  // which an object starts need to be filled.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3159
  //
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3160
  // The algorithm scans the section of the bitmap that corresponds to the
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3161
  // region, keeping a running total of the live words.  When an object start is
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3162
  // found, if it's the first to start in the block that contains it, the
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3163
  // current total is written to the block table element.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3164
  const size_t Log2BlockSize = ParallelCompactData::Log2BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3165
  const size_t Log2RegionSize = ParallelCompactData::Log2RegionSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3166
  const size_t RegionSize = ParallelCompactData::RegionSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3167
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3168
  ParallelCompactData& sd = summary_data();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3169
  const size_t partial_obj_size = sd.region(region_idx)->partial_obj_size();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3170
  if (partial_obj_size >= RegionSize) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3171
    return; // No objects start in this region.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3172
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3173
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3174
  // Ensure the first loop iteration decides that the block has changed.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3175
  size_t cur_block = sd.block_count();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3176
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3177
  const ParMarkBitMap* const bitmap = mark_bitmap();
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3178
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3179
  const size_t Log2BitsPerBlock = Log2BlockSize - LogMinObjAlignment;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3180
  assert((size_t)1 << Log2BitsPerBlock ==
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3181
         bitmap->words_to_bits(ParallelCompactData::BlockSize), "sanity");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3182
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3183
  size_t beg_bit = bitmap->words_to_bits(region_idx << Log2RegionSize);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3184
  const size_t range_end = beg_bit + bitmap->words_to_bits(RegionSize);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3185
  size_t live_bits = bitmap->words_to_bits(partial_obj_size);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3186
  beg_bit = bitmap->find_obj_beg(beg_bit + live_bits, range_end);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3187
  while (beg_bit < range_end) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3188
    const size_t new_block = beg_bit >> Log2BitsPerBlock;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3189
    if (new_block != cur_block) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3190
      cur_block = new_block;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3191
      sd.block(cur_block)->set_offset(bitmap->bits_to_words(live_bits));
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3192
    }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3193
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3194
    const size_t end_bit = bitmap->find_obj_end(beg_bit, range_end);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3195
    if (end_bit < range_end - 1) {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3196
      live_bits += end_bit - beg_bit + 1;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3197
      beg_bit = bitmap->find_obj_beg(end_bit + 1, range_end);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3198
    } else {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3199
      return;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3200
    }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3201
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3202
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17844
diff changeset
  3203
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
jlong PSParallelCompact::millis_since_last_gc() {
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22221
diff changeset
  3205
  // We need a monotonically non-decreasing time in ms but
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11178
diff changeset
  3206
  // os::javaTimeMillis() does not guarantee monotonicity.
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11178
diff changeset
  3207
  jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11178
diff changeset
  3208
  jlong ret_val = now - _time_of_last_gc;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
  // XXX See note in genCollectedHeap::millis_since_last_gc().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
  if (ret_val < 0) {
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 36581
diff changeset
  3211
    NOT_PRODUCT(log_warning(gc)("time warp: " JLONG_FORMAT, ret_val);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
  return ret_val;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
void PSParallelCompact::reset_millis_since_last_gc() {
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22221
diff changeset
  3218
  // We need a monotonically non-decreasing time in ms but
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11178
diff changeset
  3219
  // os::javaTimeMillis() does not guarantee monotonicity.
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11178
diff changeset
  3220
  _time_of_last_gc = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
ParMarkBitMap::IterationStatus MoveAndUpdateClosure::copy_until_full()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
  if (source() != destination()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3226
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
    Copy::aligned_conjoint_words(source(), destination(), words_remaining());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
  update_state(words_remaining());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
  assert(is_full(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
  return ParMarkBitMap::full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
void MoveAndUpdateClosure::copy_partial_obj()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
  size_t words = words_remaining();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
  HeapWord* const range_end = MIN2(source() + words, bitmap()->region_end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
  HeapWord* const end_addr = bitmap()->find_obj_end(source(), range_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
  if (end_addr < range_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
    words = bitmap()->obj_size(source(), end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  // This test is necessary; if omitted, the pointer updates to a partial object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
  // that crosses the dense prefix boundary could be overwritten.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  if (source() != destination()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3247
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
    Copy::aligned_conjoint_words(source(), destination(), words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
  update_state(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
  assert(destination() != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
  assert(bitmap()->obj_size(addr) == words, "bad size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
  _source = addr;
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  3259
  assert(PSParallelCompact::summary_data().calc_new_pointer(source(), compaction_manager()) ==
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
         destination(), "wrong destination");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
  if (words > words_remaining()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
    return ParMarkBitMap::would_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
  // The start_array must be updated even if the object is not moving.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
  if (_start_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
    _start_array->allocate_block(destination());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
  if (destination() != source()) {
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  3272
    DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
    Copy::aligned_conjoint_words(source(), destination(), words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
  oop moved_oop = (oop) destination();
29792
8c6fa07f0869 8075957: Reduce calls to the GC specific object visitors in oopDesc
stefank
parents: 29325
diff changeset
  3277
  compaction_manager()->update_contents(moved_oop);
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
  3278
  assert(oopDesc::is_oop_or_null(moved_oop), "Expected an oop or NULL at " PTR_FORMAT, p2i(moved_oop));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
  update_state(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
  assert(destination() == (HeapWord*)moved_oop + moved_oop->size(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
  return is_full() ? ParMarkBitMap::full : ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
UpdateOnlyClosure::UpdateOnlyClosure(ParMarkBitMap* mbm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
                                     ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
                                     PSParallelCompact::SpaceId space_id) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
  ParMarkBitMapClosure(mbm, cm),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
  _space_id(space_id),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
  _start_array(PSParallelCompact::start_array(space_id))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
// Updates the references in the object to their new values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
ParMarkBitMapClosure::IterationStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
UpdateOnlyClosure::do_addr(HeapWord* addr, size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
  do_addr(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
  return ParMarkBitMap::incomplete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
}
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3300
46502
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3301
FillClosure::FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3302
  ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3303
  _start_array(PSParallelCompact::start_array(space_id))
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3304
{
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3305
  assert(space_id == PSParallelCompact::old_space_id,
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3306
         "cannot use FillClosure in the young gen");
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3307
}
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42650
diff changeset
  3308
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3309
ParMarkBitMapClosure::IterationStatus
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3310
FillClosure::do_addr(HeapWord* addr, size_t size) {
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3311
  CollectedHeap::fill_with_objects(addr, size);
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3312
  HeapWord* const end = addr + size;
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3313
  do {
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3314
    _start_array->allocate_block(addr);
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3315
    addr += oop(addr)->size();
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3316
  } while (addr < end);
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3317
  return ParMarkBitMap::incomplete;
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
  3318
}