Universe.java revision 13353:46bb2774fc88
1198892Srdivacky/* 2198892Srdivacky * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. 3353358Sdim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4353358Sdim * 5353358Sdim * This code is free software; you can redistribute it and/or modify it 6198892Srdivacky * under the terms of the GNU General Public License version 2 only, as 7198892Srdivacky * published by the Free Software Foundation. 8198892Srdivacky * 9198892Srdivacky * This code is distributed in the hope that it will be useful, but WITHOUT 10221345Sdim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11198892Srdivacky * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12341825Sdim * version 2 for more details (a copy is included in the LICENSE file that 13360784Sdim * accompanied this code). 14198892Srdivacky * 15198892Srdivacky * You should have received a copy of the GNU General Public License version 16198892Srdivacky * 2 along with this work; if not, write to the Free Software Foundation, 17198892Srdivacky * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18198892Srdivacky * 19276479Sdim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20276479Sdim * or visit www.oracle.com if you need additional information or have any 21198892Srdivacky * questions. 22360784Sdim * 23360784Sdim */ 24360784Sdim 25360784Sdimpackage sun.jvm.hotspot.memory; 26360784Sdim 27360784Sdimimport java.io.*; 28360784Sdimimport java.util.*; 29360784Sdimimport sun.jvm.hotspot.debugger.*; 30360784Sdimimport sun.jvm.hotspot.gc.shared.*; 31360784Sdimimport sun.jvm.hotspot.gc.g1.G1CollectedHeap; 32321369Sdimimport sun.jvm.hotspot.gc.parallel.*; 33218893Sdimimport sun.jvm.hotspot.oops.*; 34198892Srdivackyimport sun.jvm.hotspot.types.*; 35221345Sdimimport sun.jvm.hotspot.runtime.*; 36199481Srdivacky 37198892Srdivacky 38198892Srdivackypublic class Universe { 39198892Srdivacky private static AddressField collectedHeapField; 40198892Srdivacky private static VirtualConstructor heapConstructor; 41198892Srdivacky private static sun.jvm.hotspot.types.OopField mainThreadGroupField; 42198892Srdivacky private static sun.jvm.hotspot.types.OopField systemThreadGroupField; 43198892Srdivacky 44221345Sdim // single dimensional primitive array klasses 45198892Srdivacky private static sun.jvm.hotspot.types.AddressField boolArrayKlassField; 46234982Sdim private static sun.jvm.hotspot.types.AddressField byteArrayKlassField; 47234982Sdim private static sun.jvm.hotspot.types.AddressField charArrayKlassField; 48198892Srdivacky private static sun.jvm.hotspot.types.AddressField intArrayKlassField; 49198892Srdivacky private static sun.jvm.hotspot.types.AddressField shortArrayKlassField; 50198892Srdivacky private static sun.jvm.hotspot.types.AddressField longArrayKlassField; 51198892Srdivacky private static sun.jvm.hotspot.types.AddressField singleArrayKlassField; 52198892Srdivacky private static sun.jvm.hotspot.types.AddressField doubleArrayKlassField; 53198892Srdivacky 54198892Srdivacky private static AddressField narrowOopBaseField; 55198892Srdivacky private static CIntegerField narrowOopShiftField; 56198892Srdivacky private static AddressField narrowKlassBaseField; 57198892Srdivacky private static CIntegerField narrowKlassShiftField; 58234982Sdim 59198892Srdivacky public enum NARROW_OOP_MODE { 60198892Srdivacky UnscaledNarrowOop, 61198892Srdivacky ZeroBasedNarrowOop, 62198892Srdivacky HeapBasedNarrowOop 63198892Srdivacky } 64198892Srdivacky 65198892Srdivacky static { 66234982Sdim VM.registerVMInitializedObserver(new Observer() { 67198892Srdivacky public void update(Observable o, Object data) { 68198892Srdivacky initialize(VM.getVM().getTypeDataBase()); 69221345Sdim } 70198892Srdivacky }); 71198892Srdivacky } 72198892Srdivacky 73198892Srdivacky private static synchronized void initialize(TypeDataBase db) { 74198892Srdivacky Type type = db.lookupType("Universe"); 75221345Sdim 76221345Sdim collectedHeapField = type.getAddressField("_collectedHeap"); 77198892Srdivacky 78276479Sdim heapConstructor = new VirtualConstructor(db); 79201360Srdivacky heapConstructor.addMapping("GenCollectedHeap", GenCollectedHeap.class); 80203954Srdivacky heapConstructor.addMapping("ParallelScavengeHeap", ParallelScavengeHeap.class); 81309124Sdim heapConstructor.addMapping("G1CollectedHeap", G1CollectedHeap.class); 82198892Srdivacky 83234982Sdim mainThreadGroupField = type.getOopField("_main_thread_group"); 84198892Srdivacky systemThreadGroupField = type.getOopField("_system_thread_group"); 85309124Sdim 86341825Sdim boolArrayKlassField = type.getAddressField("_boolArrayKlassObj"); 87202878Srdivacky byteArrayKlassField = type.getAddressField("_byteArrayKlassObj"); 88198892Srdivacky charArrayKlassField = type.getAddressField("_charArrayKlassObj"); 89198892Srdivacky intArrayKlassField = type.getAddressField("_intArrayKlassObj"); 90309124Sdim shortArrayKlassField = type.getAddressField("_shortArrayKlassObj"); 91198892Srdivacky longArrayKlassField = type.getAddressField("_longArrayKlassObj"); 92198892Srdivacky singleArrayKlassField = type.getAddressField("_singleArrayKlassObj"); 93309124Sdim doubleArrayKlassField = type.getAddressField("_doubleArrayKlassObj"); 94309124Sdim 95198892Srdivacky narrowOopBaseField = type.getAddressField("_narrow_oop._base"); 96198892Srdivacky narrowOopShiftField = type.getCIntegerField("_narrow_oop._shift"); 97221345Sdim narrowKlassBaseField = type.getAddressField("_narrow_klass._base"); 98276479Sdim narrowKlassShiftField = type.getCIntegerField("_narrow_klass._shift"); 99198892Srdivacky 100309124Sdim UniverseExt.initialize(heapConstructor); 101309124Sdim } 102234353Sdim 103309124Sdim public Universe() { 104198892Srdivacky } 105198892Srdivacky public static String narrowOopModeToString(NARROW_OOP_MODE mode) { 106198892Srdivacky switch (mode) { 107353358Sdim case UnscaledNarrowOop: 108198892Srdivacky return "32-bits Oops"; 109341825Sdim case ZeroBasedNarrowOop: 110198892Srdivacky return "zero based Compressed Oops"; 111198892Srdivacky case HeapBasedNarrowOop: 112198892Srdivacky return "Compressed Oops with base"; 113198892Srdivacky } 114198892Srdivacky return ""; 115321369Sdim } 116321369Sdim public CollectedHeap heap() { 117321369Sdim return (CollectedHeap) heapConstructor.instantiateWrapperFor(collectedHeapField.getValue()); 118321369Sdim } 119321369Sdim 120321369Sdim public static long getNarrowOopBase() { 121321369Sdim if (narrowOopBaseField.getValue() == null) { 122321369Sdim return 0; 123321369Sdim } else { 124321369Sdim return narrowOopBaseField.getValue().minus(null); 125321369Sdim } 126321369Sdim } 127321369Sdim 128321369Sdim public static int getNarrowOopShift() { 129321369Sdim return (int)narrowOopShiftField.getValue(); 130321369Sdim } 131321369Sdim 132321369Sdim public static long getNarrowKlassBase() { 133321369Sdim if (narrowKlassBaseField.getValue() == null) { 134321369Sdim return 0; 135321369Sdim } else { 136321369Sdim return narrowKlassBaseField.getValue().minus(null); 137321369Sdim } 138321369Sdim } 139321369Sdim 140321369Sdim public static int getNarrowKlassShift() { 141321369Sdim return (int)narrowKlassShiftField.getValue(); 142321369Sdim } 143321369Sdim 144321369Sdim 145321369Sdim /** Returns "TRUE" iff "p" points into the allocated area of the heap. */ 146321369Sdim public boolean isIn(Address p) { 147321369Sdim return heap().isIn(p); 148321369Sdim } 149321369Sdim 150321369Sdim /** Returns "TRUE" iff "p" points into the reserved area of the heap. */ 151321369Sdim public boolean isInReserved(Address p) { 152321369Sdim return heap().isInReserved(p); 153321369Sdim } 154321369Sdim 155321369Sdim private Oop newOop(OopHandle handle) { 156321369Sdim return VM.getVM().getObjectHeap().newOop(handle); 157234982Sdim } 158221345Sdim 159234982Sdim public Oop mainThreadGroup() { 160221345Sdim return newOop(mainThreadGroupField.getValue()); 161221345Sdim } 162288943Sdim 163199481Srdivacky public Oop systemThreadGroup() { 164276479Sdim return newOop(systemThreadGroupField.getValue()); 165234982Sdim } 166221345Sdim 167234982Sdim 168234982Sdim public void print() { printOn(System.out); } 169221345Sdim public void printOn(PrintStream tty) { 170234982Sdim heap().printOn(tty); 171221345Sdim } 172341825Sdim 173341825Sdim // Check whether an element of a typeArrayOop with the given type must be 174221345Sdim // aligned 0 mod 8. The typeArrayOop itself must be aligned at least this 175198892Srdivacky // strongly. 176198892Srdivacky public static boolean elementTypeShouldBeAligned(BasicType type) { 177249423Sdim return type == BasicType.T_DOUBLE || type == BasicType.T_LONG; 178249423Sdim } 179249423Sdim 180249423Sdim // Check whether an object field (static/non-static) of the given type must be 181249423Sdim // aligned 0 mod 8. 182249423Sdim public static boolean fieldTypeShouldBeAligned(BasicType type) { 183249423Sdim return type == BasicType.T_DOUBLE || type == BasicType.T_LONG; 184249423Sdim } 185309124Sdim} 186249423Sdim