WhiteBox.java 18.7 KB
Newer Older
A
apetushkov 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/*
 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package sun.hotspot;

import java.lang.management.MemoryUsage;
import java.lang.reflect.Executable;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.security.BasicPermission;
import java.util.Objects;
34
import java.net.URL;
A
apetushkov 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

import sun.hotspot.parser.DiagnosticCommand;

public class WhiteBox {
  @SuppressWarnings("serial")
  public static class WhiteBoxPermission extends BasicPermission {
    public WhiteBoxPermission(String s) {
      super(s);
    }
  }

  private WhiteBox() {}
  private static final WhiteBox instance = new WhiteBox();
  private static native void registerNatives();

  /**
   * Returns the singleton WhiteBox instance.
   *
   * The returned WhiteBox object should be carefully guarded
   * by the caller, since it can be used to read and write data
   * at arbitrary memory addresses. It must never be passed to
   * untrusted code.
   */
  public synchronized static WhiteBox getWhiteBox() {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
      sm.checkPermission(new WhiteBoxPermission("getInstance"));
    }
    return instance;
  }

  static {
    registerNatives();
  }

  // Get the maximum heap size supporting COOPs
  public native long getCompressedOopsMaxHeapSize();
  // Arguments
  public native void printHeapSizes();

  // Memory
76
  public native long getObjectAddress(Object o);
A
apetushkov 已提交
77 78 79 80 81 82 83
  public native int  getHeapOopSize();
  public native int  getVMPageSize();
  public native long getVMAllocationGranularity();
  public native long getVMLargePageSize();
  public native long getHeapSpaceAlignment();
  public native long getHeapAlignment();

84 85
  public native boolean isObjectInOldGen(Object o);
  public native long getObjectSize(Object o);
A
apetushkov 已提交
86

87 88 89
  public native boolean classKnownToNotExist(ClassLoader loader, String name);
  public native URL[] getLookupCacheURLs(ClassLoader loader);
  public native int[] getLookupCacheMatches(ClassLoader loader, String name);
A
apetushkov 已提交
90 91 92 93 94 95 96 97

  // Runtime
  // Make sure class name is in the correct format
  public boolean isClassAlive(String name) {
    return isClassAlive0(name.replace('.', '/'));
  }
  private native boolean isClassAlive0(String name);

98
  public native boolean isMonitorInflated(Object obj);
A
apetushkov 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

  public native void forceSafepoint();

  private native long getConstantPool0(Class<?> aClass);
  public         long getConstantPool(Class<?> aClass) {
    Objects.requireNonNull(aClass);
    return getConstantPool0(aClass);
  }

  private native int getConstantPoolCacheIndexTag0();
  public         int getConstantPoolCacheIndexTag() {
    return getConstantPoolCacheIndexTag0();
  }

  private native int getConstantPoolCacheLength0(Class<?> aClass);
  public         int getConstantPoolCacheLength(Class<?> aClass) {
    Objects.requireNonNull(aClass);
    return getConstantPoolCacheLength0(aClass);
  }

  private native int remapInstructionOperandFromCPCache0(Class<?> aClass, int index);
  public         int remapInstructionOperandFromCPCache(Class<?> aClass, int index) {
    Objects.requireNonNull(aClass);
    return remapInstructionOperandFromCPCache0(aClass, index);
  }

  private native int encodeConstantPoolIndyIndex0(int index);
  public         int encodeConstantPoolIndyIndex(int index) {
    return encodeConstantPoolIndyIndex0(index);
  }

  // JVMTI
131 132
  public native void addToBootstrapClassLoaderSearch(String segment);
  public native void addToSystemClassLoaderSearch(String segment);
A
apetushkov 已提交
133 134 135

  // G1
  public native boolean g1InConcurrentMark();
136 137 138
  public native boolean g1IsHumongous(Object o);
  public native boolean g1BelongsToHumongousRegion(long adr);
  public native boolean g1BelongsToFreeRegion(long adr);
A
apetushkov 已提交
139 140 141 142
  public native long    g1NumMaxRegions();
  public native long    g1NumFreeRegions();
  public native int     g1RegionSize();
  public native MemoryUsage g1AuxiliaryMemoryUsage();
143
  public native Object[]    parseCommandLine(String commandline, DiagnosticCommand[] args);
