annotate src/share/vm/runtime/fieldDescriptor.cpp @ 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 c89f86385056
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-2005 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 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_fieldDescriptor.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 oop fieldDescriptor::loader() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
30 return instanceKlass::cast(_cp->pool_holder())->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
31 }
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 typeArrayOop fieldDescriptor::annotations() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 instanceKlass* ik = instanceKlass::cast(field_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
35 objArrayOop md = ik->fields_annotations();
a61af66fc99e Initial load
duke
parents:
diff changeset
36 if (md == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
37 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 assert((index() % instanceKlass::next_offset) == 0, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
39 return typeArrayOop(md->obj_at(index() / instanceKlass::next_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
40 }
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 constantTag fieldDescriptor::initial_value_tag() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 return constants()->tag_at(_initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 jint fieldDescriptor::int_initial_value() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 return constants()->int_at(_initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 jlong fieldDescriptor::long_initial_value() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 return constants()->long_at(_initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 jfloat fieldDescriptor::float_initial_value() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 return constants()->float_at(_initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 jdouble fieldDescriptor::double_initial_value() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 return constants()->double_at(_initial_value_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 oop fieldDescriptor::string_initial_value(TRAPS) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 return constants()->string_at(_initial_value_index, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void fieldDescriptor::initialize(klassOop k, int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 instanceKlass* ik = instanceKlass::cast(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _cp = ik->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
69 typeArrayOop fields = ik->fields();
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 assert(fields->length() % instanceKlass::next_offset == 0, "Illegal size of field array");
a61af66fc99e Initial load
duke
parents:
diff changeset
72 assert(fields->length() >= index + instanceKlass::next_offset, "Illegal size of field array");
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _access_flags.set_field_flags(fields->ushort_at(index + instanceKlass::access_flags_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _name_index = fields->ushort_at(index + instanceKlass::name_index_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _signature_index = fields->ushort_at(index + instanceKlass::signature_index_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _initial_value_index = fields->ushort_at(index + instanceKlass::initval_index_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 guarantee(_name_index != 0 && _signature_index != 0, "bad constant pool index for fieldDescriptor");
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _offset = ik->offset_from_fields( index );
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _generic_signature_index = fields->ushort_at(index + instanceKlass::generic_signature_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _index = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 void fieldDescriptor::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _access_flags.print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 constants()->symbol_at(_name_index)->print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
90 constants()->symbol_at(_signature_index)->print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 st->print(" @%d ", offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (WizardMode && has_initial_value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 st->print("(initval ");
a61af66fc99e Initial load
duke
parents:
diff changeset
94 constantTag t = initial_value_tag();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 if (t.is_int()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 st->print("int %d)", int_initial_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
97 } else if (t.is_long()){
a61af66fc99e Initial load
duke
parents:
diff changeset
98 st->print_jlong(long_initial_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
99 } else if (t.is_float()){
a61af66fc99e Initial load
duke
parents:
diff changeset
100 st->print("float %f)", float_initial_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
101 } else if (t.is_double()){
a61af66fc99e Initial load
duke
parents:
diff changeset
102 st->print("double %lf)", double_initial_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void fieldDescriptor::print_on_for(outputStream* st, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 BasicType ft = field_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 jint as_int;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 switch (ft) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 case T_BYTE:
a61af66fc99e Initial load
duke
parents:
diff changeset
113 as_int = (jint)obj->byte_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
114 st->print(" %d", obj->byte_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
115 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 case T_CHAR:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 jchar c = obj->char_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
119 as_int = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 st->print(" %c %d", isprint(c) ? c : ' ', c);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 case T_DOUBLE:
a61af66fc99e Initial load
duke
parents:
diff changeset
124 st->print(" %lf", obj->double_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
125 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 case T_FLOAT:
a61af66fc99e Initial load
duke
parents:
diff changeset
127 as_int = obj->int_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
128 st->print(" %f", obj->float_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
129 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 case T_INT:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 st->print(" %d", obj->int_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
132 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 case T_LONG:
a61af66fc99e Initial load
duke
parents:
diff changeset
134 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
135 st->print_jlong(obj->long_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
136 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 case T_SHORT:
a61af66fc99e Initial load
duke
parents:
diff changeset
138 as_int = obj->short_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
139 st->print(" %d", obj->short_field(offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
140 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 case T_BOOLEAN:
a61af66fc99e Initial load
duke
parents:
diff changeset
142 as_int = obj->bool_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
143 st->print(" %s", obj->bool_field(offset()) ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 case T_ARRAY:
a61af66fc99e Initial load
duke
parents:
diff changeset
146 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
147 as_int = obj->int_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
148 obj->obj_field(offset())->print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 case T_OBJECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
151 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 as_int = obj->int_field(offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
153 obj->obj_field(offset())->print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Print a hint as to the underlying integer representation. This can be wrong for
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // pointers on an LP64 machine
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (ft == T_LONG || ft == T_DOUBLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 st->print(" (%x %x)", obj->int_field(offset()), obj->int_field(offset()+sizeof(jint)));
a61af66fc99e Initial load
duke
parents:
diff changeset
163 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 st->print(" (%x)", as_int);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 #endif /* PRODUCT */