WhiteBox.java revision 1413:0a5629c31104
139092Srnordier/*
239092Srnordier * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
339092Srnordier * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
439092Srnordier *
539092Srnordier * This code is free software; you can redistribute it and/or modify it
639092Srnordier * under the terms of the GNU General Public License version 2 only, as
739092Srnordier * published by the Free Software Foundation.
839092Srnordier *
939092Srnordier * This code is distributed in the hope that it will be useful, but WITHOUT
1039092Srnordier * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1139092Srnordier * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1239092Srnordier * version 2 for more details (a copy is included in the LICENSE file that
1339092Srnordier * accompanied this code).
1439092Srnordier *
1539092Srnordier * You should have received a copy of the GNU General Public License version
1639092Srnordier * 2 along with this work; if not, write to the Free Software Foundation,
1739092Srnordier * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1839092Srnordier *
1939092Srnordier * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2039092Srnordier * or visit www.oracle.com if you need additional information or have any
2139092Srnordier * questions.
2239092Srnordier *
2339092Srnordier */
2439092Srnordier
2539092Srnordierpackage sun.hotspot;
2639092Srnordier
2739092Srnordierimport java.lang.management.MemoryUsage;
2839092Srnordierimport java.lang.reflect.Executable;
2950479Speterimport java.util.Arrays;
3039092Srnordierimport java.util.List;
3139092Srnordierimport java.util.function.BiFunction;
32103917Smikeimport java.util.function.Function;
33130927Sobrienimport java.util.stream.Stream;
3439092Srnordierimport java.security.BasicPermission;
3539092Srnordier
3639092Srnordierimport sun.hotspot.parser.DiagnosticCommand;
37142108Sru
38142108Srupublic class WhiteBox {
39142108Sru
40142108Sru  @SuppressWarnings("serial")
41142108Sru  public static class WhiteBoxPermission extends BasicPermission {
42154711Sdelphij    public WhiteBoxPermission(String s) {
43154711Sdelphij      super(s);
44130927Sobrien    }
4539092Srnordier  }
4639092Srnordier
4739092Srnordier  private WhiteBox() {}
4839092Srnordier  private static final WhiteBox instance = new WhiteBox();
4939092Srnordier  private static native void registerNatives();
5039092Srnordier
5139092Srnordier  /**
5239092Srnordier   * Returns the singleton WhiteBox instance.
5339092Srnordier   *
5439092Srnordier   * The returned WhiteBox object should be carefully guarded
5539092Srnordier   * by the caller, since it can be used to read and write data
5639092Srnordier   * at arbitrary memory addresses. It must never be passed to
5739092Srnordier   * untrusted code.
5839092Srnordier   */
5939092Srnordier  public synchronized static WhiteBox getWhiteBox() {
6039092Srnordier    SecurityManager sm = System.getSecurityManager();
6139092Srnordier    if (sm != null) {
6239092Srnordier      sm.checkPermission(new WhiteBoxPermission("getInstance"));
6339092Srnordier    }
6439092Srnordier    return instance;
6539092Srnordier  }
6639092Srnordier
6739092Srnordier  static {
6839092Srnordier    registerNatives();
6939092Srnordier  }
7039092Srnordier
7139092Srnordier  // Get the maximum heap size supporting COOPs
7239092Srnordier  public native long getCompressedOopsMaxHeapSize();
7339092Srnordier  // Arguments
7455416Smarcel  public native void printHeapSizes();
7555416Smarcel
7655416Smarcel  // Memory
7755416Smarcel  public native long getObjectAddress(Object o);
7855416Smarcel  public native int  getHeapOopSize();
7955416Smarcel  public native int  getVMPageSize();
8055416Smarcel  public native boolean isObjectInOldGen(Object o);
8155416Smarcel  public native long getObjectSize(Object o);
8239092Srnordier
8339092Srnordier  // Runtime
8439092Srnordier  // Make sure class name is in the correct format
8539092Srnordier  public boolean isClassAlive(String name) {
8639092Srnordier    return isClassAlive0(name.replace('.', '/'));
8739092Srnordier  }
8839092Srnordier  private native boolean isClassAlive0(String name);
8939092Srnordier  public native boolean isMonitorInflated(Object obj);
9039092Srnordier  public native void forceSafepoint();
9139092Srnordier
9239092Srnordier  // JVMTI
9339092Srnordier  public native void addToBootstrapClassLoaderSearch(String segment);
9439092Srnordier  public native void addToSystemClassLoaderSearch(String segment);
9539092Srnordier
9639092Srnordier  // G1
9739092Srnordier  public native boolean g1InConcurrentMark();
9839092Srnordier  public native boolean g1IsHumongous(Object o);
9939092Srnordier  public native long    g1NumMaxRegions();
10039092Srnordier  public native long    g1NumFreeRegions();
10139092Srnordier  public native int     g1RegionSize();
10239092Srnordier  public native MemoryUsage g1AuxiliaryMemoryUsage();
10339092Srnordier  public native Object[]    parseCommandLine(String commandline, char delim, DiagnosticCommand[] args);
10455416Smarcel
10539092Srnordier  // NMT
10639092Srnordier  public native long NMTMalloc(long size);
10739092Srnordier  public native void NMTFree(long mem);
10839092Srnordier  public native long NMTReserveMemory(long size);
10939125Srnordier  public native void NMTCommitMemory(long addr, long size);
11039125Srnordier  public native void NMTUncommitMemory(long addr, long size);
11139092Srnordier  public native void NMTReleaseMemory(long addr, long size);
11239092Srnordier  public native long NMTMallocWithPseudoStack(long size, int index);
11339092Srnordier  public native boolean NMTIsDetailSupported();
11439092Srnordier  public native boolean NMTChangeTrackingLevel();
11539092Srnordier  public native int NMTGetHashSize();
11639092Srnordier
11739092Srnordier  // Compiler
11839092Srnordier  public native int     deoptimizeFrames(boolean makeNotEntrant);
11939092Srnordier  public native void    deoptimizeAll();
12039092Srnordier  public        boolean isMethodCompiled(Executable method) {
12139092Srnordier    return isMethodCompiled(method, false /*not osr*/);
12239092Srnordier  }
12339092Srnordier  public native boolean isMethodCompiled(Executable method, boolean isOsr);
12439092Srnordier  public        boolean isMethodCompilable(Executable method) {
12539092Srnordier    return isMethodCompilable(method, -1 /*any*/);
12655416Smarcel  }
12739092Srnordier  public        boolean isMethodCompilable(Executable method, int compLevel) {
12839092Srnordier    return isMethodCompilable(method, compLevel, false /*not osr*/);
12939092Srnordier  }
13039092Srnordier  public native boolean isMethodCompilable(Executable method, int compLevel, boolean isOsr);
13139092Srnordier  public native boolean isMethodQueuedForCompilation(Executable method);
13239092Srnordier  public        int     deoptimizeMethod(Executable method) {
13339092Srnordier    return deoptimizeMethod(method, false /*not osr*/);
13439092Srnordier  }
13539092Srnordier  public native int     deoptimizeMethod(Executable method, boolean isOsr);
13639092Srnordier  public        void    makeMethodNotCompilable(Executable method) {
13739092Srnordier    makeMethodNotCompilable(method, -1 /*any*/);
13839092Srnordier  }
13939092Srnordier  public        void    makeMethodNotCompilable(Executable method, int compLevel) {
14039092Srnordier    makeMethodNotCompilable(method, compLevel, false /*not osr*/);
14139092Srnordier  }
14239092Srnordier  public native void    makeMethodNotCompilable(Executable method, int compLevel, boolean isOsr);
14339092Srnordier  public        int     getMethodCompilationLevel(Executable method) {
14439092Srnordier    return getMethodCompilationLevel(method, false /*not ost*/);
14539092Srnordier  }
14639092Srnordier  public native int     getMethodCompilationLevel(Executable method, boolean isOsr);
14739092Srnordier  public native boolean testSetDontInlineMethod(Executable method, boolean value);
14839092Srnordier  public        int     getCompileQueuesSize() {
14939092Srnordier    return getCompileQueueSize(-1 /*any*/);
15039092Srnordier  }
15139092Srnordier  public native int     getCompileQueueSize(int compLevel);
15239092Srnordier  public native boolean testSetForceInlineMethod(Executable method, boolean value);
15339125Srnordier  public        boolean enqueueMethodForCompilation(Executable method, int compLevel) {
15439092Srnordier    return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
15539092Srnordier  }
15639092Srnordier  public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
15739092Srnordier  public native void    clearMethodState(Executable method);
15839092Srnordier  public native void    lockCompilation();
15939092Srnordier  public native void    unlockCompilation();
16039092Srnordier  public native int     getMethodEntryBci(Executable method);
16139092Srnordier  public native Object[] getNMethod(Executable method, boolean isOsr);
16239092Srnordier  public native long    allocateCodeBlob(int size, int type);
16339092Srnordier  public        long    allocateCodeBlob(long size, int type) {
16439092Srnordier      int intSize = (int) size;
16539092Srnordier      if ((long) intSize != size || size < 0) {
16639092Srnordier          throw new IllegalArgumentException(
16739092Srnordier                "size argument has illegal value " + size);
16839092Srnordier      }
16939092Srnordier      return allocateCodeBlob( intSize, type);
17039092Srnordier  }
17139092Srnordier  public native void    freeCodeBlob(long addr);
17239092Srnordier  public        void    forceNMethodSweep() {
17339092Srnordier    try {
17439092Srnordier        forceNMethodSweep0().join();
17539092Srnordier    } catch (InterruptedException e) {
17639092Srnordier        Thread.currentThread().interrupt();
17739092Srnordier    }
17839092Srnordier  }
17939092Srnordier  public native Thread  forceNMethodSweep0();
18039092Srnordier  public native Object[] getCodeHeapEntries(int type);
18139092Srnordier  public native int     getCompilationActivityMode();
18239092Srnordier  public native Object[] getCodeBlob(long addr);
18339092Srnordier
18439092Srnordier  // Intered strings
18539092Srnordier  public native boolean isInStringTable(String str);
18639092Srnordier
18739092Srnordier  // Memory
18839092Srnordier  public native void readReservedMemory();
18939092Srnordier  public native long allocateMetaspace(ClassLoader classLoader, long size);
19039092Srnordier  public native void freeMetaspace(ClassLoader classLoader, long addr, long size);
19139092Srnordier  public native long incMetaspaceCapacityUntilGC(long increment);
19239092Srnordier  public native long metaspaceCapacityUntilGC();
19339092Srnordier
19439092Srnordier  // Force Young GC
19539092Srnordier  public native void youngGC();
19639092Srnordier
19739092Srnordier  // Force Full GC
19839092Srnordier  public native void fullGC();
19939092Srnordier
20039092Srnordier  // Method tries to start concurrent mark cycle.
20139092Srnordier  // It returns false if CM Thread is always in concurrent cycle.
202112092Sru  public native boolean g1StartConcMarkCycle();
20339092Srnordier
20455416Smarcel  // Tests on ReservedSpace/VirtualSpace classes
20539092Srnordier  public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
20639092Srnordier  public native void runMemoryUnitTests();
20755416Smarcel  public native void readFromNoaccessArea();
20855416Smarcel  public native long getThreadStackSize();
20939092Srnordier  public native long getThreadRemainingStackSize();
21039092Srnordier
21139092Srnordier  // CPU features
21239092Srnordier  public native String getCPUFeatures();
21339092Srnordier
21439092Srnordier  // Native extensions
21539092Srnordier  public native long getHeapUsageForContext(int context);
21639092Srnordier  public native long getHeapRegionCountForContext(int context);
21739092Srnordier  public native int getContextForObject(Object obj);
21839092Srnordier  public native void printRegionInfo(int context);
21939092Srnordier
22039092Srnordier  // VM flags
22139092Srnordier  public native boolean isConstantVMFlag(String name);
22239092Srnordier  public native boolean isLockedVMFlag(String name);
22339092Srnordier  public native void    setBooleanVMFlag(String name, boolean value);
22439092Srnordier  public native void    setIntxVMFlag(String name, long value);
22539092Srnordier  public native void    setUintxVMFlag(String name, long value);
22639092Srnordier  public native void    setUint64VMFlag(String name, long value);
22739092Srnordier  public native void    setSizeTVMFlag(String name, long value);
22839092Srnordier  public native void    setStringVMFlag(String name, String value);
22939092Srnordier  public native void    setDoubleVMFlag(String name, double value);
23039092Srnordier  public native Boolean getBooleanVMFlag(String name);
23139092Srnordier  public native Long    getIntxVMFlag(String name);
23239092Srnordier  public native Long    getUintxVMFlag(String name);
23339092Srnordier  public native Long    getUint64VMFlag(String name);
23439092Srnordier  public native Long    getSizeTVMFlag(String name);
23539092Srnordier  public native String  getStringVMFlag(String name);
23639092Srnordier  public native Double  getDoubleVMFlag(String name);
23739092Srnordier  private final List<Function<String,Object>> flagsGetters = Arrays.asList(
23839092Srnordier    this::getBooleanVMFlag, this::getIntxVMFlag, this::getUintxVMFlag,
23955416Smarcel    this::getUint64VMFlag, this::getSizeTVMFlag, this::getStringVMFlag,
24039092Srnordier    this::getDoubleVMFlag);
24139092Srnordier
24239092Srnordier  public Object getVMFlag(String name) {
24339092Srnordier    return flagsGetters.stream()
24439092Srnordier                       .map(f -> f.apply(name))
24539092Srnordier                       .filter(x -> x != null)
24639092Srnordier                       .findAny()
24755416Smarcel                       .orElse(null);
24839092Srnordier  }
24939092Srnordier  public native int getOffsetForName0(String name);
25039092Srnordier  public int getOffsetForName(String name) throws Exception {
25139092Srnordier    int offset = getOffsetForName0(name);
25239092Srnordier    if (offset == -1) {
25339092Srnordier      throw new RuntimeException(name + " not found");
25439125Srnordier    }
255154711Sdelphij    return offset;
25639092Srnordier  }
25739092Srnordier  public native Boolean getMethodBooleanOption(Executable method, String name);
25839092Srnordier  public native Long    getMethodIntxOption(Executable method, String name);
25939092Srnordier  public native Long    getMethodUintxOption(Executable method, String name);
26039092Srnordier  public native Double  getMethodDoubleOption(Executable method, String name);
26139092Srnordier  public native String  getMethodStringOption(Executable method, String name);
26239092Srnordier  private final List<BiFunction<Executable,String,Object>> methodOptionGetters
26339092Srnordier      = Arrays.asList(this::getMethodBooleanOption, this::getMethodIntxOption,
26439092Srnordier          this::getMethodUintxOption, this::getMethodDoubleOption,
26539092Srnordier          this::getMethodStringOption);
26639092Srnordier
26739092Srnordier  public Object getMethodOption(Executable method, String name) {
26839092Srnordier    return methodOptionGetters.stream()
26939092Srnordier                              .map(f -> f.apply(method, name))
270112092Sru                              .filter(x -> x != null)
271130927Sobrien                              .findAny()
272130927Sobrien                              .orElse(null);
273130927Sobrien  }
274112092Sru
27539092Srnordier  // Safepoint Checking
27639092Srnordier  public native void assertMatchingSafepointCalls(boolean mutexSafepointValue, boolean attemptedNoSafepointValue);
27739092Srnordier}
27839092Srnordier