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 current_max_capacity() const;
 83   size_t capacity() const;
 84   size_t max_reserve() const;
 85   size_t used_high() const;
 86   size_t used_low() const;
 87   size_t used() const;
 88   size_t allocated() const;
 89   size_t reclaimed() const;
 90 
 91   size_t tlab_capacity() const;
 92   size_t tlab_used() const;
 93   size_t max_tlab_size() const;
 94   size_t unsafe_max_tlab_alloc() const;
 95 
 96   bool is_in(uintptr_t addr) const;
 97 
 98   // Block
 99   uintptr_t block_start(uintptr_t addr) const;
100   size_t block_size(uintptr_t addr) const;
101   bool block_is_obj(uintptr_t addr) const;
102 
103   // Workers
104   uint nconcurrent_worker_threads() const;
105   uint nconcurrent_no_boost_worker_threads() const;
106   void set_boost_worker_threads(bool boost);
107   void worker_threads_do(ThreadClosure* tc) const;
108   void print_worker_threads_on(outputStream* st) const;
109 
110   // Reference processing
111   ReferenceDiscoverer* reference_discoverer();
112   void set_soft_reference_policy(bool clear);
113 
114   // Non-strong reference processing
115   void process_non_strong_references();
116 
117   // Page allocation
118   ZPage* alloc_page(uint8_t type, size_t size, ZAllocationFlags flags);
119   void undo_alloc_page(ZPage* page);
120   bool retain_page(ZPage* page);
121   void release_page(ZPage* page, bool reclaimed);
122 
123   // Object allocation
124   uintptr_t alloc_tlab(size_t size);
125   uintptr_t alloc_object(size_t size);
126   uintptr_t alloc_object_for_relocation(size_t size);
127   void undo_alloc_object_for_relocation(uintptr_t addr, size_t size);
128   bool is_alloc_stalled() const;
129   void check_out_of_memory();
130 
131   // Marking
132   bool is_object_live(uintptr_t addr) const;
133   bool is_object_strongly_live(uintptr_t addr) const;
134   template <bool finalizable, bool publish> void mark_object(uintptr_t addr);
135   void mark_start();
136   void mark();
137   void mark_flush_and_free(Thread* thread);
138   bool mark_end();
139 
140   // Post-marking & Pre-relocation
141   void destroy_detached_pages();
142 
143   // Relocation set
144   void select_relocation_set();
145   void prepare_relocation_set();
146   void reset_relocation_set();
147 
148   // Relocation
149   bool is_relocating(uintptr_t addr) const;
150   void relocate_start();
151   uintptr_t relocate_object(uintptr_t addr);
152   uintptr_t forward_object(uintptr_t addr);
153   void relocate();
154 
155   // Iteration
156   void object_iterate(ObjectClosure* cl, bool visit_referents);
157 
158   // Serviceability
159   void serviceability_initialize();
160   GCMemoryManager* serviceability_memory_manager();
161   MemoryPool* serviceability_memory_pool();
162   ZServiceabilityCounters* serviceability_counters();
163 
164   // Printing
165   void print_on(outputStream* st) const;
166   void print_extended_on(outputStream* st) const;
167 
168   // Verification
169   bool is_oop(oop object) const;
170   void verify();
171 };
172 
173 #endif // SHARE_GC_Z_ZHEAP_HPP