comparison src/share/vm/memory/space.hpp @ 14518:d8041d695d19

Merged with jdk9/dev/hotspot changeset 3812c088b945
author twisti
date Tue, 11 Mar 2014 18:45:59 -0700
parents 8a9bb7821e28
children 4ca6dc0799b6
comparison
equal deleted inserted replaced
14141:f97c5ec83832 14518:d8041d695d19
1 /* 1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
43 # include "os_solaris.inline.hpp" 43 # include "os_solaris.inline.hpp"
44 #endif 44 #endif
45 #ifdef TARGET_OS_FAMILY_windows 45 #ifdef TARGET_OS_FAMILY_windows
46 # include "os_windows.inline.hpp" 46 # include "os_windows.inline.hpp"
47 #endif 47 #endif
48 #ifdef TARGET_OS_FAMILY_aix
49 # include "os_aix.inline.hpp"
50 #endif
48 #ifdef TARGET_OS_FAMILY_bsd 51 #ifdef TARGET_OS_FAMILY_bsd
49 # include "os_bsd.inline.hpp" 52 # include "os_bsd.inline.hpp"
50 #endif 53 #endif
51 54
52 // A space is an abstraction for the "storage units" backing 55 // A space is an abstraction for the "storage units" backing
54 // implementations for keeping track of free and used space, 57 // implementations for keeping track of free and used space,
55 // for iterating over objects and free blocks, etc. 58 // for iterating over objects and free blocks, etc.
56 59
57 // Here's the Space hierarchy: 60 // Here's the Space hierarchy:
58 // 61 //
59 // - Space -- an asbtract base class describing a heap area 62 // - Space -- an abstract base class describing a heap area
60 // - CompactibleSpace -- a space supporting compaction 63 // - CompactibleSpace -- a space supporting compaction
61 // - CompactibleFreeListSpace -- (used for CMS generation) 64 // - CompactibleFreeListSpace -- (used for CMS generation)
62 // - ContiguousSpace -- a compactible space in which all free space 65 // - ContiguousSpace -- a compactible space in which all free space
63 // is contiguous 66 // is contiguous
64 // - EdenSpace -- contiguous space used as nursery 67 // - EdenSpace -- contiguous space used as nursery
157 // allocated at the time of the last call to "save_marks". If the space 160 // allocated at the time of the last call to "save_marks". If the space
158 // initializes its DirtyCardToOopClosure's specifying the "contig" option 161 // initializes its DirtyCardToOopClosure's specifying the "contig" option
159 // (that is, if the space is contiguous), then this region must contain only 162 // (that is, if the space is contiguous), then this region must contain only
160 // such objects: the memregion will be from the bottom of the region to the 163 // such objects: the memregion will be from the bottom of the region to the
161 // saved mark. Otherwise, the "obj_allocated_since_save_marks" method of 164 // saved mark. Otherwise, the "obj_allocated_since_save_marks" method of
162 // the space must distiguish between objects in the region allocated before 165 // the space must distinguish between objects in the region allocated before
163 // and after the call to save marks. 166 // and after the call to save marks.
164 virtual MemRegion used_region_at_save_marks() const { 167 virtual MemRegion used_region_at_save_marks() const {
165 return MemRegion(bottom(), saved_mark_word()); 168 return MemRegion(bottom(), saved_mark_word());
166 } 169 }
167 170
188 bool is_empty() const { return used() == 0; } 191 bool is_empty() const { return used() == 0; }
189 bool not_empty() const { return used() > 0; } 192 bool not_empty() const { return used() > 0; }
190 193
191 // Returns true iff the given the space contains the 194 // Returns true iff the given the space contains the
192 // given address as part of an allocated object. For 195 // given address as part of an allocated object. For
193 // ceratin kinds of spaces, this might be a potentially 196 // certain kinds of spaces, this might be a potentially
194 // expensive operation. To prevent performance problems 197 // expensive operation. To prevent performance problems
195 // on account of its inadvertent use in product jvm's, 198 // on account of its inadvertent use in product jvm's,
196 // we restrict its use to assertion checks only. 199 // we restrict its use to assertion checks only.
197 virtual bool is_in(const void* p) const = 0; 200 virtual bool is_in(const void* p) const = 0;
198 201
242 // calling "cl.do_object_careful" on each. Return NULL if all objects 245 // calling "cl.do_object_careful" on each. Return NULL if all objects
243 // in the space (at the start of the iteration) were iterated over. 246 // in the space (at the start of the iteration) were iterated over.
244 // Return an address indicating the extent of the iteration in the 247 // Return an address indicating the extent of the iteration in the
245 // event that the iteration had to return because of finding an 248 // event that the iteration had to return because of finding an
246 // uninitialized object in the space, or if the closure "cl" 249 // uninitialized object in the space, or if the closure "cl"
247 // signalled early termination. 250 // signaled early termination.
248 virtual HeapWord* object_iterate_careful(ObjectClosureCareful* cl); 251 virtual HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
249 virtual HeapWord* object_iterate_careful_m(MemRegion mr, 252 virtual HeapWord* object_iterate_careful_m(MemRegion mr,
250 ObjectClosureCareful* cl); 253 ObjectClosureCareful* cl);
251 254
252 // Create and return a new dirty card to oop closure. Can be 255 // Create and return a new dirty card to oop closure. Can be
253 // overriden to return the appropriate type of closure 256 // overridden to return the appropriate type of closure
254 // depending on the type of space in which the closure will 257 // depending on the type of space in which the closure will
255 // operate. ResourceArea allocated. 258 // operate. ResourceArea allocated.
256 virtual DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl, 259 virtual DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
257 CardTableModRefBS::PrecisionStyle precision, 260 CardTableModRefBS::PrecisionStyle precision,
258 HeapWord* boundary = NULL); 261 HeapWord* boundary = NULL);
472 // the object, insert an appropriate forwarding pointer in "q". 475 // the object, insert an appropriate forwarding pointer in "q".
473 // If not, go to the next compaction space (there must 476 // If not, go to the next compaction space (there must
474 // be one, since compaction must succeed -- we go to the first space of 477 // be one, since compaction must succeed -- we go to the first space of
475 // the previous generation if necessary, updating "cp"), reset compact_top 478 // the previous generation if necessary, updating "cp"), reset compact_top
476 // and then forward. In either case, returns the new value of "compact_top". 479 // and then forward. In either case, returns the new value of "compact_top".
477 // If the forwarding crosses "cp->threshold", invokes the "cross_threhold" 480 // If the forwarding crosses "cp->threshold", invokes the "cross_threshold"
478 // function of the then-current compaction space, and updates "cp->threshold 481 // function of the then-current compaction space, and updates "cp->threshold
479 // accordingly". 482 // accordingly".
480 virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp, 483 virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp,
481 HeapWord* compact_top); 484 HeapWord* compact_top);
482 485
483 // Return a size with adjusments as required of the space. 486 // Return a size with adjustments as required of the space.
484 virtual size_t adjust_object_size_v(size_t size) const { return size; } 487 virtual size_t adjust_object_size_v(size_t size) const { return size; }
485 488
486 protected: 489 protected:
487 // Used during compaction. 490 // Used during compaction.
488 HeapWord* _first_dead; 491 HeapWord* _first_dead;
498 return end(); 501 return end();
499 } 502 }
500 503
501 // Requires "allowed_deadspace_words > 0", that "q" is the start of a 504 // Requires "allowed_deadspace_words > 0", that "q" is the start of a
502 // free block of the given "word_len", and that "q", were it an object, 505 // free block of the given "word_len", and that "q", were it an object,
503 // would not move if forwared. If the size allows, fill the free 506 // would not move if forwarded. If the size allows, fill the free
504 // block with an object, to prevent excessive compaction. Returns "true" 507 // block with an object, to prevent excessive compaction. Returns "true"
505 // iff the free region was made deadspace, and modifies 508 // iff the free region was made deadspace, and modifies
506 // "allowed_deadspace_words" to reflect the number of available deadspace 509 // "allowed_deadspace_words" to reflect the number of available deadspace
507 // words remaining after this operation. 510 // words remaining after this operation.
508 bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q, 511 bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q,