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