src/share/vm/gc_implementation/g1/g1ConcurrentMarkObjArrayProcessor.hpp

Sat, 07 Nov 2020 10:30:02 +0800

author
aoqi
date
Sat, 07 Nov 2020 10:30:02 +0800
changeset 10026
8c95980d0b66
parent 9982
72053ed6f8d4
permissions
-rw-r--r--

Added tag mips-jdk8u275-b01 for changeset d3b4d62f391f

     1 /*
     2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_GC_G1_G1CONCURRENTMARKOBJARRAYPROCESSOR_HPP
    26 #define SHARE_VM_GC_G1_G1CONCURRENTMARKOBJARRAYPROCESSOR_HPP
    28 #include "oops/oopsHierarchy.hpp"
    29 #include "memory/allocation.hpp"
    31 class CMTask;
    33 // Helper class to mark through large objArrays during marking in an efficient way.
    34 // Instead of pushing large object arrays, we push continuations onto the
    35 // mark stack. These continuations are identified by having their LSB set.
    36 // This allows incremental processing of large objects.
    37 class G1CMObjArrayProcessor VALUE_OBJ_CLASS_SPEC {
    38 private:
    39   // The bit mask for the continuation indicator of elements on the mark stack.
    40   static const size_t ArraySliceBit = 1;
    42   // Reference to the task for doing the actual work.
    43   CMTask* _task;
    45   // Encodes the given address as a continuation "oop".
    46   oop encode_array_slice(HeapWord* addr);
    47   // Remove the continuation marker from the given oop from the mark stack.
    48   HeapWord* decode_array_slice(oop value);
    50   // Push the continuation at the given address onto the mark stack.
    51   void push_array_slice(HeapWord* addr);
    53   // Process (apply the closure) on the given continuation of the given objArray.
    54   size_t process_array_slice(objArrayOop const obj, HeapWord* start_from, size_t remaining);
    55 public:
    56   static bool is_array_slice(void* obj) { return ((uintptr_t)obj & ArraySliceBit) != 0; }
    58   static bool should_be_sliced(oop obj);
    60   G1CMObjArrayProcessor(CMTask* task) : _task(task) {
    61   }
    63   // Process the given continuation "oop". Returns the number of words scanned.
    64   size_t process_slice(oop obj);
    65   // Start processing the given objArrayOop by scanning the header and pushing its
    66   // continuation.
    67   size_t process_obj(oop obj);
    68 };
    70 #endif /* SHARE_VM_GC_G1_G1CONCURRENTMARKOBJARRAYPROCESSOR_HPP */

mercurial