eclipse-ee4j / eclipse-ee4j/jersey

Thread leak in ScheduledThreadPoolExecutorProvider subclasses

Open
#3,921 0 comments 0 reactions 0 assignees View on GitHub
bug memory-leak
Dominant language
Java
Stars
730
Forks
382
PR merge metrics
No merged PRs in 30d

Description

Tomcat 8.0.52 complains about our custom `ScheduledThreadPoolExecutorProvider`:

WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [...] appears to have started a thread named
[CustomScheduledThreadPoolExecutorProvider-0] but has failed to stop it.
This is very likely to create a memory leak. Stack trace of thread:

Our implementation is the following:

import org.glassfish.jersey.server.BackgroundScheduler;
import org.glassfish.jersey.spi.ScheduledThreadPoolExecutorProvider;

@BackgroundScheduler
public class CustomScheduledThreadPoolExecutorProvider extends ScheduledThreadPoolExecutorProvider {

public CustomScheduledThreadPoolExecutorProvider() {
super("CustomScheduledThreadPoolExecutorProvider");
}

public CustomScheduledThreadPoolExecutorProvider(String name) {
super(name);
}

@Override
protected ScheduledThreadPoolExecutor createExecutor(final int corePoolSize, final ThreadFactory threadFactory,
final RejectedExecutionHandler handler) {
return new ScheduledThreadPoolExecutor(5, threadFactory, handler);
}

}

Although its [`ScheduledThreadPoolExecutorProvider` superclass implements a `@PreDestroy` method](https://github.com/eclipse-ee4j/jersey/blob/master/core-common/src/main/java/org/glassfish/jersey/spi/ScheduledThreadPoolExecutorProvider.java#L92) it's not called by Jersey.

As far I see, `@PreDestroy` is only called for the `DefaultBackgroundSchedulerProvider` (see [`ServerExecutorProvidersConfigurator.java:53`](https://github.com/eclipse-ee4j/jersey/blob/master/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java#L53)). The following workaround works:

@Override
public void dispose(final ExecutorService executorService) {
super.close();
}

Anyway, it's rather weird since `@PostConstruct` method works in our `CustomScheduledThreadPoolExecutorProvider`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.