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