pinpoint-apm/pinpoint · error · IllegalStateException

not found Caused by:

Error message

 not found Caused by:

What it means

getAbstractClassLoader loads an internal classloader abstract/base class by name via Class.forName(className, false, bootstrap-ish loader). If the class is absent on that JVM, it throws IllegalStateException '<className> not found Caused by:...'.

Source

Thrown at agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/classloader/J9BootLoader.java:67

            try {
                bootstrapClassLoader = ClassLoader.class.getDeclaredField("systemClassLoader");
            } catch (NoSuchFieldException e2) {
                throw new IllegalStateException("bootstrapClassLoader not found Caused by:" + e.getMessage() + ", and " + e2.getMessage(), e2);
            }
        }
        try {
            bootstrapClassLoader.setAccessible(true);
            return (ClassLoader) bootstrapClassLoader.get(ClassLoader.class);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("bootstrapClassLoader access fail Caused by:" + e.getMessage(), e);
        }
    }

    private static Class<?> getAbstractClassLoader(String className) {
        try {
            return Class.forName(className, false, Object.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(className + " not found Caused by:" + e.getMessage(), e);
        }
    }


    private static Method getMethod(Class<?> bootstrapClassLoader, String methodName, Class<?>... parameterTypes) {
        try {
            Method declaredMethod = bootstrapClassLoader.getDeclaredMethod(methodName, parameterTypes);
            declaredMethod.setAccessible(true);
            return declaredMethod;
        } catch (NoSuchMethodException e) {
            throw new IllegalStateException(methodName + " not found Caused by:" + e.getMessage(), e);
        }

    }

    @Override
    public Enumeration<URL> findResources(String name) throws IOException {
        try {

View on GitHub (pinned to 744c3d3075)

Solutions

  1. Confirm the JVM is a supported IBM J9 build where the internal class exists
  2. Update Pinpoint agent to a version matching your J9/OpenJ9 internals
  3. Check the Caused-by message to see exactly which class name was probed
  4. Fall back to LauncherBootLoader by running on HotSpot/OpenJDK

Example fix

// before
// pinpoint agent on AdoptOpenJDK OpenJ9 0.35 -> com.ibm.oti.vm.AbstractClassLoader missing
// after
// run on IBM J9 SDK 8 or switch to OpenJDK HotSpot
java -version  # verify VM before attaching agent
Defensive patterns

Strategy: try-catch

Validate before calling

String cls = "com.ibm.oti.vm.AbstractClassLoader";
if (Class.forName(cls, false, Object.class.getClassLoader()) == null) { /* unreachable, CNFE thrown */ }
// wrap instead:
try { Class.forName(cls, false, Object.class.getClassLoader()); } catch (ClassNotFoundException e) { throw new IllegalStateException("Not a supported IBM J9 VM"); }

Try / catch

try { J9BootLoader bl = createJ9BootLoader(); } catch (IllegalStateException e) { if (e.getMessage().endsWith("not found")) { log.error("Unsupported JVM for J9 bootstrap; switching to default loader"); bl = new LauncherBootLoader(); } else throw e; }

Prevention

When it happens

Trigger: J9BootLoader initialization calls getAbstractClassLoader with a hardcoded internal class name (J9-specific, e.g. 'com.ibm.oti.vm.AbstractClassLoader') that does not exist on the running JVM.

Common situations: Running the agent on a JVM that is not IBM J9 (class absent), an OpenJ9 version that removed/renamed the internal class, or stripped/custom runtime images without internal IBM classes.

Related errors


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/be4b92dcaf484f65. Report an issue: GitHub.