Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/memory/defNewGeneration.hpp
32285 views
/*1* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef SHARE_VM_MEMORY_DEFNEWGENERATION_HPP25#define SHARE_VM_MEMORY_DEFNEWGENERATION_HPP2627#include "gc_implementation/shared/ageTable.hpp"28#include "gc_implementation/shared/cSpaceCounters.hpp"29#include "gc_implementation/shared/generationCounters.hpp"30#include "gc_implementation/shared/copyFailedInfo.hpp"31#include "memory/generation.inline.hpp"32#include "utilities/stack.hpp"3334class EdenSpace;35class ContiguousSpace;36class ScanClosure;37class STWGCTimer;3839// DefNewGeneration is a young generation containing eden, from- and40// to-space.4142class DefNewGeneration: public Generation {43friend class VMStructs;4445protected:46Generation* _next_gen;47uint _tenuring_threshold; // Tenuring threshold for next collection.48ageTable _age_table;49// Size of object to pretenure in words; command line provides bytes50size_t _pretenure_size_threshold_words;5152ageTable* age_table() { return &_age_table; }5354// Initialize state to optimistically assume no promotion failure will55// happen.56void init_assuming_no_promotion_failure();57// True iff a promotion has failed in the current collection.58bool _promotion_failed;59bool promotion_failed() { return _promotion_failed; }60PromotionFailedInfo _promotion_failed_info;6162// Handling promotion failure. A young generation collection63// can fail if a live object cannot be copied out of its64// location in eden or from-space during the collection. If65// a collection fails, the young generation is left in a66// consistent state such that it can be collected by a67// full collection.68// Before the collection69// Objects are in eden or from-space70// All roots into the young generation point into eden or from-space.71//72// After a failed collection73// Objects may be in eden, from-space, or to-space74// An object A in eden or from-space may have a copy B75// in to-space. If B exists, all roots that once pointed76// to A must now point to B.77// All objects in the young generation are unmarked.78// Eden, from-space, and to-space will all be collected by79// the full collection.80void handle_promotion_failure(oop);8182// In the absence of promotion failure, we wouldn't look at "from-space"83// objects after a young-gen collection. When promotion fails, however,84// the subsequent full collection will look at from-space objects:85// therefore we must remove their forwarding pointers.86void remove_forwarding_pointers();8788// Preserve the mark of "obj", if necessary, in preparation for its mark89// word being overwritten with a self-forwarding-pointer.90void preserve_mark_if_necessary(oop obj, markOop m);91void preserve_mark(oop obj, markOop m); // work routine used by the above9293// Together, these keep <object with a preserved mark, mark value> pairs.94// They should always contain the same number of elements.95Stack<oop, mtGC> _objs_with_preserved_marks;96Stack<markOop, mtGC> _preserved_marks_of_objs;9798// Promotion failure handling99ExtendedOopClosure *_promo_failure_scan_stack_closure;100void set_promo_failure_scan_stack_closure(ExtendedOopClosure *scan_stack_closure) {101_promo_failure_scan_stack_closure = scan_stack_closure;102}103104Stack<oop, mtGC> _promo_failure_scan_stack;105void drain_promo_failure_scan_stack(void);106bool _promo_failure_drain_in_progress;107108// Performance Counters109GenerationCounters* _gen_counters;110CSpaceCounters* _eden_counters;111CSpaceCounters* _from_counters;112CSpaceCounters* _to_counters;113114// sizing information115size_t _max_eden_size;116size_t _max_survivor_size;117118// Allocation support119bool _should_allocate_from_space;120bool should_allocate_from_space() const {121return _should_allocate_from_space;122}123void clear_should_allocate_from_space() {124_should_allocate_from_space = false;125}126void set_should_allocate_from_space() {127_should_allocate_from_space = true;128}129130// Tenuring131void adjust_desired_tenuring_threshold(GCTracer &tracer);132133// Spaces134EdenSpace* _eden_space;135ContiguousSpace* _from_space;136ContiguousSpace* _to_space;137138STWGCTimer* _gc_timer;139140enum SomeProtectedConstants {141// Generations are GenGrain-aligned and have size that are multiples of142// GenGrain.143MinFreeScratchWords = 100144};145146// Return the size of a survivor space if this generation were of size147// gen_size.148size_t compute_survivor_size(size_t gen_size, size_t alignment) const {149size_t n = gen_size / (SurvivorRatio + 2);150return n > alignment ? align_size_down(n, alignment) : alignment;151}152153public: // was "protected" but caused compile error on win32154class IsAliveClosure: public BoolObjectClosure {155Generation* _g;156public:157IsAliveClosure(Generation* g);158bool do_object_b(oop p);159};160161class KeepAliveClosure: public OopClosure {162protected:163ScanWeakRefClosure* _cl;164CardTableRS* _rs;165template <class T> void do_oop_work(T* p);166public:167KeepAliveClosure(ScanWeakRefClosure* cl);168virtual void do_oop(oop* p);169virtual void do_oop(narrowOop* p);170};171172class FastKeepAliveClosure: public KeepAliveClosure {173protected:174HeapWord* _boundary;175template <class T> void do_oop_work(T* p);176public:177FastKeepAliveClosure(DefNewGeneration* g, ScanWeakRefClosure* cl);178virtual void do_oop(oop* p);179virtual void do_oop(narrowOop* p);180};181182class EvacuateFollowersClosure: public VoidClosure {183GenCollectedHeap* _gch;184int _level;185ScanClosure* _scan_cur_or_nonheap;186ScanClosure* _scan_older;187public:188EvacuateFollowersClosure(GenCollectedHeap* gch, int level,189ScanClosure* cur, ScanClosure* older);190void do_void();191};192193class FastEvacuateFollowersClosure: public VoidClosure {194GenCollectedHeap* _gch;195int _level;196DefNewGeneration* _gen;197FastScanClosure* _scan_cur_or_nonheap;198FastScanClosure* _scan_older;199public:200FastEvacuateFollowersClosure(GenCollectedHeap* gch, int level,201DefNewGeneration* gen,202FastScanClosure* cur,203FastScanClosure* older);204void do_void();205};206207public:208DefNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level,209const char* policy="Copy");210211virtual void ref_processor_init();212213virtual Generation::Name kind() { return Generation::DefNew; }214215// Accessing spaces216EdenSpace* eden() const { return _eden_space; }217ContiguousSpace* from() const { return _from_space; }218ContiguousSpace* to() const { return _to_space; }219220virtual CompactibleSpace* first_compaction_space() const;221222// Space enquiries223size_t capacity() const;224size_t used() const;225size_t free() const;226size_t max_capacity() const;227size_t capacity_before_gc() const;228size_t unsafe_max_alloc_nogc() const;229size_t contiguous_available() const;230231size_t max_eden_size() const { return _max_eden_size; }232size_t max_survivor_size() const { return _max_survivor_size; }233234bool supports_inline_contig_alloc() const { return true; }235HeapWord** top_addr() const;236HeapWord** end_addr() const;237238// Thread-local allocation buffers239bool supports_tlab_allocation() const { return true; }240size_t tlab_capacity() const;241size_t tlab_used() const;242size_t unsafe_max_tlab_alloc() const;243244// Grow the generation by the specified number of bytes.245// The size of bytes is assumed to be properly aligned.246// Return true if the expansion was successful.247bool expand(size_t bytes);248249// DefNewGeneration cannot currently expand except at250// a GC.251virtual bool is_maximal_no_gc() const { return true; }252253// Iteration254void object_iterate(ObjectClosure* blk);255256void younger_refs_iterate(OopsInGenClosure* cl);257258void space_iterate(SpaceClosure* blk, bool usedOnly = false);259260// Allocation support261virtual bool should_allocate(size_t word_size, bool is_tlab) {262assert(UseTLAB || !is_tlab, "Should not allocate tlab");263264size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);265266const bool non_zero = word_size > 0;267const bool overflows = word_size >= overflow_limit;268const bool check_too_big = _pretenure_size_threshold_words > 0;269const bool not_too_big = word_size < _pretenure_size_threshold_words;270const bool size_ok = is_tlab || !check_too_big || not_too_big;271272bool result = !overflows &&273non_zero &&274size_ok;275276return result;277}278279HeapWord* allocate(size_t word_size, bool is_tlab);280HeapWord* allocate_from_space(size_t word_size);281282HeapWord* par_allocate(size_t word_size, bool is_tlab);283284// Prologue & Epilogue285virtual void gc_prologue(bool full);286virtual void gc_epilogue(bool full);287288// Save the tops for eden, from, and to289virtual void record_spaces_top();290291// Doesn't require additional work during GC prologue and epilogue292virtual bool performs_in_place_marking() const { return false; }293294// Accessing marks295void save_marks();296void reset_saved_marks();297bool no_allocs_since_save_marks();298299// Need to declare the full complement of closures, whether we'll300// override them or not, or get message from the compiler:301// oop_since_save_marks_iterate_nv hides virtual function...302#define DefNew_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \303void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);304305ALL_SINCE_SAVE_MARKS_CLOSURES(DefNew_SINCE_SAVE_MARKS_DECL)306307#undef DefNew_SINCE_SAVE_MARKS_DECL308309// For non-youngest collection, the DefNewGeneration can contribute310// "to-space".311virtual void contribute_scratch(ScratchBlock*& list, Generation* requestor,312size_t max_alloc_words);313314// Reset for contribution of "to-space".315virtual void reset_scratch();316317// GC support318virtual void compute_new_size();319320// Returns true if the collection is likely to be safely321// completed. Even if this method returns true, a collection322// may not be guaranteed to succeed, and the system should be323// able to safely unwind and recover from that failure, albeit324// at some additional cost. Override superclass's implementation.325virtual bool collection_attempt_is_safe();326327virtual void collect(bool full,328bool clear_all_soft_refs,329size_t size,330bool is_tlab);331HeapWord* expand_and_allocate(size_t size,332bool is_tlab,333bool parallel = false);334335oop copy_to_survivor_space(oop old);336uint tenuring_threshold() { return _tenuring_threshold; }337338// Performance Counter support339void update_counters();340341// Printing342virtual const char* name() const;343virtual const char* short_name() const { return "DefNew"; }344345bool must_be_youngest() const { return true; }346bool must_be_oldest() const { return false; }347348// PrintHeapAtGC support.349void print_on(outputStream* st) const;350351void verify();352353bool promo_failure_scan_is_complete() const {354return _promo_failure_scan_stack.is_empty();355}356357protected:358// If clear_space is true, clear the survivor spaces. Eden is359// cleared if the minimum size of eden is 0. If mangle_space360// is true, also mangle the space in debug mode.361void compute_space_boundaries(uintx minimum_eden_size,362bool clear_space,363bool mangle_space);364// Scavenge support365void swap_spaces();366};367368#endif // SHARE_VM_MEMORY_DEFNEWGENERATION_HPP369370371