This is an automated email from the ASF dual-hosted git repository.
azagrebin pushed a commit to branch release-1.11
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-1.11 by this push:
new 44f4383 [FLINK-17822][MemMan] Use private
Reference.tryHandlePending|waitForReferenceProcessing to trigger GC cleaner
44f4383 is described below
commit 44f4383526f3fd4a468b1fdd5525254c335ea392
Author: Andrey Zagrebin <[email protected]>
AuthorDate: Wed May 20 18:26:22 2020 +0300
[FLINK-17822][MemMan] Use private
Reference.tryHandlePending|waitForReferenceProcessing to trigger GC cleaner
This closes #12270.
---
.../apache/flink/util/JavaGcCleanerWrapper.java | 92 ++++++++++------------
1 file changed, 41 insertions(+), 51 deletions(-)
diff --git
a/flink-core/src/main/java/org/apache/flink/util/JavaGcCleanerWrapper.java
b/flink-core/src/main/java/org/apache/flink/util/JavaGcCleanerWrapper.java
index ae8edd3..d02c9c5 100644
--- a/flink-core/src/main/java/org/apache/flink/util/JavaGcCleanerWrapper.java
+++ b/flink-core/src/main/java/org/apache/flink/util/JavaGcCleanerWrapper.java
@@ -46,6 +46,11 @@ public enum JavaGcCleanerWrapper {
private static final Logger LOG =
LoggerFactory.getLogger(JavaGcCleanerWrapper.class);
+ private static final Class<?>[]
LEGACY_WAIT_FOR_REFERENCE_PROCESSING_ARG_TYPES = { Boolean.TYPE };
+ private static final Object[] LEGACY_WAIT_FOR_REFERENCE_PROCESSING_ARGS
= { false };
+ private static final Class<?>[]
JAVA9_WAIT_FOR_REFERENCE_PROCESSING_ARG_TYPES = { };
+ private static final Object[] JAVA9_WAIT_FOR_REFERENCE_PROCESSING_ARGS
= { };
+
private static final Collection<CleanerProvider> CLEANER_PROVIDERS =
Arrays.asList(createLegacyCleanerProvider(),
createJava9CleanerProvider());
private static final CleanerManager CLEANER_MANAGER =
findGcCleanerManager();
@@ -63,8 +68,7 @@ public enum JavaGcCleanerWrapper {
// }
//
// public static boolean tryRunPendingCleaners() throws
InterruptedException {
- // sun.misc.JavaLangRefAccess javaLangRefAccess =
sun.misc.SharedSecrets.getJavaLangRefAccess();
- // return javaLangRefAccess.tryHandlePendingReference();
+ // return
java.lang.ref.Reference.tryHandlePending(false);
// }
//
return new CleanerProvider(
@@ -80,10 +84,9 @@ public enum JavaGcCleanerWrapper {
new PendingCleanersRunnerProvider(
name,
reflectionUtils,
- "sun.misc.SharedSecrets",
- "sun.misc.JavaLangRefAccess",
- "getJavaLangRefAccess",
- "tryHandlePendingReference"));
+ "tryHandlePending",
+ LEGACY_WAIT_FOR_REFERENCE_PROCESSING_ARGS,
+
LEGACY_WAIT_FOR_REFERENCE_PROCESSING_ARG_TYPES));
}
private static CleanerProvider createJava9CleanerProvider() {
@@ -100,8 +103,7 @@ public enum JavaGcCleanerWrapper {
// }
//
// public static boolean tryRunPendingCleaners() throws
InterruptedException {
- // jdk.internal.misc.JavaLangRefAccess javaLangRefAccess =
jdk.internal.misc.SharedSecrets.getJavaLangRefAccess();
- // return
javaLangRefAccess.waitForReferenceProcessing();
+ // return
java.lang.ref.Reference.waitForReferenceProcessing();
// }
//
return new CleanerProvider(
@@ -125,10 +127,9 @@ public enum JavaGcCleanerWrapper {
new PendingCleanersRunnerProvider(
name,
reflectionUtils,
- "jdk.internal.misc.SharedSecrets",
- "jdk.internal.misc.JavaLangRefAccess",
- "getJavaLangRefAccess",
- "waitForReferenceProcessing"));
+ "waitForReferenceProcessing",
+ JAVA9_WAIT_FOR_REFERENCE_PROCESSING_ARGS,
+ JAVA9_WAIT_FOR_REFERENCE_PROCESSING_ARG_TYPES));
}
private static CleanerManager findGcCleanerManager() {
@@ -300,36 +301,34 @@ public enum JavaGcCleanerWrapper {
}
private static class PendingCleanersRunnerProvider {
+ private static final String REFERENCE_CLASS =
"java.lang.ref.Reference";
private final String cleanerName;
private final ReflectionUtils reflectionUtils;
- private final String sharedSecretsClassName;
- private final String javaLangRefAccessClassName;
- private final String getJavaLangRefAccessName;
- private final String tryHandlePendingReferenceName;
+ private final String waitForReferenceProcessingName;
+ private final Object[] waitForReferenceProcessingArgs;
+ private final Class<?>[] waitForReferenceProcessingArgTypes;
private PendingCleanersRunnerProvider(
- String cleanerName,
- ReflectionUtils reflectionUtils,
- String sharedSecretsClassName,
- String javaLangRefAccessClassName,
- String getJavaLangRefAccessName,
- String tryHandlePendingReferenceName) {
+ String cleanerName,
+ ReflectionUtils reflectionUtils,
+ String waitForReferenceProcessingName,
+ Object[] waitForReferenceProcessingArgs,
+ Class<?>[] waitForReferenceProcessingArgTypes) {
this.cleanerName = cleanerName;
this.reflectionUtils = reflectionUtils;
- this.sharedSecretsClassName = sharedSecretsClassName;
- this.javaLangRefAccessClassName =
javaLangRefAccessClassName;
- this.getJavaLangRefAccessName =
getJavaLangRefAccessName;
- this.tryHandlePendingReferenceName =
tryHandlePendingReferenceName;
+ this.waitForReferenceProcessingName =
waitForReferenceProcessingName;
+ this.waitForReferenceProcessingArgs =
waitForReferenceProcessingArgs;
+ this.waitForReferenceProcessingArgTypes =
waitForReferenceProcessingArgTypes;
}
private PendingCleanersRunner createPendingCleanersRunner() {
- Class<?> sharedSecretsClass =
reflectionUtils.findClass(sharedSecretsClassName);
- Class<?> javaLangRefAccessClass =
reflectionUtils.findClass(javaLangRefAccessClassName);
- Method getJavaLangRefAccessMethod =
reflectionUtils.findMethod(sharedSecretsClass, getJavaLangRefAccessName);
- Method tryHandlePendingReferenceMethod =
reflectionUtils.findMethod(
- javaLangRefAccessClass,
- tryHandlePendingReferenceName);
- return new
PendingCleanersRunner(getJavaLangRefAccessMethod,
tryHandlePendingReferenceMethod);
+ Class<?> referenceClass =
reflectionUtils.findClass(REFERENCE_CLASS);
+ Method waitForReferenceProcessingMethod =
reflectionUtils.findMethod(
+ referenceClass,
+ waitForReferenceProcessingName,
+ waitForReferenceProcessingArgTypes);
+ waitForReferenceProcessingMethod.setAccessible(true);
+ return new
PendingCleanersRunner(waitForReferenceProcessingMethod,
waitForReferenceProcessingArgs);
}
@Override
@@ -339,29 +338,20 @@ public enum JavaGcCleanerWrapper {
}
private static class PendingCleanersRunner {
- private final Method getJavaLangRefAccessMethod;
private final Method waitForReferenceProcessingMethod;
+ private final Object[] waitForReferenceProcessingArgs;
- private PendingCleanersRunner(Method
getJavaLangRefAccessMethod, Method waitForReferenceProcessingMethod) {
- this.getJavaLangRefAccessMethod =
getJavaLangRefAccessMethod;
+ private PendingCleanersRunner(Method
waitForReferenceProcessingMethod, Object[] waitForReferenceProcessingArgs) {
this.waitForReferenceProcessingMethod =
waitForReferenceProcessingMethod;
+ this.waitForReferenceProcessingArgs =
waitForReferenceProcessingArgs;
}
private boolean tryRunPendingCleaners() throws
InterruptedException {
- Object javaLangRefAccess = getJavaLangRefAccess();
try {
- return (Boolean)
waitForReferenceProcessingMethod.invoke(javaLangRefAccess);
+ return (Boolean)
waitForReferenceProcessingMethod.invoke(null, waitForReferenceProcessingArgs);
} catch (IllegalAccessException |
InvocationTargetException e) {
throwIfCauseIsInterruptedException(e);
- return throwInvocationError(e,
javaLangRefAccess, waitForReferenceProcessingMethod);
- }
- }
-
- private Object getJavaLangRefAccess() {
- try {
- return getJavaLangRefAccessMethod.invoke(null);
- } catch (IllegalAccessException |
InvocationTargetException e) {
- return throwInvocationError(e, null,
waitForReferenceProcessingMethod);
+ return throwInvocationError(e,
waitForReferenceProcessingMethod);
}
}
@@ -373,10 +363,10 @@ public enum JavaGcCleanerWrapper {
}
}
- private static <T> T throwInvocationError(Throwable t,
@Nullable Object obj, Method method) {
+ private static <T> T throwInvocationError(Throwable t, Method
method) {
String message = String.format(
- "FATAL UNEXPECTED - Failed to invoke %s%s",
- obj == null ? "" :
obj.getClass().getSimpleName() + '#',
+ "FATAL UNEXPECTED - Failed to invoke %s#%s",
+ PendingCleanersRunnerProvider.REFERENCE_CLASS,
method.getName());
LOG.error(message, t);
throw new Error(message, t);
@@ -402,7 +392,7 @@ public enum JavaGcCleanerWrapper {
private Method findMethod(Class<?> cl, String methodName,
Class<?>... parameterTypes) {
try {
- return cl.getMethod(methodName, parameterTypes);
+ return cl.getDeclaredMethod(methodName,
parameterTypes);
} catch (NoSuchMethodException e) {
throw new FlinkRuntimeException(
String.format("%s: Failed to find %s#%s
method", logPrefix, cl.getSimpleName(), methodName),