annotate src/share/vm/runtime/vframeArray.hpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents 89e0543e1737
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
948
89e0543e1737 6884624: Update copyright year
xdono
parents: 900
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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 vframeArray is an array used for momentarily storing off stack Java method activations
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // during deoptimization. Essentially it is an array of vframes where each vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // data is stored off stack. This structure will never exist across a safepoint so
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // there is no need to gc any oops that are stored in the structure.
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class LocalsClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class ExpressionStackClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class MonitorStackClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class MonitorArrayElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class StackValueCollection;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // A vframeArrayElement is an element of a vframeArray. Each element
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // represent an interpreter frame which will eventually be created.
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class vframeArrayElement : public _ValueObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 frame _frame; // the interpreter frame we will unpack into
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 0
diff changeset
44 int _bci; // raw bci for this vframe
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 0
diff changeset
45 bool _reexecute; // whether sould we reexecute this bytecode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 methodOop _method; // the method for this vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
47 MonitorChunk* _monitors; // active monitors for this vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
48 StackValueCollection* _locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 StackValueCollection* _expressions;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 frame* iframe(void) { return &_frame; }
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 int bci(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 int raw_bci(void) const { return _bci; }
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 0
diff changeset
58 bool should_reexecute(void) const { return _reexecute; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 methodOop method(void) const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 MonitorChunk* monitors(void) const { return _monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 void free_monitors(JavaThread* jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 StackValueCollection* locals(void) const { return _locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 StackValueCollection* expressions(void) const { return _expressions; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void fill_in(compiledVFrame* vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Formerly part of deoptimizedVFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Returns the on stack word size for this frame
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // callee_parameters is the number of callee locals residing inside this frame
a61af66fc99e Initial load
duke
parents:
diff changeset
77 int on_stack_size(int callee_parameters,
a61af66fc99e Initial load
duke
parents:
diff changeset
78 int callee_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 bool is_top_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 int popframe_extra_stack_expression_els) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Unpacks the element to skeletal interpreter frame
a61af66fc99e Initial load
duke
parents:
diff changeset
83 void unpack_on_stack(int callee_parameters,
a61af66fc99e Initial load
duke
parents:
diff changeset
84 int callee_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
85 frame* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
86 bool is_top_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
87 int exec_mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void print(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
92 };
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // this can be a ResourceObj if we don't save the last one...
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // but it does make debugging easier even if we can't look
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // at the data in each vframeElement
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 class vframeArray: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Here is what a vframeArray looks like in memory
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
105 fixed part
a61af66fc99e Initial load
duke
parents:
diff changeset
106 description of the original frame
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _frames - number of vframes in this array
a61af66fc99e Initial load
duke
parents:
diff changeset
108 adapter info
a61af66fc99e Initial load
duke
parents:
diff changeset
109 callee register save area
a61af66fc99e Initial load
duke
parents:
diff changeset
110 variable part
a61af66fc99e Initial load
duke
parents:
diff changeset
111 vframeArrayElement [ 0 ]
a61af66fc99e Initial load
duke
parents:
diff changeset
112 ...
a61af66fc99e Initial load
duke
parents:
diff changeset
113 vframeArrayElement [_frames - 1]
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 */
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 JavaThread* _owner_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 vframeArray* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 frame _original; // the original frame of the deoptee
a61af66fc99e Initial load
duke
parents:
diff changeset
120 frame _caller; // caller of root frame in vframeArray
a61af66fc99e Initial load
duke
parents:
diff changeset
121 frame _sender;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 Deoptimization::UnrollBlock* _unroll_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 int _frame_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int _frames; // number of javavframes in the array (does not count any adapter)
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 intptr_t _callee_registers[RegisterMap::reg_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
129 unsigned char _valid[RegisterMap::reg_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 vframeArrayElement _elements[1]; // First variable section.
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void fill_in_element(int index, compiledVFrame* vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 bool is_location_valid(int i) const { return _valid[i] != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void set_location_valid(int i, bool valid) { _valid[i] = valid; }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Tells whether index is within bounds.
a61af66fc99e Initial load
duke
parents:
diff changeset
142 bool is_within_bounds(int index) const { return 0 <= index && index < frames(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Accessores for instance variable
a61af66fc99e Initial load
duke
parents:
diff changeset
145 int frames() const { return _frames; }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static vframeArray* allocate(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk,
a61af66fc99e Initial load
duke
parents:
diff changeset
148 RegisterMap* reg_map, frame sender, frame caller, frame self);
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 vframeArrayElement* element(int index) { assert(is_within_bounds(index), "Bad index"); return &_elements[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Allocates a new vframe in the array and fills the array with vframe information in chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void fill_in(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk, const RegisterMap *reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Returns the owner of this vframeArray
a61af66fc99e Initial load
duke
parents:
diff changeset
157 JavaThread* owner_thread() const { return _owner_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Accessors for next
a61af66fc99e Initial load
duke
parents:
diff changeset
160 vframeArray* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 void set_next(vframeArray* value) { _next = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Accessors for sp
a61af66fc99e Initial load
duke
parents:
diff changeset
164 intptr_t* sp() const { return _original.sp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 intptr_t* unextended_sp() const { return _original.unextended_sp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 address original_pc() const { return _original.pc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 frame original() const { return _original; }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 frame caller() const { return _caller; }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 frame sender() const { return _sender; }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Accessors for unroll block
a61af66fc99e Initial load
duke
parents:
diff changeset
177 Deoptimization::UnrollBlock* unroll_block() const { return _unroll_block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void set_unroll_block(Deoptimization::UnrollBlock* block) { _unroll_block = block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Returns the size of the frame that got deoptimized
a61af66fc99e Initial load
duke
parents:
diff changeset
181 int frame_size() const { return _frame_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Unpack the array on the stack passed in stack interval
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void unpack_to_stack(frame &unpack_frame, int exec_mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Deallocates monitor chunks allocated during deoptimization.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // This should be called when the array is not used anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
188 void deallocate_monitor_chunks();
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Accessor for register map
a61af66fc99e Initial load
duke
parents:
diff changeset
193 address register_location(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void print_on_2(outputStream* st) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void print_value_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Comparing
a61af66fc99e Initial load
duke
parents:
diff changeset
200 bool structural_compare(JavaThread* thread, GrowableArray<compiledVFrame*>* chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 };