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