annotate src/share/vm/gc_implementation/shared/mutableSpace.hpp @ 10374:87c64c0438fb

6976350: G1: deal with fragmentation while copying objects during GC Summary: Create G1ParGCAllocBufferContainer to contain two buffers instead of previously using one buffer, in order to hold the first priority buffer longer. Thus, when some large objects hits the value of free space left in the first priority buffer it has an alternative to fit in the second priority buffer while the first priority buffer is given more chances to try allocating smaller objects. Overall, it will improve heap space efficiency. Reviewed-by: johnc, jmasa, brutisso Contributed-by: tamao <tao.mao@oracle.com>
author tamao
date Mon, 03 Jun 2013 14:37:13 -0700
parents da91efe96a93
children 63a4eb8bcd23 cfd4aac53239
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 1972
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_MUTABLESPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_SHARED_MUTABLESPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/shared/immutableSpace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // A MutableSpace is a subtype of ImmutableSpace that supports the
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // concept of allocation. This includes the concepts that a space may
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // be only partially full, and the querry methods that go with such
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
35 // an assumption. MutableSpace is also responsible for minimizing the
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
36 // page allocation time by having the memory pretouched (with
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
37 // AlwaysPretouch) and for optimizing page placement on NUMA systems
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
38 // by make the underlying region interleaved (with UseNUMA).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 //
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Invariant: (ImmutableSpace +) bottom() <= top() <= end()
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // top() is inclusive and end() is exclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
42
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
43 class MutableSpaceMangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
44
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class MutableSpace: public ImmutableSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 friend class VMStructs;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
47
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
48 // Helper for mangling unused space in debug builds
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
49 MutableSpaceMangler* _mangler;
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
50 // The last region which page had been setup to be interleaved.
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
51 MemRegion _last_setup_region;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
52 size_t _alignment;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 HeapWord* _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
56 MutableSpaceMangler* mangler() { return _mangler; }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
57
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
58 void numa_setup_pages(MemRegion mr, bool clear_space);
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
59 void pretouch_pages(MemRegion mr);
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
60
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
61 void set_last_setup_region(MemRegion mr) { _last_setup_region = mr; }
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
62 MemRegion last_setup_region() const { return _last_setup_region; }
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
63
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 public:
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
65 virtual ~MutableSpace();
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
66 MutableSpace(size_t page_size);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
67
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
69 HeapWord* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 virtual void set_top(HeapWord* value) { _top = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 HeapWord** top_addr() { return &_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 HeapWord** end_addr() { return &_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 virtual void set_bottom(HeapWord* value) { _bottom = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 virtual void set_end(HeapWord* value) { _end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
78 size_t alignment() { return _alignment; }
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
79
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // Returns a subregion containing all objects in this space.
a61af66fc99e Initial load
duke
parents:
diff changeset
81 MemRegion used_region() { return MemRegion(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
83 static const bool SetupPages = true;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
84 static const bool DontSetupPages = false;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
85
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Initialization
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
87 virtual void initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
88 bool clear_space,
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
89 bool mangle_space,
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
90 bool setup_pages = SetupPages);
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
91
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
92 virtual void clear(bool mangle_space);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
93 // Does the usual initialization but optionally resets top to bottom.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
94 #if 0 // MANGLE_SPACE
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
95 void initialize(MemRegion mr, bool clear_space, bool reset_top);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
96 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 virtual void update() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 virtual void accumulate_statistics() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
100 // Methods used in mangling. See descriptions under SpaceMangler.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
101 virtual void mangle_unused_area() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
102 virtual void mangle_unused_area_complete() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
103 virtual void check_mangled_unused_area(HeapWord* limit) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
104 virtual void check_mangled_unused_area_complete() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
105 virtual void set_top_for_allocations(HeapWord* v) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
106
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
107 // Used to save the space's current top for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
108 virtual void set_top_for_allocations() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
109
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 virtual void ensure_parsability() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
112 virtual void mangle_region(MemRegion mr) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Boolean querries.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 bool is_empty() const { return used_in_words() == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 bool not_empty() const { return used_in_words() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool contains(const void* p) const { return _bottom <= p && p < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Size computations. Sizes are in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 size_t used_in_bytes() const { return used_in_words() * HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 size_t free_in_bytes() const { return free_in_words() * HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Size computations. Sizes are in heapwords.
a61af66fc99e Initial load
duke
parents:
diff changeset
124 virtual size_t used_in_words() const { return pointer_delta(top(), bottom()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 virtual size_t free_in_words() const { return pointer_delta(end(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 virtual size_t tlab_capacity(Thread* thr) const { return capacity_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const { return free_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
130 virtual HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual HeapWord* cas_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Optional deallocation. Used in NUMA-allocator.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 bool cas_deallocate(HeapWord *obj, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Iteration.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
136 void oop_iterate(ExtendedOopClosure* cl);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
137 void oop_iterate_no_header(OopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
141 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 virtual void print_short() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 virtual void print_short_on(outputStream* st) const;
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 1972
diff changeset
145 virtual void verify();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
147
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
148 #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_MUTABLESPACE_HPP