rev 60538 : imported patch jep387-all.patch
1 /*
2 * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 package sun.hotspot;
25
26 import java.lang.management.MemoryUsage;
27 import java.lang.reflect.Executable;
28 import java.util.Arrays;
29 import java.util.List;
30 import java.util.function.BiFunction;
31 import java.util.function.Function;
32 import java.security.BasicPermission;
33 import java.util.Objects;
34
35 import sun.hotspot.parser.DiagnosticCommand;
36
37 public class WhiteBox {
38 @SuppressWarnings("serial")
39 public static class WhiteBoxPermission extends BasicPermission {
40 public WhiteBoxPermission(String s) {
41 super(s);
42 }
43 }
44
45 private WhiteBox() {}
46 private static final WhiteBox instance = new WhiteBox();
47 private static native void registerNatives();
48
49 /**
50 * Returns the singleton WhiteBox instance.
51 *
52 * The returned WhiteBox object should be carefully guarded
53 * by the caller, since it can be used to read and write data
54 * at arbitrary memory addresses. It must never be passed to
55 * untrusted code.
56 */
57 public synchronized static WhiteBox getWhiteBox() {
58 SecurityManager sm = System.getSecurityManager();
59 if (sm != null) {
60 sm.checkPermission(new WhiteBoxPermission("getInstance"));
61 }
62 return instance;
63 }
64
65 static {
66 registerNatives();
67 }
68
69 // Get the maximum heap size supporting COOPs
70 public native long getCompressedOopsMaxHeapSize();
71 // Arguments
72 public native void printHeapSizes();
73
74 // Memory
75 private native long getObjectAddress0(Object o);
76 public long getObjectAddress(Object o) {
77 Objects.requireNonNull(o);
78 return getObjectAddress0(o);
79 }
80
81 public native int getHeapOopSize();
82 public native int getVMPageSize();
83 public native long getVMAllocationGranularity();
84 public native long getVMLargePageSize();
85 public native long getHeapSpaceAlignment();
86 public native long getHeapAlignment();
87
88 private native boolean isObjectInOldGen0(Object o);
89 public boolean isObjectInOldGen(Object o) {
90 Objects.requireNonNull(o);
91 return isObjectInOldGen0(o);
92 }
93
94 private native long getObjectSize0(Object o);
95 public long getObjectSize(Object o) {
96 Objects.requireNonNull(o);
97 return getObjectSize0(o);
98 }
99
100 // Runtime
101 // Make sure class name is in the correct format
102 public int countAliveClasses(String name) {
103 return countAliveClasses0(name.replace('.', '/'));
104 }
105 private native int countAliveClasses0(String name);
106
107 public boolean isClassAlive(String name) {
108 return countAliveClasses(name) != 0;
109 }
110
111 public native int getSymbolRefcount(String name);
112
113 public native boolean deflateIdleMonitors();
114
115 private native boolean isMonitorInflated0(Object obj);
116 public boolean isMonitorInflated(Object obj) {
117 Objects.requireNonNull(obj);
118 return isMonitorInflated0(obj);
119 }
120
121 public native void forceSafepoint();
122
123 private native long getConstantPool0(Class<?> aClass);
124 public long getConstantPool(Class<?> aClass) {
125 Objects.requireNonNull(aClass);
126 return getConstantPool0(aClass);
127 }
128
129 private native int getConstantPoolCacheIndexTag0();
130 public int getConstantPoolCacheIndexTag() {
131 return getConstantPoolCacheIndexTag0();
132 }
133
134 private native int getConstantPoolCacheLength0(Class<?> aClass);
135 public int getConstantPoolCacheLength(Class<?> aClass) {
136 Objects.requireNonNull(aClass);
137 return getConstantPoolCacheLength0(aClass);
138 }
139
140 private native int remapInstructionOperandFromCPCache0(Class<?> aClass, int index);
141 public int remapInstructionOperandFromCPCache(Class<?> aClass, int index) {
142 Objects.requireNonNull(aClass);
143 return remapInstructionOperandFromCPCache0(aClass, index);
144 }
145
146 private native int encodeConstantPoolIndyIndex0(int index);
147 public int encodeConstantPoolIndyIndex(int index) {
148 return encodeConstantPoolIndyIndex0(index);
149 }
150
151 // JVMTI
152 private native void addToBootstrapClassLoaderSearch0(String segment);
153 public void addToBootstrapClassLoaderSearch(String segment){
154 Objects.requireNonNull(segment);
155 addToBootstrapClassLoaderSearch0(segment);
156 }
157
158 private native void addToSystemClassLoaderSearch0(String segment);
159 public void addToSystemClassLoaderSearch(String segment) {
160 Objects.requireNonNull(segment);
161 addToSystemClassLoaderSearch0(segment);
162 }
163
164 // G1
165 public native boolean g1InConcurrentMark();
166 private native boolean g1IsHumongous0(Object o);
167 public boolean g1IsHumongous(Object o) {
168 Objects.requireNonNull(o);
169 return g1IsHumongous0(o);
170 }
171
172 private native boolean g1BelongsToHumongousRegion0(long adr);
173 public boolean g1BelongsToHumongousRegion(long adr) {
174 if (adr == 0) {
175 throw new IllegalArgumentException("adr argument should not be null");
176 }
177 return g1BelongsToHumongousRegion0(adr);
178 }
179
180
181 private native boolean g1BelongsToFreeRegion0(long adr);
182 public boolean g1BelongsToFreeRegion(long adr) {
183 if (adr == 0) {
184 throw new IllegalArgumentException("adr argument should not be null");
185 }
186 return g1BelongsToFreeRegion0(adr);
187 }
188
189 public native long g1NumMaxRegions();
190 public native long g1NumFreeRegions();
191 public native int g1RegionSize();
192 public native long dramReservedStart();
193 public native long dramReservedEnd();
194 public native long nvdimmReservedStart();
195 public native long nvdimmReservedEnd();
196 public native MemoryUsage g1AuxiliaryMemoryUsage();
197 private native Object[] parseCommandLine0(String commandline, char delim, DiagnosticCommand[] args);
198 public Object[] parseCommandLine(String commandline, char delim, DiagnosticCommand[] args) {
199 Objects.requireNonNull(args);
200 return parseCommandLine0(commandline, delim, args);
201 }
202
203 public native int g1ActiveMemoryNodeCount();
204 public native int[] g1MemoryNodeIds();
205
206 // Parallel GC
207 public native long psVirtualSpaceAlignment();
208 public native long psHeapGenerationAlignment();
209
210 /**
211 * Enumerates old regions with liveness less than specified and produces some statistics
212 * @param liveness percent of region's liveness (live_objects / total_region_size * 100).
213 * @return long[3] array where long[0] - total count of old regions
214 * long[1] - total memory of old regions
215 * long[2] - lowest estimation of total memory of old regions to be freed (non-full
216 * regions are not included)
217 */
218 public native long[] g1GetMixedGCInfo(int liveness);
219
220 // NMT
221 public native long NMTMalloc(long size);
222 public native void NMTFree(long mem);
223 public native long NMTReserveMemory(long size);
224 public native long NMTAttemptReserveMemoryAt(long addr, long size);
225 public native void NMTCommitMemory(long addr, long size);
226 public native void NMTUncommitMemory(long addr, long size);
227 public native void NMTReleaseMemory(long addr, long size);
228 public native long NMTMallocWithPseudoStack(long size, int index);
229 public native long NMTMallocWithPseudoStackAndType(long size, int index, int type);
230 public native boolean NMTChangeTrackingLevel();
231 public native int NMTGetHashSize();
232 public native long NMTNewArena(long initSize);
233 public native void NMTFreeArena(long arena);
234 public native void NMTArenaMalloc(long arena, long size);
235
236 // Compiler
237 public native boolean isC2OrJVMCIIncludedInVmBuild();
238
239 public native int matchesMethod(Executable method, String pattern);
240 public native int matchesInline(Executable method, String pattern);
241 public native boolean shouldPrintAssembly(Executable method, int comp_level);
242 public native int deoptimizeFrames(boolean makeNotEntrant);
243 public native void deoptimizeAll();
244
245 public boolean isMethodCompiled(Executable method) {
246 return isMethodCompiled(method, false /*not osr*/);
247 }
248 private native boolean isMethodCompiled0(Executable method, boolean isOsr);
249 public boolean isMethodCompiled(Executable method, boolean isOsr){
250 Objects.requireNonNull(method);
251 return isMethodCompiled0(method, isOsr);
252 }
253 public boolean isMethodCompilable(Executable method) {
254 return isMethodCompilable(method, -2 /*any*/);
255 }
256 public boolean isMethodCompilable(Executable method, int compLevel) {
257 return isMethodCompilable(method, compLevel, false /*not osr*/);
258 }
259 private native boolean isMethodCompilable0(Executable method, int compLevel, boolean isOsr);
260 public boolean isMethodCompilable(Executable method, int compLevel, boolean isOsr) {
261 Objects.requireNonNull(method);
262 return isMethodCompilable0(method, compLevel, isOsr);
263 }
264 private native boolean isMethodQueuedForCompilation0(Executable method);
265 public boolean isMethodQueuedForCompilation(Executable method) {
266 Objects.requireNonNull(method);
267 return isMethodQueuedForCompilation0(method);
268 }
269 // Determine if the compiler corresponding to the compilation level 'compLevel'
270 // and to the compilation context 'compilation_context' provides an intrinsic
271 // for the method 'method'. An intrinsic is available for method 'method' if:
272 // - the intrinsic is enabled (by using the appropriate command-line flag) and
273 // - the platform on which the VM is running provides the instructions necessary
274 // for the compiler to generate the intrinsic code.
275 //
276 // The compilation context is related to using the DisableIntrinsic flag on a
277 // per-method level, see hotspot/src/share/vm/compiler/abstractCompiler.hpp
278 // for more details.
279 public boolean isIntrinsicAvailable(Executable method,
280 Executable compilationContext,
281 int compLevel) {
282 Objects.requireNonNull(method);
283 return isIntrinsicAvailable0(method, compilationContext, compLevel);
284 }
285 // If usage of the DisableIntrinsic flag is not expected (or the usage can be ignored),
286 // use the below method that does not require the compilation context as argument.
287 public boolean isIntrinsicAvailable(Executable method, int compLevel) {
288 return isIntrinsicAvailable(method, null, compLevel);
289 }
290 private native boolean isIntrinsicAvailable0(Executable method,
291 Executable compilationContext,
292 int compLevel);
293 public int deoptimizeMethod(Executable method) {
294 return deoptimizeMethod(method, false /*not osr*/);
295 }
296 private native int deoptimizeMethod0(Executable method, boolean isOsr);
297 public int deoptimizeMethod(Executable method, boolean isOsr) {
298 Objects.requireNonNull(method);
299 return deoptimizeMethod0(method, isOsr);
300 }
301 public void makeMethodNotCompilable(Executable method) {
302 makeMethodNotCompilable(method, -2 /*any*/);
303 }
304 public void makeMethodNotCompilable(Executable method, int compLevel) {
305 makeMethodNotCompilable(method, compLevel, false /*not osr*/);
306 }
307 private native void makeMethodNotCompilable0(Executable method, int compLevel, boolean isOsr);
308 public void makeMethodNotCompilable(Executable method, int compLevel, boolean isOsr) {
309 Objects.requireNonNull(method);
310 makeMethodNotCompilable0(method, compLevel, isOsr);
311 }
312 public int getMethodCompilationLevel(Executable method) {
313 return getMethodCompilationLevel(method, false /*not ost*/);
314 }
315 private native int getMethodCompilationLevel0(Executable method, boolean isOsr);
316 public int getMethodCompilationLevel(Executable method, boolean isOsr) {
317 Objects.requireNonNull(method);
318 return getMethodCompilationLevel0(method, isOsr);
319 }
320 private native boolean testSetDontInlineMethod0(Executable method, boolean value);
321 public boolean testSetDontInlineMethod(Executable method, boolean value) {
322 Objects.requireNonNull(method);
323 return testSetDontInlineMethod0(method, value);
324 }
325 public int getCompileQueuesSize() {
326 return getCompileQueueSize(-2 /*any*/);
327 }
328 public native int getCompileQueueSize(int compLevel);
329 private native boolean testSetForceInlineMethod0(Executable method, boolean value);
330 public boolean testSetForceInlineMethod(Executable method, boolean value) {
331 Objects.requireNonNull(method);
332 return testSetForceInlineMethod0(method, value);
333 }
334 public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
335 return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
336 }
337 private native boolean enqueueMethodForCompilation0(Executable method, int compLevel, int entry_bci);
338 public boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci) {
339 Objects.requireNonNull(method);
340 return enqueueMethodForCompilation0(method, compLevel, entry_bci);
341 }
342 private native boolean enqueueInitializerForCompilation0(Class<?> aClass, int compLevel);
343 public boolean enqueueInitializerForCompilation(Class<?> aClass, int compLevel) {
344 Objects.requireNonNull(aClass);
345 return enqueueInitializerForCompilation0(aClass, compLevel);
346 }
347 private native void clearMethodState0(Executable method);
348 public native void markMethodProfiled(Executable method);
349 public void clearMethodState(Executable method) {
350 Objects.requireNonNull(method);
351 clearMethodState0(method);
352 }
353 public native void lockCompilation();
354 public native void unlockCompilation();
355 private native int getMethodEntryBci0(Executable method);
356 public int getMethodEntryBci(Executable method) {
357 Objects.requireNonNull(method);
358 return getMethodEntryBci0(method);
359 }
360 private native Object[] getNMethod0(Executable method, boolean isOsr);
361 public Object[] getNMethod(Executable method, boolean isOsr) {
362 Objects.requireNonNull(method);
363 return getNMethod0(method, isOsr);
364 }
365 public native long allocateCodeBlob(int size, int type);
366 public long allocateCodeBlob(long size, int type) {
367 int intSize = (int) size;
368 if ((long) intSize != size || size < 0) {
369 throw new IllegalArgumentException(
370 "size argument has illegal value " + size);
371 }
372 return allocateCodeBlob( intSize, type);
373 }
374 public native void freeCodeBlob(long addr);
375 public native void forceNMethodSweep();
376 public native Object[] getCodeHeapEntries(int type);
377 public native int getCompilationActivityMode();
378 private native long getMethodData0(Executable method);
379 public long getMethodData(Executable method) {
380 Objects.requireNonNull(method);
381 return getMethodData0(method);
382 }
383 public native Object[] getCodeBlob(long addr);
384
385 private native void clearInlineCaches0(boolean preserve_static_stubs);
386 public void clearInlineCaches() {
387 clearInlineCaches0(false);
388 }
389 public void clearInlineCaches(boolean preserve_static_stubs) {
390 clearInlineCaches0(preserve_static_stubs);
391 }
392
393 // Intered strings
394 public native boolean isInStringTable(String str);
395
396 // Memory
397 public native void readReservedMemory();
398 public native long allocateMetaspace(ClassLoader classLoader, long size);
399 public native void freeMetaspace(ClassLoader classLoader, long addr, long size);
400 public native long incMetaspaceCapacityUntilGC(long increment);
401 public native long metaspaceCapacityUntilGC();
402 public native long metaspaceReserveAlignment();
403
404 // Don't use these methods directly
405 // Use sun.hotspot.gc.GC class instead.
406 public native boolean isGCSupported(int name);
407 public native boolean isGCSelected(int name);
408 public native boolean isGCSelectedErgonomically();
409
410 // Force Young GC
411 public native void youngGC();
412
413 // Force Full GC
414 public native void fullGC();
415
416 // Returns true if the current GC supports concurrent collection control.
417 public native boolean supportsConcurrentGCBreakpoints();
418
419 private void checkConcurrentGCBreakpointsSupported() {
420 if (!supportsConcurrentGCBreakpoints()) {
421 throw new UnsupportedOperationException("Concurrent GC breakpoints not supported");
422 }
423 }
424
425 private native void concurrentGCAcquireControl0();
426 private native void concurrentGCReleaseControl0();
427 private native void concurrentGCRunToIdle0();
428 private native boolean concurrentGCRunTo0(String breakpoint);
429
430 private static boolean concurrentGCIsControlled = false;
431 private void checkConcurrentGCIsControlled() {
432 if (!concurrentGCIsControlled) {
433 throw new IllegalStateException("Not controlling concurrent GC");
434 }
435 }
436
437 // All collectors supporting concurrent GC breakpoints are expected
438 // to provide at least the following breakpoints.
439 public final String AFTER_MARKING_STARTED = "AFTER MARKING STARTED";
440 public final String BEFORE_MARKING_COMPLETED = "BEFORE MARKING COMPLETED";
441
442 public void concurrentGCAcquireControl() {
443 checkConcurrentGCBreakpointsSupported();
444 if (concurrentGCIsControlled) {
445 throw new IllegalStateException("Already controlling concurrent GC");
446 }
447 concurrentGCAcquireControl0();
448 concurrentGCIsControlled = true;
449 }
450
451 public void concurrentGCReleaseControl() {
452 checkConcurrentGCBreakpointsSupported();
453 concurrentGCReleaseControl0();
454 concurrentGCIsControlled = false;
455 }
456
457 // Keep concurrent GC idle. Release from breakpoint.
458 public void concurrentGCRunToIdle() {
459 checkConcurrentGCBreakpointsSupported();
460 checkConcurrentGCIsControlled();
461 concurrentGCRunToIdle0();
462 }
463
464 // Allow concurrent GC to run to breakpoint.
465 // Throws IllegalStateException if reached end of cycle first.
466 public void concurrentGCRunTo(String breakpoint) {
467 concurrentGCRunTo(breakpoint, true);
468 }
469
470 // Allow concurrent GC to run to breakpoint.
471 // Returns true if reached breakpoint. If reached end of cycle first,
472 // then throws IllegalStateException if errorIfFail is true, returning
473 // false otherwise.
474 public boolean concurrentGCRunTo(String breakpoint, boolean errorIfFail) {
475 checkConcurrentGCBreakpointsSupported();
476 checkConcurrentGCIsControlled();
477 if (breakpoint == null) {
478 throw new NullPointerException("null breakpoint");
479 } else if (concurrentGCRunTo0(breakpoint)) {
480 return true;
481 } else if (errorIfFail) {
482 throw new IllegalStateException("Missed requested breakpoint \"" + breakpoint + "\"");
483 } else {
484 return false;
485 }
486 }
487
488 // Method tries to start concurrent mark cycle.
489 // It returns false if CM Thread is always in concurrent cycle.
490 public native boolean g1StartConcMarkCycle();
491
492 // Tests on ReservedSpace/VirtualSpace classes
493 public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
494 public native void runMemoryUnitTests();
495 public native void readFromNoaccessArea();
496 public native long getThreadStackSize();
497 public native long getThreadRemainingStackSize();
498
499 // CPU features
500 public native String getCPUFeatures();
501
502 // VM flags
503 public native boolean isConstantVMFlag(String name);
504 public native boolean isLockedVMFlag(String name);
505 public native void setBooleanVMFlag(String name, boolean value);
506 public native void setIntVMFlag(String name, long value);
507 public native void setUintVMFlag(String name, long value);
508 public native void setIntxVMFlag(String name, long value);
509 public native void setUintxVMFlag(String name, long value);
510 public native void setUint64VMFlag(String name, long value);
511 public native void setSizeTVMFlag(String name, long value);
512 public native void setStringVMFlag(String name, String value);
513 public native void setDoubleVMFlag(String name, double value);
514 public native Boolean getBooleanVMFlag(String name);
515 public native Long getIntVMFlag(String name);
516 public native Long getUintVMFlag(String name);
517 public native Long getIntxVMFlag(String name);
518 public native Long getUintxVMFlag(String name);
519 public native Long getUint64VMFlag(String name);
520 public native Long getSizeTVMFlag(String name);
521 public native String getStringVMFlag(String name);
522 public native Double getDoubleVMFlag(String name);
523 private final List<Function<String,Object>> flagsGetters = Arrays.asList(
524 this::getBooleanVMFlag, this::getIntVMFlag, this::getUintVMFlag,
525 this::getIntxVMFlag, this::getUintxVMFlag, this::getUint64VMFlag,
526 this::getSizeTVMFlag, this::getStringVMFlag, this::getDoubleVMFlag);
527
528 public Object getVMFlag(String name) {
529 return flagsGetters.stream()
530 .map(f -> f.apply(name))
531 .filter(x -> x != null)
532 .findAny()
533 .orElse(null);
534 }
535
536 // Jigsaw
537 public native void DefineModule(Object module, boolean is_open, String version,
538 String location, Object[] packages);
539 public native void AddModuleExports(Object from_module, String pkg, Object to_module);
540 public native void AddReadsModule(Object from_module, Object source_module);
541 public native void AddModuleExportsToAllUnnamed(Object module, String pkg);
542 public native void AddModuleExportsToAll(Object module, String pkg);
543
544 public native int getOffsetForName0(String name);
545 public int getOffsetForName(String name) throws Exception {
546 int offset = getOffsetForName0(name);
547 if (offset == -1) {
548 throw new RuntimeException(name + " not found");
549 }
550 return offset;
551 }
552 public native Boolean getMethodBooleanOption(Executable method, String name);
553 public native Long getMethodIntxOption(Executable method, String name);
554 public native Long getMethodUintxOption(Executable method, String name);
555 public native Double getMethodDoubleOption(Executable method, String name);
556 public native String getMethodStringOption(Executable method, String name);
557 private final List<BiFunction<Executable,String,Object>> methodOptionGetters
558 = Arrays.asList(this::getMethodBooleanOption, this::getMethodIntxOption,
559 this::getMethodUintxOption, this::getMethodDoubleOption,
560 this::getMethodStringOption);
561
562 public Object getMethodOption(Executable method, String name) {
563 return methodOptionGetters.stream()
564 .map(f -> f.apply(method, name))
565 .filter(x -> x != null)
566 .findAny()
567 .orElse(null);
568 }
569
570 // Safepoint Checking
571 public native void assertMatchingSafepointCalls(boolean mutexSafepointValue, boolean attemptedNoSafepointValue);
572 public native void assertSpecialLock(boolean allowVMBlock, boolean safepointCheck);
573
574 // Sharing & archiving
575 public native String getDefaultArchivePath();
576 public native boolean cdsMemoryMappingFailed();
577 public native boolean isSharingEnabled();
578 public native boolean isShared(Object o);
579 public native boolean isSharedClass(Class<?> c);
580 public native boolean areSharedStringsIgnored();
581 public native boolean isCDSIncludedInVmBuild();
582 public native boolean isJFRIncludedInVmBuild();
583 public native boolean isJavaHeapArchiveSupported();
584 public native Object getResolvedReferences(Class<?> c);
585 public native void linkClass(Class<?> c);
586 public native boolean areOpenArchiveHeapObjectsMapped();
587
588 // Compiler Directive
589 public native int addCompilerDirective(String compDirect);
590 public native void removeCompilerDirective(int count);
591
592 // Handshakes
593 public native int handshakeWalkStack(Thread t, boolean all_threads);
594
595 // Returns true on linux if library has the noexecstack flag set.
596 public native boolean checkLibSpecifiesNoexecstack(String libfilename);
597
598 // Container testing
599 public native boolean isContainerized();
600 public native int validateCgroup(String procCgroups,
601 String procSelfCgroup,
602 String procSelfMountinfo);
603 public native void printOsInfo();
604
605 // Decoder
606 public native void disableElfSectionCache();
607
608 // Resolved Method Table
609 public native long resolvedMethodItemsCount();
610
611 // Protection Domain Table
612 public native int protectionDomainRemovedCount();
613
614 // Number of loaded AOT libraries
615 public native int aotLibrariesCount();
616
617 public native int getKlassMetadataSize(Class<?> c);
618
619 // ThreadSMR GC safety check for threadObj
620 public native void checkThreadObjOfTerminatingThread(Thread target);
621 }
--- EOF ---