Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-67974

Java 11 support for MemoryAssert#assertGC

XMLWordPrintable

    • Icon: Improvement Improvement
    • Resolution: Fixed
    • Icon: Major Major
    • core
    • None

      MemoryAssert#assertGC is disabled on Java 9 with the following comment:

      // Disabled on Java 9+, because below will call Netbeans Insane Engine, which in turns tries to call setAccessible
      /* TODO version-number 1.6+:
      assumeTrue(JavaSpecificationVersion.forCurrentJVM().isOlderThanOrEqualTo(JavaSpecificationVersion.JAVA_8));
      */
      assumeTrue(new VersionNumber(System.getProperty("java.specification.version")).isOlderThan(new VersionNumber("9")));
      

      I once tried to remove this restriction in jenkinsci/jenkins-test-harness#358, but end-to-end testing failed with

      java.lang.reflect.InaccessibleObjectException: Unable to make field private static java.util.function.Function jdk.internal.ref.CleanerImpl.cleanerImplAccess accessible: module java.base does not "opens jdk.internal.ref" to unnamed module @62727399
      	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
      	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
      	at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
      	at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
      	at org.netbeans.insane.impl.InsaneEngine.processClass(InsaneEngine.java:223)
      	at org.netbeans.insane.impl.InsaneEngine.process(InsaneEngine.java:184)
      	at org.netbeans.insane.impl.InsaneEngine.traverse(InsaneEngine.java:72)
      	at org.netbeans.insane.impl.LiveEngine.traceImpl(LiveEngine.java:165)
      	at org.netbeans.insane.impl.LiveEngine.trace(LiveEngine.java:143)
      	at org.jvnet.hudson.test.MemoryAssert.fromRoots(MemoryAssert.java:292)
      	at org.jvnet.hudson.test.MemoryAssert.assertGC(MemoryAssert.java:191)
      	at org.jenkinsci.plugins.workflow.libs.LibraryMemoryTest.loaderReleased(LibraryMemoryTest.java:85)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
      	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
      	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:54)
      	at org.jvnet.hudson.test.JenkinsRule$1.evaluate(JenkinsRule.java:601)
      	at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:299)
      	at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:293)
      	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
      	at java.base/java.lang.Thread.run(Thread.java:829)
      

      We rely on MemoryAssert#assertGC to prevent regressions. When dropping support for Java 8, we need to come up with an alternative way to keep these tests working.

      Since manual end-to-end testing is fragile, the first step along this journey could be adding automated integration test coverage as proposed in jenkinsci/jenkins-test-harness#360.

            basil Basil Crow
            basil Basil Crow
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: