Mercurial > hg > truffle
annotate agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java @ 650:54782a4cd321
6812971: SA: re-attaching to process fails
Summary: After attaching, de-attaching SA from a process, the second time attach() call fails. This happens because in VM.initialize(), Universe does not get re-initialized before it is accessed.
Reviewed-by: swamyv
author | poonam |
---|---|
date | Sun, 15 Mar 2009 18:11:46 -0700 |
parents | cecd8eb4e0ca |
children | 60bfce711da4 |
rev | line source |
---|---|
0 | 1 /* |
196 | 2 * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. |
0 | 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 */ | |
24 | |
25 package sun.jvm.hotspot.runtime; | |
26 | |
27 import java.io.*; | |
28 import java.net.*; | |
29 import java.util.*; | |
30 import java.util.regex.*; | |
31 import sun.jvm.hotspot.code.*; | |
32 import sun.jvm.hotspot.c1.*; | |
33 import sun.jvm.hotspot.debugger.*; | |
34 import sun.jvm.hotspot.interpreter.*; | |
35 import sun.jvm.hotspot.memory.*; | |
36 import sun.jvm.hotspot.oops.*; | |
37 import sun.jvm.hotspot.types.*; | |
38 import sun.jvm.hotspot.utilities.*; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
39 import sun.jvm.hotspot.runtime.*; |
0 | 40 |
41 /** <P> This class encapsulates the global state of the VM; the | |
42 universe, object heap, interpreter, etc. It is a Singleton and | |
43 must be initialized with a call to initialize() before calling | |
44 getVM(). </P> | |
45 | |
46 <P> Many auxiliary classes (i.e., most of the VMObjects) keep | |
47 needed field offsets in the form of static Field objects. In a | |
48 debugging system, the VM might be shutdown and re-initialized (on | |
49 a differently-configured build, i.e., 32- vs. 64-bit), and all old | |
50 cached state (including fields and field offsets) must be | |
51 flushed. </P> | |
52 | |
53 <P> An Observer pattern is used to implement the initialization of | |
54 such classes. Each such class, in its static initializer, | |
55 registers an Observer with the VM class via | |
56 VM.registerVMInitializedObserver(). This Observer is guaranteed to | |
57 be notified whenever the VM is initialized (or re-initialized). To | |
58 implement the first-time initialization, the observer is also | |
59 notified when it registers itself with the VM. (For bootstrapping | |
60 reasons, this implies that the constructor of VM can not | |
61 instantiate any such objects, since VM.soleInstance will not have | |
62 been set yet. This is a bootstrapping issue which may have to be | |
63 revisited later.) </P> | |
64 */ | |
65 | |
66 public class VM { | |
67 private static VM soleInstance; | |
68 private static List vmInitializedObservers = new ArrayList(); | |
69 private List vmResumedObservers = new ArrayList(); | |
70 private List vmSuspendedObservers = new ArrayList(); | |
71 private TypeDataBase db; | |
72 private boolean isBigEndian; | |
73 /** This is only present if in a debugging system */ | |
74 private JVMDebugger debugger; | |
75 private long stackBias; | |
76 private long logAddressSize; | |
77 private Universe universe; | |
78 private ObjectHeap heap; | |
79 private SymbolTable symbols; | |
80 private StringTable strings; | |
81 private SystemDictionary dict; | |
82 private Threads threads; | |
83 private ObjectSynchronizer synchronizer; | |
84 private JNIHandles handles; | |
85 private Interpreter interpreter; | |
86 private StubRoutines stubRoutines; | |
87 private Bytes bytes; | |
88 /** Flags indicating whether we are attached to a core, C1, or C2 build */ | |
89 private boolean usingClientCompiler; | |
90 private boolean usingServerCompiler; | |
91 /** Flag indicating whether UseTLAB is turned on */ | |
92 private boolean useTLAB; | |
93 /** alignment constants */ | |
94 private boolean isLP64; | |
95 private int bytesPerLong; | |
96 private int minObjAlignmentInBytes; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
97 private int logMinObjAlignmentInBytes; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
98 private int heapWordSize; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
99 private int heapOopSize; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
100 private int oopSize; |
0 | 101 /** This is only present in a non-core build */ |
102 private CodeCache codeCache; | |
103 /** This is only present in a C1 build */ | |
104 private Runtime1 runtime1; | |
105 /** These constants come from globalDefinitions.hpp */ | |
106 private int invocationEntryBCI; | |
107 private int invalidOSREntryBCI; | |
108 private ReversePtrs revPtrs; | |
109 private VMRegImpl vmregImpl; | |
110 | |
111 // System.getProperties from debuggee VM | |
112 private Properties sysProps; | |
113 | |
114 // VM version strings come from Abstract_VM_Version class | |
115 private String vmRelease; | |
116 private String vmInternalInfo; | |
117 | |
118 private Flag[] commandLineFlags; | |
119 private Map flagsMap; | |
120 | |
121 private static Type intxType; | |
122 private static Type uintxType; | |
123 private static CIntegerType boolType; | |
124 private Boolean sharingEnabled; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
125 private Boolean compressedOopsEnabled; |
0 | 126 |
127 // command line flags supplied to VM - see struct Flag in globals.hpp | |
128 public static final class Flag { | |
129 private String type; | |
130 private String name; | |
131 private Address addr; | |
132 private String kind; | |
133 | |
134 private Flag(String type, String name, Address addr, String kind) { | |
135 this.type = type; | |
136 this.name = name; | |
137 this.addr = addr; | |
138 this.kind = kind; | |
139 } | |
140 | |
141 public String getType() { | |
142 return type; | |
143 } | |
144 | |
145 public String getName() { | |
146 return name; | |
147 } | |
148 | |
149 public Address getAddress() { | |
150 return addr; | |
151 } | |
152 | |
153 public String getKind() { | |
154 return kind; | |
155 } | |
156 | |
157 public boolean isBool() { | |
158 return type.equals("bool"); | |
159 } | |
160 | |
161 public boolean getBool() { | |
162 if (Assert.ASSERTS_ENABLED) { | |
163 Assert.that(isBool(), "not a bool flag!"); | |
164 } | |
165 return addr.getCIntegerAt(0, boolType.getSize(), boolType.isUnsigned()) | |
166 != 0; | |
167 } | |
168 | |
169 public boolean isIntx() { | |
170 return type.equals("intx"); | |
171 } | |
172 | |
173 public long getIntx() { | |
174 if (Assert.ASSERTS_ENABLED) { | |
175 Assert.that(isIntx(), "not a intx flag!"); | |
176 } | |
177 return addr.getCIntegerAt(0, intxType.getSize(), false); | |
178 } | |
179 | |
180 public boolean isUIntx() { | |
181 return type.equals("uintx"); | |
182 } | |
183 | |
184 public long getUIntx() { | |
185 if (Assert.ASSERTS_ENABLED) { | |
186 Assert.that(isUIntx(), "not a uintx flag!"); | |
187 } | |
188 return addr.getCIntegerAt(0, uintxType.getSize(), true); | |
189 } | |
190 | |
191 public String getValue() { | |
192 if (isBool()) { | |
193 return new Boolean(getBool()).toString(); | |
194 } else if (isIntx()) { | |
195 return new Long(getIntx()).toString(); | |
196 } else if (isUIntx()) { | |
197 return new Long(getUIntx()).toString(); | |
198 } else { | |
199 return null; | |
200 } | |
201 } | |
202 }; | |
203 | |
204 private static void checkVMVersion(String vmRelease) { | |
205 if (System.getProperty("sun.jvm.hotspot.runtime.VM.disableVersionCheck") == null) { | |
206 // read sa build version. | |
207 String versionProp = "sun.jvm.hotspot.runtime.VM.saBuildVersion"; | |
208 String saVersion = saProps.getProperty(versionProp); | |
209 if (saVersion == null) | |
210 throw new RuntimeException("Missing property " + versionProp); | |
211 | |
212 // Strip nonproduct VM version substring (note: saVersion doesn't have it). | |
213 String vmVersion = vmRelease.replaceAll("(-fastdebug)|(-debug)|(-jvmg)|(-optimized)|(-profiled)",""); | |
214 | |
215 if (saVersion.equals(vmVersion)) { | |
216 // Exact match | |
217 return; | |
218 } | |
219 if (saVersion.indexOf('-') == saVersion.lastIndexOf('-') && | |
220 vmVersion.indexOf('-') == vmVersion.lastIndexOf('-')) { | |
221 // Throw exception if different release versions: | |
222 // <major>.<minor>-b<n> | |
223 throw new VMVersionMismatchException(saVersion, vmRelease); | |
224 } else { | |
225 // Otherwise print warning to allow mismatch not release versions | |
226 // during development. | |
227 System.err.println("WARNING: Hotspot VM version " + vmRelease + | |
228 " does not match with SA version " + saVersion + | |
229 "." + " You may see unexpected results. "); | |
230 } | |
231 } else { | |
232 System.err.println("WARNING: You have disabled SA and VM version check. You may be " + | |
233 "using incompatible version of SA and you may see unexpected " + | |
234 "results."); | |
235 } | |
236 } | |
237 | |
238 private static final boolean disableDerivedPrinterTableCheck; | |
239 private static final Properties saProps; | |
240 | |
241 static { | |
242 saProps = new Properties(); | |
243 URL url = null; | |
244 try { | |
245 url = VM.class.getClassLoader().getResource("sa.properties"); | |
246 saProps.load(new BufferedInputStream(url.openStream())); | |
247 } catch (Exception e) { | |
248 throw new RuntimeException("Unable to load properties " + | |
249 (url == null ? "null" : url.toString()) + | |
250 ": " + e.getMessage()); | |
251 } | |
252 | |
253 disableDerivedPrinterTableCheck = System.getProperty("sun.jvm.hotspot.runtime.VM.disableDerivedPointerTableCheck") != null; | |
254 } | |
255 | |
256 private VM(TypeDataBase db, JVMDebugger debugger, boolean isBigEndian) { | |
257 this.db = db; | |
258 this.debugger = debugger; | |
259 this.isBigEndian = isBigEndian; | |
260 | |
261 // Note that we don't construct universe, heap, threads, | |
262 // interpreter, or stubRoutines here (any more). The current | |
263 // initialization mechanisms require that the VM be completely set | |
264 // up (i.e., out of its constructor, with soleInstance assigned) | |
265 // before their static initializers are run. | |
266 | |
267 if (db.getAddressSize() == 4) { | |
268 logAddressSize = 2; | |
269 } else if (db.getAddressSize() == 8) { | |
270 logAddressSize = 3; | |
271 } else { | |
272 throw new RuntimeException("Address size " + db.getAddressSize() + " not yet supported"); | |
273 } | |
274 | |
275 // read VM version info | |
276 try { | |
277 Type vmVersion = db.lookupType("Abstract_VM_Version"); | |
278 Address releaseAddr = vmVersion.getAddressField("_s_vm_release").getValue(); | |
279 vmRelease = CStringUtilities.getString(releaseAddr); | |
280 Address vmInternalInfoAddr = vmVersion.getAddressField("_s_internal_vm_info_string").getValue(); | |
281 vmInternalInfo = CStringUtilities.getString(vmInternalInfoAddr); | |
282 } catch (Exception exp) { | |
283 throw new RuntimeException("can't determine target's VM version : " + exp.getMessage()); | |
284 } | |
285 | |
286 checkVMVersion(vmRelease); | |
287 | |
288 stackBias = db.lookupIntConstant("STACK_BIAS").intValue(); | |
289 invocationEntryBCI = db.lookupIntConstant("InvocationEntryBci").intValue(); | |
290 invalidOSREntryBCI = db.lookupIntConstant("InvalidOSREntryBci").intValue(); | |
291 | |
292 // We infer the presence of C1 or C2 from a couple of fields we | |
293 // already have present in the type database | |
294 { | |
295 Type type = db.lookupType("methodOopDesc"); | |
296 if (type.getField("_from_compiled_entry", false, false) == null) { | |
297 // Neither C1 nor C2 is present | |
298 usingClientCompiler = false; | |
299 usingServerCompiler = false; | |
300 } else { | |
301 // Determine whether C2 is present | |
302 if (type.getField("_interpreter_invocation_count", false, false) != null) { | |
303 usingServerCompiler = true; | |
304 } else { | |
305 usingClientCompiler = true; | |
306 } | |
307 } | |
308 } | |
309 | |
310 useTLAB = (db.lookupIntConstant("UseTLAB").intValue() != 0); | |
311 | |
312 if (debugger != null) { | |
313 isLP64 = debugger.getMachineDescription().isLP64(); | |
314 } | |
315 bytesPerLong = db.lookupIntConstant("BytesPerLong").intValue(); | |
316 minObjAlignmentInBytes = db.lookupIntConstant("MinObjAlignmentInBytes").intValue(); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
317 // minObjAlignment = db.lookupIntConstant("MinObjAlignment").intValue(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
318 logMinObjAlignmentInBytes = db.lookupIntConstant("LogMinObjAlignmentInBytes").intValue(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
319 heapWordSize = db.lookupIntConstant("HeapWordSize").intValue(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
320 oopSize = db.lookupIntConstant("oopSize").intValue(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
321 heapOopSize = db.lookupIntConstant("heapOopSize").intValue(); |
0 | 322 |
323 intxType = db.lookupType("intx"); | |
324 uintxType = db.lookupType("uintx"); | |
325 boolType = (CIntegerType) db.lookupType("bool"); | |
326 } | |
327 | |
328 /** This could be used by a reflective runtime system */ | |
329 public static void initialize(TypeDataBase db, boolean isBigEndian) { | |
330 if (soleInstance != null) { | |
331 throw new RuntimeException("Attempt to initialize VM twice"); | |
332 } | |
333 soleInstance = new VM(db, null, isBigEndian); | |
334 for (Iterator iter = vmInitializedObservers.iterator(); iter.hasNext(); ) { | |
335 ((Observer) iter.next()).update(null, null); | |
336 } | |
337 } | |
338 | |
339 /** This is used by the debugging system */ | |
340 public static void initialize(TypeDataBase db, JVMDebugger debugger) { | |
341 if (soleInstance != null) { | |
342 throw new RuntimeException("Attempt to initialize VM twice"); | |
343 } | |
344 soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian()); | |
650 | 345 |
0 | 346 for (Iterator iter = vmInitializedObservers.iterator(); iter.hasNext(); ) { |
347 ((Observer) iter.next()).update(null, null); | |
348 } | |
650 | 349 |
350 debugger.putHeapConst(Universe.getHeapBase(), soleInstance.getHeapOopSize(), | |
351 soleInstance.logMinObjAlignmentInBytes); | |
0 | 352 } |
353 | |
354 /** This is used by the debugging system */ | |
355 public static void shutdown() { | |
356 soleInstance = null; | |
357 } | |
358 | |
359 /** This is used by both the debugger and any runtime system. It is | |
360 the basic mechanism by which classes which mimic underlying VM | |
361 functionality cause themselves to be initialized. The given | |
362 observer will be notified (with arguments (null, null)) when the | |
363 VM is re-initialized, as well as when it registers itself with | |
364 the VM. */ | |
365 public static void registerVMInitializedObserver(Observer o) { | |
366 vmInitializedObservers.add(o); | |
367 o.update(null, null); | |
368 } | |
369 | |
370 /** This is the primary accessor used by both the debugger and any | |
371 potential runtime system */ | |
372 public static VM getVM() { | |
373 if (soleInstance == null) { | |
374 throw new RuntimeException("VM.initialize() was not yet called"); | |
375 } | |
376 return soleInstance; | |
377 } | |
378 | |
379 /** This is only used by the debugging system. The given observer | |
380 will be notified if the underlying VM resumes execution. NOTE | |
381 that the given observer is not triggered if the VM is currently | |
382 running and therefore differs in behavior from {@link | |
383 #registerVMInitializedObserver} (because of the possibility of | |
384 race conditions if the observer is added while the VM is being | |
385 suspended or resumed). */ | |
386 public void registerVMResumedObserver(Observer o) { | |
387 vmResumedObservers.add(o); | |
388 } | |
389 | |
390 /** This is only used by the debugging system. The given observer | |
391 will be notified if the underlying VM suspends execution. NOTE | |
392 that the given observer is not triggered if the VM is currently | |
393 suspended and therefore differs in behavior from {@link | |
394 #registerVMInitializedObserver} (because of the possibility of | |
395 race conditions if the observer is added while the VM is being | |
396 suspended or resumed). */ | |
397 public void registerVMSuspendedObserver(Observer o) { | |
398 vmSuspendedObservers.add(o); | |
399 } | |
400 | |
401 /** This is only used by the debugging system. Informs all | |
402 registered resumption observers that the VM has been resumed. | |
403 The application is responsible for actually having performed the | |
404 resumption. No OopHandles must be used after this point, as they | |
405 may move in the target address space due to garbage | |
406 collection. */ | |
407 public void fireVMResumed() { | |
408 for (Iterator iter = vmResumedObservers.iterator(); iter.hasNext(); ) { | |
409 ((Observer) iter.next()).update(null, null); | |
410 } | |
411 } | |
412 | |
413 /** This is only used by the debugging system. Informs all | |
414 registered suspension observers that the VM has been suspended. | |
415 The application is responsible for actually having performed the | |
416 suspension. Garbage collection must be forbidden at this point; | |
417 for example, a JPDA-level suspension is not adequate since the | |
418 VM thread may still be running. */ | |
419 public void fireVMSuspended() { | |
420 for (Iterator iter = vmSuspendedObservers.iterator(); iter.hasNext(); ) { | |
421 ((Observer) iter.next()).update(null, null); | |
422 } | |
423 } | |
424 | |
425 /** Returns the OS this VM is running on. Notice that by delegating | |
426 to the debugger we can transparently support remote | |
427 debugging. */ | |
428 public String getOS() { | |
429 if (debugger != null) { | |
430 return debugger.getOS(); | |
431 } | |
432 return PlatformInfo.getOS(); | |
433 } | |
434 | |
435 /** Returns the CPU this VM is running on. Notice that by delegating | |
436 to the debugger we can transparently support remote | |
437 debugging. */ | |
438 public String getCPU() { | |
439 if (debugger != null) { | |
440 return debugger.getCPU(); | |
441 } | |
442 return PlatformInfo.getCPU(); | |
443 } | |
444 | |
445 public Type lookupType(String cTypeName) { | |
446 return db.lookupType(cTypeName); | |
447 } | |
448 | |
449 public Integer lookupIntConstant(String name) { | |
450 return db.lookupIntConstant(name); | |
451 } | |
452 | |
453 public long getAddressSize() { | |
454 return db.getAddressSize(); | |
455 } | |
456 | |
457 public long getOopSize() { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
458 return oopSize; |
0 | 459 } |
460 | |
461 public long getLogAddressSize() { | |
462 return logAddressSize; | |
463 } | |
464 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
465 public long getIntSize() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
466 return db.getJIntType().getSize(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
467 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
468 |
0 | 469 /** NOTE: this offset is in BYTES in this system! */ |
470 public long getStackBias() { | |
471 return stackBias; | |
472 } | |
473 | |
474 /** Indicates whether the underlying machine supports the LP64 data | |
475 model. This is needed for conditionalizing code in a few places */ | |
476 public boolean isLP64() { | |
477 if (Assert.ASSERTS_ENABLED) { | |
478 Assert.that(isDebugging(), "Debugging system only for now"); | |
479 } | |
480 return isLP64; | |
481 } | |
482 | |
483 /** Get bytes-per-long == long/double natural alignment. */ | |
484 public int getBytesPerLong() { | |
485 return bytesPerLong; | |
486 } | |
487 | |
488 /** Get minimum object alignment in bytes. */ | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
489 public int getMinObjAlignment() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
490 return minObjAlignmentInBytes; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
491 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
492 |
0 | 493 public int getMinObjAlignmentInBytes() { |
494 return minObjAlignmentInBytes; | |
495 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
496 public int getLogMinObjAlignmentInBytes() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
497 return logMinObjAlignmentInBytes; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
498 } |
0 | 499 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
500 public int getHeapWordSize() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
501 return heapWordSize; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
502 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
503 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
504 public int getHeapOopSize() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
505 return heapOopSize; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
506 } |
0 | 507 /** Utility routine for getting data structure alignment correct */ |
508 public long alignUp(long size, long alignment) { | |
509 return (size + alignment - 1) & ~(alignment - 1); | |
510 } | |
511 | |
512 /** Utility routine for getting data structure alignment correct */ | |
513 public long alignDown(long size, long alignment) { | |
514 return size & ~(alignment - 1); | |
515 } | |
516 | |
517 /** Utility routine for building an int from two "unsigned" 16-bit | |
518 shorts */ | |
519 public int buildIntFromShorts(short low, short high) { | |
520 return (((int) high) << 16) | (((int) low) & 0xFFFF); | |
521 } | |
522 | |
523 /** Utility routine for building a long from two "unsigned" 32-bit | |
524 ints in <b>platform-dependent</b> order */ | |
525 public long buildLongFromIntsPD(int oneHalf, int otherHalf) { | |
526 if (isBigEndian) { | |
527 return (((long) otherHalf) << 32) | (((long) oneHalf) & 0x00000000FFFFFFFFL); | |
528 } else{ | |
529 return (((long) oneHalf) << 32) | (((long) otherHalf) & 0x00000000FFFFFFFFL); | |
530 } | |
531 } | |
532 | |
533 /** Indicates whether Thread-Local Allocation Buffers are used */ | |
534 public boolean getUseTLAB() { | |
535 return useTLAB; | |
536 } | |
537 | |
538 public TypeDataBase getTypeDataBase() { | |
539 return db; | |
540 } | |
541 | |
542 public Universe getUniverse() { | |
543 if (universe == null) { | |
544 universe = new Universe(); | |
545 } | |
546 return universe; | |
547 } | |
548 | |
549 public ObjectHeap getObjectHeap() { | |
550 if (heap == null) { | |
551 heap = new ObjectHeap(db); | |
552 } | |
553 return heap; | |
554 } | |
555 | |
556 public SymbolTable getSymbolTable() { | |
557 if (symbols == null) { | |
558 symbols = SymbolTable.getTheTable(); | |
559 } | |
560 return symbols; | |
561 } | |
562 | |
563 public StringTable getStringTable() { | |
564 if (strings == null) { | |
565 strings = StringTable.getTheTable(); | |
566 } | |
567 return strings; | |
568 } | |
569 | |
570 public SystemDictionary getSystemDictionary() { | |
571 if (dict == null) { | |
572 dict = new SystemDictionary(); | |
573 } | |
574 return dict; | |
575 } | |
576 | |
577 public Threads getThreads() { | |
578 if (threads == null) { | |
579 threads = new Threads(); | |
580 } | |
581 return threads; | |
582 } | |
583 | |
584 public ObjectSynchronizer getObjectSynchronizer() { | |
585 if (synchronizer == null) { | |
586 synchronizer = new ObjectSynchronizer(); | |
587 } | |
588 return synchronizer; | |
589 } | |
590 | |
591 public JNIHandles getJNIHandles() { | |
592 if (handles == null) { | |
593 handles = new JNIHandles(); | |
594 } | |
595 return handles; | |
596 } | |
597 | |
598 public Interpreter getInterpreter() { | |
599 if (interpreter == null) { | |
600 interpreter = new Interpreter(); | |
601 } | |
602 return interpreter; | |
603 } | |
604 | |
605 public StubRoutines getStubRoutines() { | |
606 if (stubRoutines == null) { | |
607 stubRoutines = new StubRoutines(); | |
608 } | |
609 return stubRoutines; | |
610 } | |
611 | |
612 public VMRegImpl getVMRegImplInfo() { | |
613 if (vmregImpl == null) { | |
614 vmregImpl = new VMRegImpl(); | |
615 } | |
616 return vmregImpl; | |
617 } | |
618 | |
619 public Bytes getBytes() { | |
620 if (bytes == null) { | |
621 bytes = new Bytes(debugger.getMachineDescription()); | |
622 } | |
623 return bytes; | |
624 } | |
625 | |
331
cecd8eb4e0ca
6706829: Compressed Oops: add debug info for narrow oops
kvn
parents:
196
diff
changeset
|
626 /** Returns true if this is a isBigEndian, false otherwise */ |
cecd8eb4e0ca
6706829: Compressed Oops: add debug info for narrow oops
kvn
parents:
196
diff
changeset
|
627 public boolean isBigEndian() { |
cecd8eb4e0ca
6706829: Compressed Oops: add debug info for narrow oops
kvn
parents:
196
diff
changeset
|
628 return isBigEndian; |
cecd8eb4e0ca
6706829: Compressed Oops: add debug info for narrow oops
kvn
parents:
196
diff
changeset
|
629 } |
cecd8eb4e0ca
6706829: Compressed Oops: add debug info for narrow oops
kvn
parents:
196
diff
changeset
|
630 |
0 | 631 /** Returns true if this is a "core" build, false if either C1 or C2 |
632 is present */ | |
633 public boolean isCore() { | |
634 return (!(usingClientCompiler || usingServerCompiler)); | |
635 } | |
636 | |
637 /** Returns true if this is a C1 build, false otherwise */ | |
638 public boolean isClientCompiler() { | |
639 return usingClientCompiler; | |
640 } | |
641 | |
642 /** Returns true if this is a C2 build, false otherwise */ | |
643 public boolean isServerCompiler() { | |
644 return usingServerCompiler; | |
645 } | |
646 | |
647 /** Returns true if C2 derived pointer table should be used, false otherwise */ | |
648 public boolean useDerivedPointerTable() { | |
649 return !disableDerivedPrinterTableCheck; | |
650 } | |
651 | |
652 /** Returns the code cache; should not be used if is core build */ | |
653 public CodeCache getCodeCache() { | |
654 if (Assert.ASSERTS_ENABLED) { | |
655 Assert.that(!isCore(), "noncore builds only"); | |
656 } | |
657 if (codeCache == null) { | |
658 codeCache = new CodeCache(); | |
659 } | |
660 return codeCache; | |
661 } | |
662 | |
663 /** Should only be called for C1 builds */ | |
664 public Runtime1 getRuntime1() { | |
665 if (Assert.ASSERTS_ENABLED) { | |
666 Assert.that(isClientCompiler(), "C1 builds only"); | |
667 } | |
668 if (runtime1 == null) { | |
669 runtime1 = new Runtime1(); | |
670 } | |
671 return runtime1; | |
672 } | |
673 | |
674 /** Test to see whether we're in debugging mode (NOTE: this really | |
675 should not be tested by this code; currently only used in | |
676 StackFrameStream) */ | |
677 public boolean isDebugging() { | |
678 return (debugger != null); | |
679 } | |
680 | |
681 /** This is only used by the debugging (i.e., non-runtime) system */ | |
682 public JVMDebugger getDebugger() { | |
683 if (debugger == null) { | |
684 throw new RuntimeException("Attempt to use debugger in runtime system"); | |
685 } | |
686 return debugger; | |
687 } | |
688 | |
689 /** Indicates whether a given program counter is in Java code. This | |
690 includes but is not spanned by the interpreter and code cache. | |
691 Only used in the debugging system, for implementing | |
692 JavaThread.currentFrameGuess() on x86. */ | |
693 public boolean isJavaPCDbg(Address addr) { | |
694 // FIXME: this is not a complete enough set: must include areas | |
695 // like vtable stubs | |
696 return (getInterpreter().contains(addr) || | |
697 getCodeCache().contains(addr)); | |
698 } | |
699 | |
700 /** FIXME: figure out where to stick this */ | |
701 public int getInvocationEntryBCI() { | |
702 return invocationEntryBCI; | |
703 } | |
704 | |
705 /** FIXME: figure out where to stick this */ | |
706 public int getInvalidOSREntryBCI() { | |
707 return invalidOSREntryBCI; | |
708 } | |
709 | |
710 // FIXME: figure out where to stick this | |
711 public boolean wizardMode() { | |
712 return true; | |
713 } | |
714 | |
715 public ReversePtrs getRevPtrs() { | |
716 return revPtrs; | |
717 } | |
718 | |
719 public void setRevPtrs(ReversePtrs rp) { | |
720 revPtrs = rp; | |
721 } | |
722 | |
723 // returns null, if not available. | |
724 public String getVMRelease() { | |
725 return vmRelease; | |
726 } | |
727 | |
728 // returns null, if not available. | |
729 public String getVMInternalInfo() { | |
730 return vmInternalInfo; | |
731 } | |
732 | |
733 public boolean isSharingEnabled() { | |
734 if (sharingEnabled == null) { | |
735 Flag flag = getCommandLineFlag("UseSharedSpaces"); | |
736 sharingEnabled = (flag == null)? Boolean.FALSE : | |
737 (flag.getBool()? Boolean.TRUE: Boolean.FALSE); | |
738 } | |
739 return sharingEnabled.booleanValue(); | |
740 } | |
741 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
742 public boolean isCompressedOopsEnabled() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
743 if (compressedOopsEnabled == null) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
744 Flag flag = getCommandLineFlag("UseCompressedOops"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
745 compressedOopsEnabled = (flag == null) ? Boolean.FALSE: |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
746 (flag.getBool()? Boolean.TRUE: Boolean.FALSE); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
747 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
748 return compressedOopsEnabled.booleanValue(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
749 } |
0 | 750 |
751 // returns null, if not available. | |
752 public Flag[] getCommandLineFlags() { | |
753 if (commandLineFlags == null) { | |
754 readCommandLineFlags(); | |
755 } | |
756 | |
757 return commandLineFlags; | |
758 } | |
759 | |
760 public Flag getCommandLineFlag(String name) { | |
761 if (flagsMap == null) { | |
762 flagsMap = new HashMap(); | |
763 Flag[] flags = getCommandLineFlags(); | |
764 for (int i = 0; i < flags.length; i++) { | |
765 flagsMap.put(flags[i].getName(), flags[i]); | |
766 } | |
767 } | |
768 return (Flag) flagsMap.get(name); | |
769 } | |
770 | |
771 private void readCommandLineFlags() { | |
772 // get command line flags | |
773 TypeDataBase db = getTypeDataBase(); | |
774 try { | |
775 Type flagType = db.lookupType("Flag"); | |
776 int numFlags = (int) flagType.getCIntegerField("numFlags").getValue(); | |
777 // NOTE: last flag contains null values. | |
778 commandLineFlags = new Flag[numFlags - 1]; | |
779 | |
780 Address flagAddr = flagType.getAddressField("flags").getValue(); | |
781 | |
782 AddressField typeFld = flagType.getAddressField("type"); | |
783 AddressField nameFld = flagType.getAddressField("name"); | |
784 AddressField addrFld = flagType.getAddressField("addr"); | |
785 AddressField kindFld = flagType.getAddressField("kind"); | |
786 | |
787 long flagSize = flagType.getSize(); // sizeof(Flag) | |
788 | |
789 // NOTE: last flag contains null values. | |
790 for (int f = 0; f < numFlags - 1; f++) { | |
791 String type = CStringUtilities.getString(typeFld.getValue(flagAddr)); | |
792 String name = CStringUtilities.getString(nameFld.getValue(flagAddr)); | |
793 Address addr = addrFld.getValue(flagAddr); | |
794 String kind = CStringUtilities.getString(kindFld.getValue(flagAddr)); | |
795 commandLineFlags[f] = new Flag(type, name, addr, kind); | |
796 flagAddr = flagAddr.addOffsetTo(flagSize); | |
797 } | |
798 | |
799 // sort flags by name | |
800 Arrays.sort(commandLineFlags, new Comparator() { | |
801 public int compare(Object o1, Object o2) { | |
802 Flag f1 = (Flag) o1; | |
803 Flag f2 = (Flag) o2; | |
804 return f1.getName().compareTo(f2.getName()); | |
805 } | |
806 }); | |
807 } catch (Exception exp) { | |
808 // ignore. may be older version. command line flags not available. | |
809 } | |
810 } | |
811 | |
812 public String getSystemProperty(String key) { | |
813 Properties props = getSystemProperties(); | |
814 return (props != null)? props.getProperty(key) : null; | |
815 } | |
816 | |
817 public Properties getSystemProperties() { | |
818 if (sysProps == null) { | |
819 readSystemProperties(); | |
820 } | |
821 return sysProps; | |
822 } | |
823 | |
824 private void readSystemProperties() { | |
825 InstanceKlass systemKls = getSystemDictionary().getSystemKlass(); | |
826 systemKls.iterate(new DefaultOopVisitor() { | |
827 ObjectReader objReader = new ObjectReader(); | |
828 public void doOop(sun.jvm.hotspot.oops.OopField field, boolean isVMField) { | |
829 if (field.getID().getName().equals("props")) { | |
830 try { | |
831 sysProps = (Properties) objReader.readObject(field.getValue(getObj())); | |
832 } catch (Exception e) { | |
833 if (Assert.ASSERTS_ENABLED) { | |
834 e.printStackTrace(); | |
835 } | |
836 } | |
837 } | |
838 } | |
839 }, false); | |
840 } | |
841 } |