annotate src/share/vm/runtime/vframeArray.hpp @ 94:0834225a7916

6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction Summary: The option CMSInitiatingPermOccupancyFraction now controls perm triggering threshold. Even though the actual value of the threshold has not yet been changed, so there is no change in policy, we now have the infrastructure in place for dynamically deciding when to collect the perm gen, an issue that will be addressed in the near future. Reviewed-by: jmasa
author ysr
date Sun, 16 Mar 2008 21:57:25 -0700
parents a61af66fc99e
children 9987d9d5eb0e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
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
a61af66fc99e Initial load
duke
parents:
diff changeset
44 int _bci; // raw bci for this vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
45 methodOop _method; // the method for this vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
46 MonitorChunk* _monitors; // active monitors for this vframe
a61af66fc99e Initial load
duke
parents:
diff changeset
47 StackValueCollection* _locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 StackValueCollection* _expressions;
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 frame* iframe(void) { return &_frame; }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 int bci(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int raw_bci(void) const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 methodOop method(void) const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 MonitorChunk* monitors(void) const { return _monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 void free_monitors(JavaThread* jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 StackValueCollection* locals(void) const { return _locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 StackValueCollection* expressions(void) const { return _expressions; }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void fill_in(compiledVFrame* vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Formerly part of deoptimizedVFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Returns the on stack word size for this frame
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // callee_parameters is the number of callee locals residing inside this frame
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int on_stack_size(int callee_parameters,
a61af66fc99e Initial load
duke
parents:
diff changeset
76 int callee_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bool is_top_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
78 int popframe_extra_stack_expression_els) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // Unpacks the element to skeletal interpreter frame
a61af66fc99e Initial load
duke
parents:
diff changeset
81 void unpack_on_stack(int callee_parameters,
a61af66fc99e Initial load
duke
parents:
diff changeset
82 int callee_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
83 frame* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
84 bool is_top_frame,
a61af66fc99e Initial load
duke
parents:
diff changeset
85 int exec_mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void print(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
90 };
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // this can be a ResourceObj if we don't save the last one...
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // but it does make debugging easier even if we can't look
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // at the data in each vframeElement
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 class vframeArray: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Here is what a vframeArray looks like in memory
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
103 fixed part
a61af66fc99e Initial load
duke
parents:
diff changeset
104 description of the original frame
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _frames - number of vframes in this array
a61af66fc99e Initial load
duke
parents:
diff changeset
106 adapter info
a61af66fc99e Initial load
duke
parents:
diff changeset
107 callee register save area
a61af66fc99e Initial load
duke
parents:
diff changeset
108 variable part
a61af66fc99e Initial load
duke
parents:
diff changeset
109 vframeArrayElement [ 0 ]
a61af66fc99e Initial load
duke
parents:
diff changeset
110 ...
a61af66fc99e Initial load
duke
parents:
diff changeset
111 vframeArrayElement [_frames - 1]
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 */
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 JavaThread* _owner_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 vframeArray* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 frame _original; // the original frame of the deoptee
a61af66fc99e Initial load
duke
parents:
diff changeset
118 frame _caller; // caller of root frame in vframeArray
a61af66fc99e Initial load
duke
parents:
diff changeset
119 frame _sender;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 Deoptimization::UnrollBlock* _unroll_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 int _frame_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 int _frames; // number of javavframes in the array (does not count any adapter)
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 intptr_t _callee_registers[RegisterMap::reg_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
127 unsigned char _valid[RegisterMap::reg_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 vframeArrayElement _elements[1]; // First variable section.
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void fill_in_element(int index, compiledVFrame* vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 bool is_location_valid(int i) const { return _valid[i] != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void set_location_valid(int i, bool valid) { _valid[i] = valid; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Tells whether index is within bounds.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 bool is_within_bounds(int index) const { return 0 <= index && index < frames(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Accessores for instance variable
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int frames() const { return _frames; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 static vframeArray* allocate(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk,
a61af66fc99e Initial load
duke
parents:
diff changeset
146 RegisterMap* reg_map, frame sender, frame caller, frame self);
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 vframeArrayElement* element(int index) { assert(is_within_bounds(index), "Bad index"); return &_elements[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Allocates a new vframe in the array and fills the array with vframe information in chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void fill_in(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk, const RegisterMap *reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Returns the owner of this vframeArray
a61af66fc99e Initial load
duke
parents:
diff changeset
155 JavaThread* owner_thread() const { return _owner_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Accessors for next
a61af66fc99e Initial load
duke
parents:
diff changeset
158 vframeArray* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void set_next(vframeArray* value) { _next = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Accessors for sp
a61af66fc99e Initial load
duke
parents:
diff changeset
162 intptr_t* sp() const { return _original.sp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 intptr_t* unextended_sp() const { return _original.unextended_sp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 address original_pc() const { return _original.pc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 frame original() const { return _original; }
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 frame caller() const { return _caller; }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 frame sender() const { return _sender; }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Accessors for unroll block
a61af66fc99e Initial load
duke
parents:
diff changeset
175 Deoptimization::UnrollBlock* unroll_block() const { return _unroll_block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void set_unroll_block(Deoptimization::UnrollBlock* block) { _unroll_block = block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // Returns the size of the frame that got deoptimized
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int frame_size() const { return _frame_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Unpack the array on the stack passed in stack interval
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void unpack_to_stack(frame &unpack_frame, int exec_mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Deallocates monitor chunks allocated during deoptimization.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // This should be called when the array is not used anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void deallocate_monitor_chunks();
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Accessor for register map
a61af66fc99e Initial load
duke
parents:
diff changeset
191 address register_location(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void print_on_2(outputStream* st) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 void print_value_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Comparing
a61af66fc99e Initial load
duke
parents:
diff changeset
198 bool structural_compare(JavaThread* thread, GrowableArray<compiledVFrame*>* chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 };