Thu, 20 Nov 2008 16:56:09 -0800
6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa
1 /*
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
25 // AccessFlags is an abstraction over Java access flags.
28 enum {
29 // See jvm.h for shared JVM_ACC_XXX access flags
31 // HotSpot-specific access flags
33 // flags actually put in .class file
34 JVM_ACC_WRITTEN_FLAGS = 0x00007FFF,
36 // methodOop flags
37 JVM_ACC_MONITOR_MATCH = 0x10000000, // True if we know that monitorenter/monitorexit bytecodes match
38 JVM_ACC_HAS_MONITOR_BYTECODES = 0x20000000, // Method contains monitorenter/monitorexit bytecodes
39 JVM_ACC_HAS_LOOPS = 0x40000000, // Method has loops
40 JVM_ACC_LOOPS_FLAG_INIT = (int)0x80000000,// The loop flag has been initialized
41 JVM_ACC_QUEUED = 0x01000000, // Queued for compilation
42 JVM_ACC_NOT_TIER1_COMPILABLE = 0x04000000,
43 JVM_ACC_NOT_OSR_COMPILABLE = 0x08000000,
44 JVM_ACC_HAS_LINE_NUMBER_TABLE = 0x00100000,
45 JVM_ACC_HAS_CHECKED_EXCEPTIONS = 0x00400000,
46 JVM_ACC_HAS_JSRS = 0x00800000,
47 JVM_ACC_IS_OLD = 0x00010000, // RedefineClasses() has replaced this method
48 JVM_ACC_IS_OBSOLETE = 0x00020000, // RedefineClasses() has made method obsolete
49 JVM_ACC_IS_PREFIXED_NATIVE = 0x00040000, // JVMTI has prefixed this native method
51 // klassOop flags
52 JVM_ACC_HAS_MIRANDA_METHODS = 0x10000000, // True if this class has miranda methods in it's vtable
53 JVM_ACC_HAS_VANILLA_CONSTRUCTOR = 0x20000000, // True if klass has a vanilla default constructor
54 JVM_ACC_HAS_FINALIZER = 0x40000000, // True if klass has a non-empty finalize() method
55 JVM_ACC_IS_CLONEABLE = (int)0x80000000,// True if klass supports the Clonable interface
56 JVM_ACC_HAS_FINAL_METHOD = 0x01000000, // True if klass has final method
58 // klassOop and methodOop flags
59 JVM_ACC_HAS_LOCAL_VARIABLE_TABLE= 0x00200000,
61 JVM_ACC_PROMOTED_FLAGS = 0x00200000, // flags promoted from methods to the holding klass
63 // field flags
64 // Note: these flags must be defined in the low order 16 bits because
65 // instanceKlass only stores a ushort worth of information from the
66 // AccessFlags value.
67 // These bits must not conflict with any other field-related access flags
68 // (e.g., ACC_ENUM).
69 // Note that the class-related ACC_ANNOTATION bit conflicts with these flags.
70 JVM_ACC_FIELD_ACCESS_WATCHED = 0x00002000, // field access is watched by JVMTI
71 JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000, // field modification is watched by JVMTI
73 // flags accepted by set_field_flags()
74 JVM_ACC_FIELD_FLAGS = 0x00008000 | JVM_ACC_WRITTEN_FLAGS
75 };
78 class AccessFlags VALUE_OBJ_CLASS_SPEC {
79 friend class VMStructs;
80 private:
81 jint _flags;
83 public:
84 // Java access flags
85 bool is_public () const { return (_flags & JVM_ACC_PUBLIC ) != 0; }
86 bool is_private () const { return (_flags & JVM_ACC_PRIVATE ) != 0; }
87 bool is_protected () const { return (_flags & JVM_ACC_PROTECTED ) != 0; }
88 bool is_static () const { return (_flags & JVM_ACC_STATIC ) != 0; }
89 bool is_final () const { return (_flags & JVM_ACC_FINAL ) != 0; }
90 bool is_synchronized() const { return (_flags & JVM_ACC_SYNCHRONIZED) != 0; }
91 bool is_super () const { return (_flags & JVM_ACC_SUPER ) != 0; }
92 bool is_volatile () const { return (_flags & JVM_ACC_VOLATILE ) != 0; }
93 bool is_transient () const { return (_flags & JVM_ACC_TRANSIENT ) != 0; }
94 bool is_native () const { return (_flags & JVM_ACC_NATIVE ) != 0; }
95 bool is_interface () const { return (_flags & JVM_ACC_INTERFACE ) != 0; }
96 bool is_abstract () const { return (_flags & JVM_ACC_ABSTRACT ) != 0; }
97 bool is_strict () const { return (_flags & JVM_ACC_STRICT ) != 0; }
99 // Attribute flags
100 bool is_synthetic () const { return (_flags & JVM_ACC_SYNTHETIC ) != 0; }
102 // methodOop flags
103 bool is_monitor_matching () const { return (_flags & JVM_ACC_MONITOR_MATCH ) != 0; }
104 bool has_monitor_bytecodes () const { return (_flags & JVM_ACC_HAS_MONITOR_BYTECODES ) != 0; }
105 bool has_loops () const { return (_flags & JVM_ACC_HAS_LOOPS ) != 0; }
106 bool loops_flag_init () const { return (_flags & JVM_ACC_LOOPS_FLAG_INIT ) != 0; }
107 bool queued_for_compilation () const { return (_flags & JVM_ACC_QUEUED ) != 0; }
108 bool is_not_tier1_compilable () const { return (_flags & JVM_ACC_NOT_TIER1_COMPILABLE ) != 0; }
109 bool is_not_osr_compilable () const { return (_flags & JVM_ACC_NOT_OSR_COMPILABLE ) != 0; }
110 bool has_linenumber_table () const { return (_flags & JVM_ACC_HAS_LINE_NUMBER_TABLE ) != 0; }
111 bool has_checked_exceptions () const { return (_flags & JVM_ACC_HAS_CHECKED_EXCEPTIONS ) != 0; }
112 bool has_jsrs () const { return (_flags & JVM_ACC_HAS_JSRS ) != 0; }
113 bool is_old () const { return (_flags & JVM_ACC_IS_OLD ) != 0; }
114 bool is_obsolete () const { return (_flags & JVM_ACC_IS_OBSOLETE ) != 0; }
115 bool is_prefixed_native () const { return (_flags & JVM_ACC_IS_PREFIXED_NATIVE ) != 0; }
117 // klassOop flags
118 bool has_miranda_methods () const { return (_flags & JVM_ACC_HAS_MIRANDA_METHODS ) != 0; }
119 bool has_vanilla_constructor () const { return (_flags & JVM_ACC_HAS_VANILLA_CONSTRUCTOR) != 0; }
120 bool has_finalizer () const { return (_flags & JVM_ACC_HAS_FINALIZER ) != 0; }
121 bool has_final_method () const { return (_flags & JVM_ACC_HAS_FINAL_METHOD ) != 0; }
122 bool is_cloneable () const { return (_flags & JVM_ACC_IS_CLONEABLE ) != 0; }
123 // klassOop and methodOop flags
124 bool has_localvariable_table () const { return (_flags & JVM_ACC_HAS_LOCAL_VARIABLE_TABLE) != 0; }
125 void set_has_localvariable_table() { atomic_set_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); }
126 void clear_has_localvariable_table() { atomic_clear_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); }
128 // field flags
129 bool is_field_access_watched() const { return (_flags & JVM_ACC_FIELD_ACCESS_WATCHED) != 0; }
130 bool is_field_modification_watched() const
131 { return (_flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; }
133 // get .class file flags
134 jint get_flags () const { return (_flags & JVM_ACC_WRITTEN_FLAGS); }
136 // Initialization
137 void add_promoted_flags(jint flags) { _flags |= (flags & JVM_ACC_PROMOTED_FLAGS); }
138 void set_field_flags(jint flags) { _flags = (flags & JVM_ACC_FIELD_FLAGS); }
139 void set_flags(jint flags) { _flags = (flags & JVM_ACC_WRITTEN_FLAGS); }
141 void set_queued_for_compilation() { atomic_set_bits(JVM_ACC_QUEUED); }
142 void clear_queued_for_compilation() { atomic_clear_bits(JVM_ACC_QUEUED); }
144 // Atomic update of flags
145 void atomic_set_bits(jint bits);
146 void atomic_clear_bits(jint bits);
148 private:
149 friend class methodOopDesc;
150 friend class Klass;
151 friend class ClassFileParser;
152 // the functions below should only be called on the _access_flags inst var directly,
153 // otherwise they are just changing a copy of the flags
155 // attribute flags
156 void set_is_synthetic() { atomic_set_bits(JVM_ACC_SYNTHETIC); }
158 // methodOop flags
159 void set_monitor_matching() { atomic_set_bits(JVM_ACC_MONITOR_MATCH); }
160 void set_has_monitor_bytecodes() { atomic_set_bits(JVM_ACC_HAS_MONITOR_BYTECODES); }
161 void set_has_loops() { atomic_set_bits(JVM_ACC_HAS_LOOPS); }
162 void set_loops_flag_init() { atomic_set_bits(JVM_ACC_LOOPS_FLAG_INIT); }
163 void set_not_tier1_compilable() { atomic_set_bits(JVM_ACC_NOT_TIER1_COMPILABLE); }
164 void set_not_osr_compilable() { atomic_set_bits(JVM_ACC_NOT_OSR_COMPILABLE); }
165 void set_has_linenumber_table() { atomic_set_bits(JVM_ACC_HAS_LINE_NUMBER_TABLE); }
166 void set_has_checked_exceptions() { atomic_set_bits(JVM_ACC_HAS_CHECKED_EXCEPTIONS); }
167 void set_has_jsrs() { atomic_set_bits(JVM_ACC_HAS_JSRS); }
168 void set_is_old() { atomic_set_bits(JVM_ACC_IS_OLD); }
169 void set_is_obsolete() { atomic_set_bits(JVM_ACC_IS_OBSOLETE); }
170 void set_is_prefixed_native() { atomic_set_bits(JVM_ACC_IS_PREFIXED_NATIVE); }
172 // klassOop flags
173 void set_has_vanilla_constructor() { atomic_set_bits(JVM_ACC_HAS_VANILLA_CONSTRUCTOR); }
174 void set_has_finalizer() { atomic_set_bits(JVM_ACC_HAS_FINALIZER); }
175 void set_has_final_method() { atomic_set_bits(JVM_ACC_HAS_FINAL_METHOD); }
176 void set_is_cloneable() { atomic_set_bits(JVM_ACC_IS_CLONEABLE); }
177 void set_has_miranda_methods() { atomic_set_bits(JVM_ACC_HAS_MIRANDA_METHODS); }
179 public:
180 // field flags
181 void set_is_field_access_watched(const bool value)
182 {
183 if (value) {
184 atomic_set_bits(JVM_ACC_FIELD_ACCESS_WATCHED);
185 } else {
186 atomic_clear_bits(JVM_ACC_FIELD_ACCESS_WATCHED);
187 }
188 }
189 void set_is_field_modification_watched(const bool value)
190 {
191 if (value) {
192 atomic_set_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED);
193 } else {
194 atomic_clear_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED);
195 }
196 }
198 // Conversion
199 jshort as_short() { return (jshort)_flags; }
200 jint as_int() { return _flags; }
202 // Printing/debugging
203 void print_on(outputStream* st) const PRODUCT_RETURN;
204 };