pinpoint-apm/pinpoint · error · IllegalStateException

BootStrapClassLoader

Error message

BootStrapClassLoader

What it means

IllegalStateException guard in injectClass: plugin classes cannot be injected into the bootstrap classloader (classLoader == Object.class.getClassLoader()), which has no parent to define agent/plugin classes.

Solutions

  1. Avoid calling injectClass with a bootstrap classloader; pass the agent or system classloader instead
  2. Register plugin classes on the bootstrap classpath (bootstrap-jars) rather than injecting
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/PlainClassLoaderHandler.java:71 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/PlainClassLoaderHandler.java:71

    private final DefineClass defineClass;

    // TODO remove static field
    private static final ConcurrentMap<ClassLoader, ClassLoaderAttachment> classLoaderAttachment = new ConcurrentWeakHashMap<>();


    private final PluginConfig pluginConfig;

    public PlainClassLoaderHandler(DefineClass defineClass, PluginConfig pluginConfig) {
        this.defineClass = Objects.requireNonNull(defineClass, "defineClass");
        this.pluginConfig = Objects.requireNonNull(pluginConfig, "pluginConfig");
        this.pluginJarReader = new JarReader(pluginConfig.getPluginJarFile());
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> Class<? extends T> injectClass(ClassLoader classLoader, String className) {
        if (classLoader == Object.class.getClassLoader()) {
            throw new IllegalStateException("BootStrapClassLoader");
        }

        try {
            if (!isPluginPackage(className, classLoader)) {
                return loadClass(classLoader, className);
            }
            return (Class<T>) injectClass0(classLoader, className);
        } catch (Exception e) {
            logger.warn("Failed to load plugin class {} with classLoader {}", className, classLoader, e);
            throw new PinpointException("Failed to load plugin class " + className + " with classLoader " + classLoader, e);
        }
    }

    @Override
    public InputStream getResourceAsStream(ClassLoader targetClassLoader, String internalName) {
        try {
            final String name = JavaAssistUtils.jvmNameToJavaName(internalName);
            if (!isPluginPackage(name, targetClassLoader)) {

View on GitHub (pinned to 744c3d3075)