src/hotspot/share/gc/z/zGlobals.hpp
changeset 50525 767cdb97f103
child 51394 8ed5f86b15aa
equal deleted inserted replaced
50524:04f4e983c2f7 50525:767cdb97f103
       
     1 /*
       
     2  * Copyright (c) 2015, 2018, 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 
       
    24 #ifndef SHARE_GC_Z_ZGLOBALS_HPP
       
    25 #define SHARE_GC_Z_ZGLOBALS_HPP
       
    26 
       
    27 #include "utilities/globalDefinitions.hpp"
       
    28 #include "utilities/macros.hpp"
       
    29 #include OS_CPU_HEADER(gc/z/zGlobals)
       
    30 
       
    31 // Collector name
       
    32 const char* const ZGCName                       = "The Z Garbage Collector";
       
    33 
       
    34 // Global phase state
       
    35 extern uint32_t   ZGlobalPhase;
       
    36 const uint32_t    ZPhaseMark                    = 0;
       
    37 const uint32_t    ZPhaseMarkCompleted           = 1;
       
    38 const uint32_t    ZPhaseRelocate                = 2;
       
    39 
       
    40 // Global sequence number
       
    41 extern uint32_t   ZGlobalSeqNum;
       
    42 
       
    43 // Page types
       
    44 const uint8_t     ZPageTypeSmall                = 0;
       
    45 const uint8_t     ZPageTypeMedium               = 1;
       
    46 const uint8_t     ZPageTypeLarge                = 2;
       
    47 
       
    48 // Page size shifts
       
    49 const size_t      ZPageSizeSmallShift           = ZPlatformPageSizeSmallShift;
       
    50 const size_t      ZPageSizeMediumShift          = ZPageSizeSmallShift + 4;
       
    51 const size_t      ZPageSizeMinShift             = ZPageSizeSmallShift;
       
    52 
       
    53 // Page sizes
       
    54 const size_t      ZPageSizeSmall                = (size_t)1 << ZPageSizeSmallShift;
       
    55 const size_t      ZPageSizeMedium               = (size_t)1 << ZPageSizeMediumShift;
       
    56 const size_t      ZPageSizeMin                  = (size_t)1 << ZPageSizeMinShift;
       
    57 
       
    58 // Object size limits
       
    59 const size_t      ZObjectSizeLimitSmall         = (ZPageSizeSmall / 8);  // Allow 12.5% waste
       
    60 const size_t      ZObjectSizeLimitMedium        = (ZPageSizeMedium / 8); // Allow 12.5% waste
       
    61 
       
    62 // Object alignment shifts
       
    63 extern const int& ZObjectAlignmentSmallShift;
       
    64 const int         ZObjectAlignmentMediumShift   = ZPageSizeMediumShift - 13; // 8192 objects per page
       
    65 const int         ZObjectAlignmentLargeShift    = ZPageSizeSmallShift;
       
    66 
       
    67 // Object alignments
       
    68 extern const int& ZObjectAlignmentSmall;
       
    69 const int         ZObjectAlignmentMedium        = 1 << ZObjectAlignmentMediumShift;
       
    70 const int         ZObjectAlignmentLarge         = 1 << ZObjectAlignmentLargeShift;
       
    71 
       
    72 // Pointer part of address
       
    73 const uintptr_t   ZAddressOffsetShift           = 0;
       
    74 const uintptr_t   ZAddressOffsetBits            = ZPlatformAddressOffsetBits;
       
    75 const uintptr_t   ZAddressOffsetMask            = (((uintptr_t)1 << ZAddressOffsetBits) - 1) << ZAddressOffsetShift;
       
    76 const size_t      ZAddressOffsetMax             = (uintptr_t)1 << ZAddressOffsetBits;
       
    77 
       
    78 // Metadata part of address
       
    79 const uintptr_t   ZAddressMetadataShift         = ZPlatformAddressMetadataShift;
       
    80 const uintptr_t   ZAddressMetadataBits          = 4;
       
    81 const uintptr_t   ZAddressMetadataMask          = (((uintptr_t)1 << ZAddressMetadataBits) - 1) << ZAddressMetadataShift;
       
    82 
       
    83 // Metadata types
       
    84 const uintptr_t   ZAddressMetadataMarked0       = (uintptr_t)1 << (ZAddressMetadataShift + 0);
       
    85 const uintptr_t   ZAddressMetadataMarked1       = (uintptr_t)1 << (ZAddressMetadataShift + 1);
       
    86 const uintptr_t   ZAddressMetadataRemapped      = (uintptr_t)1 << (ZAddressMetadataShift + 2);
       
    87 const uintptr_t   ZAddressMetadataFinalizable   = (uintptr_t)1 << (ZAddressMetadataShift + 3);
       
    88 
       
    89 // Address space start/end/size
       
    90 const uintptr_t   ZAddressSpaceStart            = ZPlatformAddressSpaceStart;
       
    91 const uintptr_t   ZAddressSpaceSize             = ZPlatformAddressSpaceSize;
       
    92 const uintptr_t   ZAddressSpaceEnd              = ZAddressSpaceStart + ZAddressSpaceSize;
       
    93 
       
    94 // Cache line size
       
    95 const size_t      ZCacheLineSize                = ZPlatformCacheLineSize;
       
    96 
       
    97 // Reserved start/end
       
    98 uintptr_t ZAddressReservedStart();
       
    99 uintptr_t ZAddressReservedEnd();
       
   100 
       
   101 //
       
   102 // Good/Bad mask states
       
   103 // --------------------
       
   104 //
       
   105 //                 GoodMask         BadMask          WeakGoodMask     WeakBadMask
       
   106 //                 --------------------------------------------------------------
       
   107 //  Marked0        001              110              101              010
       
   108 //  Marked1        010              101              110              001
       
   109 //  Remapped       100              011              100              011
       
   110 //
       
   111 
       
   112 // Good/bad masks
       
   113 extern uintptr_t  ZAddressGoodMask;
       
   114 extern uintptr_t  ZAddressBadMask;
       
   115 extern uintptr_t  ZAddressWeakBadMask;
       
   116 
       
   117 // Marked state
       
   118 extern uintptr_t  ZAddressMetadataMarked;
       
   119 
       
   120 // Address space for mark stack allocations
       
   121 const size_t      ZMarkStackSpaceSizeShift      = 40; // 1TB
       
   122 const size_t      ZMarkStackSpaceSize           = (size_t)1 << ZMarkStackSpaceSizeShift;
       
   123 const uintptr_t   ZMarkStackSpaceStart          = ZAddressSpaceEnd + ZMarkStackSpaceSize;
       
   124 const uintptr_t   ZMarkStackSpaceEnd            = ZMarkStackSpaceStart + ZMarkStackSpaceSize;
       
   125 const size_t      ZMarkStackSpaceExpandSize     = (size_t)1 << 25; // 32M
       
   126 
       
   127 // Mark stack and magazine sizes
       
   128 const size_t      ZMarkStackSizeShift           = 11; // 2K
       
   129 const size_t      ZMarkStackSize                = (size_t)1 << ZMarkStackSizeShift;
       
   130 const size_t      ZMarkStackHeaderSize          = (size_t)1 << 4; // 16B
       
   131 const size_t      ZMarkStackSlots               = (ZMarkStackSize - ZMarkStackHeaderSize) / sizeof(uintptr_t);
       
   132 const size_t      ZMarkStackMagazineSize        = (size_t)1 << 15; // 32K
       
   133 const size_t      ZMarkStackMagazineSlots       = (ZMarkStackMagazineSize / ZMarkStackSize) - 1;
       
   134 
       
   135 // Mark stripe size
       
   136 const size_t      ZMarkStripeShift              = ZPageSizeMinShift;
       
   137 
       
   138 // Max number of mark stripes
       
   139 const size_t      ZMarkStripesMax               = 16; // Must be a power of two
       
   140 
       
   141 // Mark cache size
       
   142 const size_t      ZMarkCacheSize                = 1024; // Must be a power of two
       
   143 
       
   144 // Partial array minimum size
       
   145 const size_t      ZMarkPartialArrayMinSizeShift = 12; // 4K
       
   146 const size_t      ZMarkPartialArrayMinSize      = (size_t)1 << ZMarkPartialArrayMinSizeShift;
       
   147 
       
   148 // Max number of proactive/terminate flush attempts
       
   149 const size_t      ZMarkProactiveFlushMax        = 10;
       
   150 const size_t      ZMarkTerminateFlushMax        = 3;
       
   151 
       
   152 // Try complete mark timeout
       
   153 const uint64_t    ZMarkCompleteTimeout          = 1; // ms
       
   154 
       
   155 #endif // SHARE_GC_Z_ZGLOBALS_HPP