annotate src/share/vm/gc_implementation/shared/mutableSpace.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
2 * Copyright (c) 2001, 2009, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // A MutableSpace is a subtype of ImmutableSpace that supports the
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // concept of allocation. This includes the concepts that a space may
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // 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
28 // 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
29 // 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
30 // 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
31 // by make the underlying region interleaved (with UseNUMA).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Invariant: (ImmutableSpace +) bottom() <= top() <= end()
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // top() is inclusive and end() is exclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
35
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
36 class MutableSpaceMangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
37
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class MutableSpace: public ImmutableSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 friend class VMStructs;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
40
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
41 // 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
42 MutableSpaceMangler* _mangler;
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
43 // 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
44 MemRegion _last_setup_region;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
45 size_t _alignment;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
47 HeapWord* _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
49 MutableSpaceMangler* mangler() { return _mangler; }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
50
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
51 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
52 void pretouch_pages(MemRegion mr);
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
53
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
54 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
55 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
56
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 public:
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
58 virtual ~MutableSpace();
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
59 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
60
0
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
62 HeapWord* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 virtual void set_top(HeapWord* value) { _top = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 HeapWord** top_addr() { return &_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66 HeapWord** end_addr() { return &_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 virtual void set_bottom(HeapWord* value) { _bottom = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 virtual void set_end(HeapWord* value) { _end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
70
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
71 size_t alignment() { return _alignment; }
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
72
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Returns a subregion containing all objects in this space.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 MemRegion used_region() { return MemRegion(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
76 static const bool SetupPages = true;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
77 static const bool DontSetupPages = false;
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
78
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Initialization
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
80 virtual void initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
81 bool clear_space,
535
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
82 bool mangle_space,
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
83 bool setup_pages = SetupPages);
4e400c36026f 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 269
diff changeset
84
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
85 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
86 // 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
87 #if 0 // MANGLE_SPACE
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
88 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
89 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 virtual void update() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 virtual void accumulate_statistics() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
93 // 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
94 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
95 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
96 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
97 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
98 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
99
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
100 // 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
101 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
102
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 virtual void ensure_parsability() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 190
diff changeset
105 virtual void mangle_region(MemRegion mr) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Boolean querries.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 bool is_empty() const { return used_in_words() == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 bool not_empty() const { return used_in_words() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 bool contains(const void* p) const { return _bottom <= p && p < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Size computations. Sizes are in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 size_t used_in_bytes() const { return used_in_words() * HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 size_t free_in_bytes() const { return free_in_words() * HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Size computations. Sizes are in heapwords.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 virtual size_t used_in_words() const { return pointer_delta(top(), bottom()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 virtual size_t free_in_words() const { return pointer_delta(end(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 virtual size_t tlab_capacity(Thread* thr) const { return capacity_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const { return free_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
123 virtual HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 virtual HeapWord* cas_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Optional deallocation. Used in NUMA-allocator.
a61af66fc99e Initial load
duke
parents:
diff changeset
126 bool cas_deallocate(HeapWord *obj, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void oop_iterate(OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
133 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 virtual void print_short() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 virtual void print_short_on(outputStream* st) const;
190
d1635bf93939 6711930: NUMA allocator: ParOld can create a hole less than minimal object size in the lgrp chunk
iveresov
parents: 0
diff changeset
137 virtual void verify(bool allow_dirty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 };