A
apetushkov 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167

  // Parallel GC
  public native long psVirtualSpaceAlignment();
  public native long psHeapGenerationAlignment();

  /**
   * Enumerates old regions with liveness less than specified and produces some statistics
   * @param liveness percent of region's liveness (live_objects / total_region_size * 100).
   * @return long[3] array where long[0] - total count of old regions
   *                             long[1] - total memory of old regions
   *                             long[2] - lowest estimation of total memory of old regions to be freed (non-full
   *                             regions are not included)
   */
  public native long[] g1GetMixedGCInfo(int liveness);

  // NMT
  public native long NMTMalloc(long size);
  public native void NMTFree(long mem);
  public native long NMTReserveMemory(long size);
  public native long NMTAttemptReserveMemoryAt(long addr, long size);
  public native void NMTCommitMemory(long addr, long size);
  public native void NMTUncommitMemory(long addr, long size);
  public native void NMTReleaseMemory(long addr, long size);
  public native long NMTMallocWithPseudoStack(long size, int index);
168 169
  public native long NMTMallocWithPseudoStackAndType(long size, int index, int type);
  public native boolean NMTIsDetailSupported();
A
apetushkov 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182
  public native boolean NMTChangeTrackingLevel();
  public native int NMTGetHashSize();

  // Compiler
  public native int     matchesMethod(Executable method, String pattern);
  public native int     matchesInline(Executable method, String pattern);
  public native boolean shouldPrintAssembly(Executable method, int comp_level);
  public native int     deoptimizeFrames(boolean makeNotEntrant);
  public native void    deoptimizeAll();

  public        boolean isMethodCompiled(Executable method) {
    return isMethodCompiled(method, false /*not osr*/);
  }
183
  public native boolean isMethodCompiled(Executable method, boolean isOsr);
A
apetushkov 已提交
184 185 186 187 188 189
  public        boolean isMethodCompilable(Executable method) {
    return isMethodCompilable(method, -2 /*any*/);
  }
  public        boolean isMethodCompilable(Executable method, int compLevel) {
    return isMethodCompilable(method, compLevel, false /*not osr*/);
  }
190 191 192 193
  public native boolean isMethodCompilable(Executable method, int compLevel, boolean isOsr);

  public native boolean isMethodQueuedForCompilation(Executable method);

A
apetushkov 已提交
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
  // Determine if the compiler corresponding to the compilation level 'compLevel'
  // and to the compilation context 'compilation_context' provides an intrinsic
  // for the method 'method'. An intrinsic is available for method 'method' if:
  //  - the intrinsic is enabled (by using the appropriate command-line flag) and
  //  - the platform on which the VM is running provides the instructions necessary
  //    for the compiler to generate the intrinsic code.
  //
  // The compilation context is related to using the DisableIntrinsic flag on a
  // per-method level, see hotspot/src/share/vm/compiler/abstractCompiler.hpp
  // for more details.
  public boolean isIntrinsicAvailable(Executable method,
                                      Executable compilationContext,
                                      int compLevel) {
      Objects.requireNonNull(method);
      return isIntrinsicAvailable0(method, compilationContext, compLevel);
  }
  // If usage of the DisableIntrinsic flag is not expected (or the usage can be ignored),
  // use the below method that does not require the compilation context as argument.
  public boolean isIntrinsicAvailable(Executable method, int compLevel) {
      return isIntrinsicAvailable(method, null, compLevel);
  }
  private native boolean isIntrinsicAvailable0(Executable method,
                                               Executable compilationContext,
                                               int compLevel);
  public        int     deoptimizeMethod(Executable method) {
    return deoptimizeMethod(method, false /*not osr*/);
  }
221
  public native int     deoptimizeMethod(Executable method, boolean isOsr);
A
apetushkov 已提交
222 223 224 225 226 227
  public        void    makeMethodNotCompilable(Executable method) {
    makeMethodNotCompilable(method, -2 /*any*/);
  }
  public        void    makeMethodNotCompilable(Executable method, int compLevel) {
    makeMethodNotCompilable(method, compLevel, false /*not osr*/);
  }
228
  public native void    makeMethodNotCompilable(Executable method, int compLevel, boolean isOsr);
A
apetushkov 已提交
229 230 231
  public        int     getMethodCompilationLevel(Executable method) {
    return getMethodCompilationLevel(method, false /*not ost*/);
  }
232 233
  public native int     getMethodCompilationLevel(Executable method, boolean isOsr);
  public native boolean testSetDontInlineMethod(Executable method, boolean value);
