src/hotspot/share/gc/z/zHeap.hpp
changeset 50525 767cdb97f103
child 50582 6464882498b5
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_ZHEAP_HPP
       
    25 #define SHARE_GC_Z_ZHEAP_HPP
       
    26 
       
    27 #include "gc/shared/gcTimer.hpp"
       
    28 #include "gc/z/zAllocationFlags.hpp"
       
    29 #include "gc/z/zArray.hpp"
       
    30 #include "gc/z/zList.hpp"
       
    31 #include "gc/z/zLock.hpp"
       
    32 #include "gc/z/zMark.hpp"
       
    33 #include "gc/z/zObjectAllocator.hpp"
       
    34 #include "gc/z/zPage.hpp"
       
    35 #include "gc/z/zPageAllocator.hpp"
       
    36 #include "gc/z/zPageTable.hpp"
       
    37 #include "gc/z/zReferenceProcessor.hpp"
       
    38 #include "gc/z/zRelocate.hpp"
       
    39 #include "gc/z/zRelocationSet.hpp"
       
    40 #include "gc/z/zRelocationSetSelector.hpp"
       
    41 #include "gc/z/zRootsIterator.hpp"
       
    42 #include "gc/z/zWeakRootsProcessor.hpp"
       
    43 #include "gc/z/zServiceability.hpp"
       
    44 #include "gc/z/zWorkers.hpp"
       
    45 #include "memory/allocation.hpp"
       
    46 
       
    47 class ZHeap {
       
    48   friend class VMStructs;
       
    49 
       
    50 private:
       
    51   static ZHeap*       _heap;
       
    52 
       
    53   ZWorkers            _workers;
       
    54   ZObjectAllocator    _object_allocator;
       
    55   ZPageAllocator      _page_allocator;
       
    56   ZPageTable          _pagetable;
       
    57   ZMark               _mark;
       
    58   ZReferenceProcessor _reference_processor;
       
    59   ZWeakRootsProcessor _weak_roots_processor;
       
    60   ZRelocate           _relocate;
       
    61   ZRelocationSet      _relocation_set;
       
    62   ZServiceability     _serviceability;
       
    63 
       
    64   size_t heap_min_size() const;
       
    65   size_t heap_max_size() const;
       
    66   size_t heap_max_reserve_size() const;
       
    67 
       
    68   void out_of_memory();
       
    69   void flip_views();
       
    70   void fixup_partial_loads();
       
    71 
       
    72 public:
       
    73   static ZHeap* heap();
       
    74 
       
    75   ZHeap();
       
    76 
       
    77   bool is_initialized() const;
       
    78 
       
    79   // Heap metrics
       
    80   size_t min_capacity() const;
       
    81   size_t max_capacity() const;
       
    82   size_t capacity() const;
       
    83   size_t max_reserve() const;
       
    84   size_t used_high() const;
       
    85   size_t used_low() const;
       
    86   size_t used() const;
       
    87   size_t allocated() const;
       
    88   size_t reclaimed() const;
       
    89 
       
    90   size_t tlab_capacity() const;
       
    91   size_t tlab_used() const;
       
    92   size_t max_tlab_size() const;
       
    93   size_t unsafe_max_tlab_alloc() const;
       
    94 
       
    95   bool is_in(uintptr_t addr) const;
       
    96 
       
    97   // Block
       
    98   uintptr_t block_start(uintptr_t addr) const;
       
    99   size_t block_size(uintptr_t addr) const;
       
   100   bool block_is_obj(uintptr_t addr) const;
       
   101 
       
   102   // Workers
       
   103   uint nconcurrent_worker_threads() const;
       
   104   uint nconcurrent_no_boost_worker_threads() const;
       
   105   void set_boost_worker_threads(bool boost);
       
   106   void worker_threads_do(ThreadClosure* tc) const;
       
   107   void print_worker_threads_on(outputStream* st) const;
       
   108 
       
   109   // Reference processing
       
   110   ReferenceDiscoverer* reference_discoverer();
       
   111   void set_soft_reference_policy(bool clear);
       
   112 
       
   113   // Non-strong reference processing
       
   114   void process_non_strong_references();
       
   115 
       
   116   // Page allocation
       
   117   ZPage* alloc_page(uint8_t type, size_t size, ZAllocationFlags flags);
       
   118   void undo_alloc_page(ZPage* page);
       
   119   bool retain_page(ZPage* page);
       
   120   void release_page(ZPage* page, bool reclaimed);
       
   121 
       
   122   // Object allocation
       
   123   uintptr_t alloc_tlab(size_t size);
       
   124   uintptr_t alloc_object(size_t size);
       
   125   uintptr_t alloc_object_for_relocation(size_t size);
       
   126   void undo_alloc_object_for_relocation(uintptr_t addr, size_t size);
       
   127   void check_out_of_memory();
       
   128 
       
   129   // Marking
       
   130   bool is_object_live(uintptr_t addr) const;
       
   131   bool is_object_strongly_live(uintptr_t addr) const;
       
   132   template <bool finalizable, bool publish> void mark_object(uintptr_t addr);
       
   133   void mark_start();
       
   134   void mark();
       
   135   void mark_flush_and_free(Thread* thread);
       
   136   bool mark_end();
       
   137 
       
   138   // Post-marking & Pre-relocation
       
   139   void destroy_detached_pages();
       
   140 
       
   141   // Relocation set
       
   142   void select_relocation_set();
       
   143   void prepare_relocation_set();
       
   144   void reset_relocation_set();
       
   145 
       
   146   // Relocation
       
   147   bool is_relocating(uintptr_t addr) const;
       
   148   void relocate_start();
       
   149   uintptr_t relocate_object(uintptr_t addr);
       
   150   uintptr_t forward_object(uintptr_t addr);
       
   151   void relocate();
       
   152 
       
   153   // Iteration
       
   154   void object_iterate(ObjectClosure* cl);
       
   155 
       
   156   // Serviceability
       
   157   void serviceability_initialize();
       
   158   GCMemoryManager* serviceability_memory_manager();
       
   159   MemoryPool* serviceability_memory_pool();
       
   160   ZServiceabilityCounters* serviceability_counters();
       
   161 
       
   162   // Printing
       
   163   void print_on(outputStream* st) const;
       
   164   void print_extended_on(outputStream* st) const;
       
   165 
       
   166   // Verification
       
   167   bool is_oop(oop object) const;
       
   168   void verify();
       
   169 };
       
   170 
       
   171 #endif // SHARE_GC_Z_ZHEAP_HPP