We use the current MongoDB Sync driver to establish database connections to a MongoDB in a web application. The web application is hosted in a Tomcat servlet container.
These are our system specs:
-
Apache Tomcat 10
-
JDK 17.0.6
-
mongodb-driver-sync 4.8.2
When we undeploy an application, we get the following error message in catalina.out.
26-Jan-2023 09:02:43.395 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [BufferPoolPruner-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/jdk.internal.misc.Unsafe.park(Native Method)
java.base@17.0.6/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
java.base@17.0.6/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.396 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-ClusterId{value='XXX', description='null'}-mycluster-shard-00-00-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/sun.nio.ch.Net.poll(Native Method)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:181)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:285)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
java.base@17.0.6/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
java.base@17.0.6/java.net.Socket$SocketInputStream.read(Socket.java:966)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1465)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1069)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:113)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:138)
com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:716)
com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:574)
com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413)
com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:372)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:226)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.397 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-rtt-ClusterId{value='XXX', description='null'}-mycluster-shard-00-00-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/java.lang.Thread.sleep(Native Method)
com.mongodb.internal.connection.DefaultServerMonitor.waitForNext(DefaultServerMonitor.java:448)
com.mongodb.internal.connection.DefaultServerMonitor.access$1500(DefaultServerMonitor.java:65)
com.mongodb.internal.connection.DefaultServerMonitor$RoundTripTimeRunnable.run(DefaultServerMonitor.java:420)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.398 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-ClusterId{value='XXX', description='null'}-mycluster-shard-00-01-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/sun.nio.ch.Net.poll(Native Method)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:181)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:285)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
java.base@17.0.6/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
java.base@17.0.6/java.net.Socket$SocketInputStream.read(Socket.java:966)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1465)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1069)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:113)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:138)
com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:716)
com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:574)
com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413)
com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:372)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:226)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.398 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-rtt-ClusterId{value='XXX', description='null'}-mycluster-shard-00-01-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/java.lang.Thread.sleep(Native Method)
com.mongodb.internal.connection.DefaultServerMonitor.waitForNext(DefaultServerMonitor.java:448)
com.mongodb.internal.connection.DefaultServerMonitor.access$1500(DefaultServerMonitor.java:65)
com.mongodb.internal.connection.DefaultServerMonitor$RoundTripTimeRunnable.run(DefaultServerMonitor.java:420)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.399 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-ClusterId{value='XXX', description='null'}-mycluster-shard-00-02-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/sun.nio.ch.Net.poll(Native Method)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:181)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:285)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
java.base@17.0.6/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
java.base@17.0.6/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
java.base@17.0.6/java.net.Socket$SocketInputStream.read(Socket.java:966)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478)
java.base@17.0.6/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1465)
java.base@17.0.6/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1069)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:113)
com.mongodb.internal.connection.SocketStream.read(SocketStream.java:138)
com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:716)
com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:574)
com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413)
com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:372)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:226)
com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.399 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [cluster-rtt-ClusterId{value='XXX', description='null'}-mycluster-shard-00-02-server.mongodb.net:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/java.lang.Thread.sleep(Native Method)
com.mongodb.internal.connection.DefaultServerMonitor.waitForNext(DefaultServerMonitor.java:448)
com.mongodb.internal.connection.DefaultServerMonitor.access$1500(DefaultServerMonitor.java:65)
com.mongodb.internal.connection.DefaultServerMonitor$RoundTripTimeRunnable.run(DefaultServerMonitor.java:420)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.400 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [MaintenanceTimer-3-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/jdk.internal.misc.Unsafe.park(Native Method)
java.base@17.0.6/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
java.base@17.0.6/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.400 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [MaintenanceTimer-4-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/jdk.internal.misc.Unsafe.park(Native Method)
java.base@17.0.6/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
java.base@17.0.6/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.401 WARNING [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myapp] appears to have started a thread named [MaintenanceTimer-6-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.6/jdk.internal.misc.Unsafe.park(Native Method)
java.base@17.0.6/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
java.base@17.0.6/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
java.base@17.0.6/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base@17.0.6/java.lang.Thread.run(Thread.java:833)
26-Jan-2023 09:02:43.415 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@70f635bf]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.416 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@1050149f]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.417 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@2cbc7be9]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.418 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@132a7a4d]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.419 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@5c8628f2]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.419 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@8813712]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.420 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@94726ef]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.421 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@317a5145]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.422 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@fb62641]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
26-Jan-2023 09:02:43.422 SEVERE [http-nio-8080-exec-88] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [myapp] created a ThreadLocal with key of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference$1@39f1c29b]) and a value of type [com.oracle.truffle.api.nodes.EncapsulatingNodeReference] (value [com.oracle.truffle.api.nodes.EncapsulatingNodeReference@171eac92]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
The MongoDB connection is created in a ServletContextListener. In the contextDestroy method, the connection is also closed again.
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
logger.debug("Closing Connection to Mongo DB.");
MongoClient mongoClient = (MongoClient) servletContextEvent.getServletContext().getAttribute(EnvironmentConstant.MONGO_CLIENT);
mongoClient.close();
logger.debug("Closing Connection to Mongo DB successful.");
}
However, that doesn’t seem to work for some reason. The method itself is called, but the connections are not closed.