A
apetushkov 已提交
234 235 236 237
  public        int     getCompileQueuesSize() {
    return getCompileQueueSize(-2 /*any*/);
  }
  public native int     getCompileQueueSize(int compLevel);
238 239
  public native boolean testSetForceInlineMethod(Executable method, boolean value);

A
apetushkov 已提交
240 241 242
  public        boolean enqueueMethodForCompilation(Executable method, int compLevel) {
    return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
  }
243 244 245
  public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
  public native boolean enqueueInitializerForCompilation(Class<?> aClass, int compLevel);
  public native void    clearMethodState(Executable method);
A
apetushkov 已提交
246 247
  public native void    lockCompilation();
  public native void    unlockCompilation();
248 249
  public native int     getMethodEntryBci(Executable method);
  public native Object[] getNMethod(Executable method, boolean isOsr);
A
apetushkov 已提交
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
  public native long    allocateCodeBlob(int size, int type);
  public        long    allocateCodeBlob(long size, int type) {
      int intSize = (int) size;
      if ((long) intSize != size || size < 0) {
          throw new IllegalArgumentException(
                "size argument has illegal value " + size);
      }
      return allocateCodeBlob( intSize, type);
  }
  public native void    freeCodeBlob(long addr);
  public native void    forceNMethodSweep();
  public native Object[] getCodeHeapEntries(int type);
  public native int     getCompilationActivityMode();
  private native long getMethodData0(Executable method);
  public         long getMethodData(Executable method) {
    Objects.requireNonNull(method);
    return getMethodData0(method);
  }
  public native Object[] getCodeBlob(long addr);

  private native void clearInlineCaches0(boolean preserve_static_stubs);
  public void clearInlineCaches() {
    clearInlineCaches0(false);
  }
  public void clearInlineCaches(boolean preserve_static_stubs) {
    clearInlineCaches0(preserve_static_stubs);
  }

  // Intered strings
  public native boolean isInStringTable(String str);

  // Memory
  public native void readReservedMemory();
  public native long allocateMetaspace(ClassLoader classLoader, long size);
  public native void freeMetaspace(ClassLoader classLoader, long addr, long size);
  public native long incMetaspaceCapacityUntilGC(long increment);
  public native long metaspaceCapacityUntilGC();
  public native boolean metaspaceShouldConcurrentCollect();
  public native long metaspaceReserveAlignment();

  // Don't use these methods directly
  // Use sun.hotspot.gc.GC class instead.
  public native boolean isGCSupported(int name);
  public native boolean isGCSelected(int name);
  public native boolean isGCSelectedErgonomically();

  // Force Young GC
  public native void youngGC();

  // Force Full GC
  public native void fullGC();

  // Returns true if the current GC supports control of its concurrent
  // phase via requestConcurrentGCPhase().  If false, a request will
  // always fail.
  public native boolean supportsConcurrentGCPhaseControl();

  // Returns an array of concurrent phase names provided by this
  // collector.  These are the names recognized by
  // requestConcurrentGCPhase().
  public native String[] getConcurrentGCPhases();

  // Attempt to put the collector into the indicated concurrent phase,
  // and attempt to remain in that state until a new request is made.
  //
  // Returns immediately if already in the requested phase.
  // Otherwise, waits until the phase is reached.
  //
  // Throws IllegalStateException if unsupported by the current collector.
  // Throws NullPointerException if phase is null.
  // Throws IllegalArgumentException if phase is not valid for the current collector.
  public void requestConcurrentGCPhase(String phase) {
    if (!supportsConcurrentGCPhaseControl()) {
      throw new IllegalStateException("Concurrent GC phase control not supported");
    } else if (phase == null) {
      throw new NullPointerException("null phase");
    } else if (!requestConcurrentGCPhase0(phase)) {
      throw new IllegalArgumentException("Unknown concurrent GC phase: " + phase);
    }
  }

  // Helper for requestConcurrentGCPhase().  Returns true if request
  // succeeded, false if the phase is invalid.
  private native boolean requestConcurrentGCPhase0(String phase);

  // Method tries to start concurrent mark cycle.
  // It returns false if CM Thread is always in concurrent cycle.
  public native boolean g1StartConcMarkCycle();

  // Tests on ReservedSpace/VirtualSpace classes
  public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
  public native void runMemoryUnitTests();
  public native void readFromNoaccessArea();
  public native long getThreadStackSize();
  public native long getThreadRemainingStackSize();

  // CPU features
  public native String getCPUFeatures();

  // VM flags
  public native boolean isConstantVMFlag(String name);
  public native boolean isLockedVMFlag(String name);
  public native void    setBooleanVMFlag(String name, boolean value);
  public native void    setIntVMFlag(String name, long value);
  public native void    setUintVMFlag(String name, long value);
  public native void    setIntxVMFlag(String name, long value);
  public native void    setUintxVMFlag(String name, long value);
  public native void    setUint64VMFlag(String name, long value);
  public native void    setSizeTVMFlag(String name, long value);
  public native void    setStringVMFlag(String name, String value);
  public native void    setDoubleVMFlag(String name, double value);
  public native Boolean getBooleanVMFlag(String name);
  public native Long    getIntVMFlag(String name);
  public native Long    getUintVMFlag(String name);
  public native Long    getIntxVMFlag(String name);
  public native Long    getUintxVMFlag(String name);
  public native Long    getUint64VMFlag(String name);
  public native Long    getSizeTVMFlag(String name);
  public native String  getStringVMFlag(String name);
  public native Double  getDoubleVMFlag(String name);
  private final List<Function<String,Object>> flagsGetters = Arrays.asList(
    this::getBooleanVMFlag, this::getIntVMFlag, this::getUintVMFlag,
    this::getIntxVMFlag, this::getUintxVMFlag, this::getUint64VMFlag,
    this::getSizeTVMFlag, this::getStringVMFlag, this::getDoubleVMFlag);

  public Object getVMFlag(String name) {
    return flagsGetters.stream()
                       .map(f -> f.apply(name))
                       .filter(x -> x != null)
                       .findAny()
                       .orElse(null);
  }

  // Jigsaw
  public native void DefineModule(Object module, boolean is_open, String version,
                                  String location, Object[] packages);
  public native void AddModuleExports(Object from_module, String pkg, Object to_module);
  public native void AddReadsModule(Object from_module, Object source_module);
  public native void AddModuleExportsToAllUnnamed(Object module, String pkg);
  public native void AddModuleExportsToAll(Object module, String pkg);

  public native int getOffsetForName0(String name);
  public int getOffsetForName(String name) throws Exception {
    int offset = getOffsetForName0(name);
    if (offset == -1) {
      throw new RuntimeException(name + " not found");
    }
    return offset;
  }
  public native Boolean getMethodBooleanOption(Executable method, String name);
  public native Long    getMethodIntxOption(Executable method, String name);
  public native Long    getMethodUintxOption(Executable method, String name);
  public native Double  getMethodDoubleOption(Executable method, String name);
  public native String  getMethodStringOption(Executable method, String name);
  private final List<BiFunction<Executable,String,Object>> methodOptionGetters
      = Arrays.asList(this::getMethodBooleanOption, this::getMethodIntxOption,
          this::getMethodUintxOption, this::getMethodDoubleOption,
          this::getMethodStringOption);

  public Object getMethodOption(Executable method, String name) {
    return methodOptionGetters.stream()
                              .map(f -> f.apply(method, name))
                              .filter(x -> x != null)
                              .findAny()
                              .orElse(null);
  }

  // Safepoint Checking
  public native void assertMatchingSafepointCalls(boolean mutexSafepointValue, boolean attemptedNoSafepointValue);

  // Sharing & archiving
  public native boolean isShared(Object o);
  public native boolean isSharedClass(Class<?> c);
  public native boolean areSharedStringsIgnored();
  public native boolean isCDSIncludedInVmBuild();
  public native boolean isJFRIncludedInVmBuild();
  public native boolean isJavaHeapArchiveSupported();
  public native Object  getResolvedReferences(Class<?> c);
  public native boolean areOpenArchiveHeapObjectsMapped();

  // Compiler Directive
  public native int addCompilerDirective(String compDirect);
  public native void removeCompilerDirective(int count);

  // Handshakes
  public native int handshakeWalkStack(Thread t, boolean all_threads);

  // Returns true on linux if library has the noexecstack flag set.
  public native boolean checkLibSpecifiesNoexecstack(String libfilename);

  // Container testing
  public native boolean isContainerized();
  public native void printOsInfo();

  // Decoder
  public native void disableElfSectionCache();
}