8199927: Make WhiteBox more GC agnostic

Reviewed-by: shade, eosterlund
This commit is contained in:
Per Lidén 2018-03-28 11:38:47 +02:00
parent 24273f04a4
commit 940bc841a7
4 changed files with 35 additions and 102 deletions

View file

@ -32,6 +32,7 @@
#include "code/codeCache.hpp" #include "code/codeCache.hpp"
#include "compiler/methodMatcher.hpp" #include "compiler/methodMatcher.hpp"
#include "compiler/directivesParser.hpp" #include "compiler/directivesParser.hpp"
#include "gc/shared/gcConfig.hpp"
#include "gc/shared/genCollectedHeap.hpp" #include "gc/shared/genCollectedHeap.hpp"
#include "jvmtifiles/jvmtiEnv.hpp" #include "jvmtifiles/jvmtiEnv.hpp"
#include "memory/metadataFactory.hpp" #include "memory/metadataFactory.hpp"
@ -312,47 +313,16 @@ WB_ENTRY(jint, WB_StressVirtualSpaceResize(JNIEnv* env, jobject o,
(size_t) magnitude, (size_t) iterations); (size_t) magnitude, (size_t) iterations);
WB_END WB_END
static const jint serial_code = 1; WB_ENTRY(jboolean, WB_IsGCSupported(JNIEnv* env, jobject o, jint name))
static const jint parallel_code = 2; return GCConfig::is_gc_supported((CollectedHeap::Name)name);
static const jint cms_code = 4;
static const jint g1_code = 8;
WB_ENTRY(jint, WB_CurrentGC(JNIEnv* env, jobject o, jobject obj))
if (UseSerialGC) {
return serial_code;
} else if (UseParallelGC || UseParallelOldGC) {
return parallel_code;
} if (UseConcMarkSweepGC) {
return cms_code;
} else if (UseG1GC) {
return g1_code;
}
ShouldNotReachHere();
return 0;
WB_END WB_END
WB_ENTRY(jint, WB_AllSupportedGC(JNIEnv* env, jobject o, jobject obj)) WB_ENTRY(jboolean, WB_IsGCSelected(JNIEnv* env, jobject o, jint name))
#if INCLUDE_ALL_GCS return GCConfig::is_gc_selected((CollectedHeap::Name)name);
return serial_code | parallel_code | cms_code | g1_code;
#else
return serial_code;
#endif // INCLUDE_ALL_GCS
WB_END WB_END
WB_ENTRY(jboolean, WB_GCSelectedByErgo(JNIEnv* env, jobject o, jobject obj)) WB_ENTRY(jboolean, WB_IsGCSelectedErgonomically(JNIEnv* env, jobject o))
if (UseSerialGC) { return GCConfig::is_gc_selected_ergonomically();
return FLAG_IS_ERGO(UseSerialGC);
} else if (UseParallelGC) {
return FLAG_IS_ERGO(UseParallelGC);
} else if (UseParallelOldGC) {
return FLAG_IS_ERGO(UseParallelOldGC);
} else if (UseConcMarkSweepGC) {
return FLAG_IS_ERGO(UseConcMarkSweepGC);
} else if (UseG1GC) {
return FLAG_IS_ERGO(UseG1GC);
}
ShouldNotReachHere();
return false;
WB_END WB_END
WB_ENTRY(jboolean, WB_isObjectInOldGen(JNIEnv* env, jobject o, jobject obj)) WB_ENTRY(jboolean, WB_isObjectInOldGen(JNIEnv* env, jobject o, jobject obj))
@ -2163,9 +2133,9 @@ static JNINativeMethod methods[] = {
{CC"addCompilerDirective", CC"(Ljava/lang/String;)I", {CC"addCompilerDirective", CC"(Ljava/lang/String;)I",
(void*)&WB_AddCompilerDirective }, (void*)&WB_AddCompilerDirective },
{CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective }, {CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective },
{CC"currentGC", CC"()I", (void*)&WB_CurrentGC}, {CC"isGCSupported", CC"(I)Z", (void*)&WB_IsGCSupported},
{CC"allSupportedGC", CC"()I", (void*)&WB_AllSupportedGC}, {CC"isGCSelected", CC"(I)Z", (void*)&WB_IsGCSelected},
{CC"gcSelectedByErgo", CC"()Z", (void*)&WB_GCSelectedByErgo}, {CC"isGCSelectedErgonomically", CC"()Z", (void*)&WB_IsGCSelectedErgonomically},
{CC"supportsConcurrentGCPhaseControl", CC"()Z", (void*)&WB_SupportsConcurrentGCPhaseControl}, {CC"supportsConcurrentGCPhaseControl", CC"()Z", (void*)&WB_SupportsConcurrentGCPhaseControl},
{CC"getConcurrentGCPhases", CC"()[Ljava/lang/String;", {CC"getConcurrentGCPhases", CC"()[Ljava/lang/String;",
(void*)&WB_GetConcurrentGCPhases}, (void*)&WB_GetConcurrentGCPhases},

View file

@ -229,12 +229,8 @@ public class VMProps implements Callable<Map<String, String>> {
* @param map - property-value pairs * @param map - property-value pairs
*/ */
protected void vmGC(Map<String, String> map) { protected void vmGC(Map<String, String> map) {
GC currentGC = GC.current();
boolean isByErgo = GC.currentSetByErgo();
List<GC> supportedGC = GC.allSupported();
for (GC gc: GC.values()) { for (GC gc: GC.values()) {
boolean isSupported = supportedGC.contains(gc); boolean isAcceptable = gc.isSupported() && (gc.isSelected() || GC.isSelectedErgonomically());
boolean isAcceptable = isSupported && (gc == currentGC || isByErgo);
map.put("vm.gc." + gc.name(), "" + isAcceptable); map.put("vm.gc." + gc.name(), "" + isAcceptable);
} }
} }

View file

@ -382,9 +382,9 @@ public class WhiteBox {
// Don't use these methods directly // Don't use these methods directly
// Use sun.hotspot.gc.GC class instead. // Use sun.hotspot.gc.GC class instead.
public native int currentGC(); public native boolean isGCSupported(int name);
public native int allSupportedGC(); public native boolean isGCSelected(int name);
public native boolean gcSelectedByErgo(); public native boolean isGCSelectedErgonomically();
// Force Young GC // Force Young GC
public native void youngGC(); public native void youngGC();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -23,8 +23,6 @@
package sun.hotspot.gc; package sun.hotspot.gc;
import java.util.ArrayList;
import java.util.List;
import sun.hotspot.WhiteBox; import sun.hotspot.WhiteBox;
/** /**
@ -32,72 +30,41 @@ import sun.hotspot.WhiteBox;
* retrieved from the VM with the WhiteBox API. * retrieved from the VM with the WhiteBox API.
*/ */
public enum GC { public enum GC {
/*
* Enum values much match CollectedHeap::Name
*/
Serial(1), Serial(1),
Parallel(2), Parallel(2),
ConcMarkSweep(4), ConcMarkSweep(3),
G1(8); G1(4);
private static final GC CURRENT_GC; private static final WhiteBox WB = WhiteBox.getWhiteBox();
private static final int ALL_GC_CODES;
private static final boolean IS_BY_ERGO;
static {
WhiteBox WB = WhiteBox.getWhiteBox();
ALL_GC_CODES = WB.allSupportedGC();
IS_BY_ERGO = WB.gcSelectedByErgo();
int currentCode = WB.currentGC(); private final int name;
GC tmp = null;
for (GC gc: GC.values()) {
if (gc.code == currentCode) {
tmp = gc;
break;
}
}
if (tmp == null) {
throw new Error("Unknown current GC code " + currentCode);
}
CURRENT_GC = tmp;
}
private final int code; private GC(int name) {
private GC(int code) { this.name = name;
this.code = code;
} }
/** /**
* @return true if the collector is supported by the VM, false otherwise. * @return true if this GC is supported by the VM
*/ */
public boolean isSupported() { public boolean isSupported() {
return (ALL_GC_CODES & code) != 0; return WB.isGCSupported(name);
}
/**
* @return the current collector used by VM.
*/
public static GC current() {
return CURRENT_GC;
} }
/** /**
* @return true if GC was selected by ergonomic, false if specified * @return true if this GC is currently selected/used
* explicitly by the command line flag.
*/ */
public static boolean currentSetByErgo() { public boolean isSelected() {
return IS_BY_ERGO; return WB.isGCSelected(name);
} }
/** /**
* @return List of collectors supported by the VM. * @return true if GC was selected ergonomically, as opposed
* to being explicitly specified on the command line
*/ */
public static List<GC> allSupported() { public static boolean isSelectedErgonomically() {
List<GC> list = new ArrayList<>(); return WB.isGCSelectedErgonomically();
for (GC gc: GC.values()) {
if (gc.isSupported()) {
list.add(gc);
} }
} }
return list;
}
}