当我关闭 tomcat 9.0.24 时,出现以下情况。我应该对此做些什么,还是什么也不做,因为 tomcat 无论如何都会关闭?
2019 年 9 月 13 日 07:59:06.145 INFO [main] org.apache.catalina.core.StandardServer.await 通过关闭端口收到有效关闭命令。停止服务器实例。 2019 年 9 月 13 日 07:59:06.146 INFO [main] org.apache.coyote.AbstractProtocol.pause 暂停 ProtocolHandler ["https-jsse-nio2-8443"] 2019 年 9 月 13 日 07:59:06.152 INFO [main] org.apache.coyote.AbstractProtocol.pause 暂停 ProtocolHandler ["ajp-nio-8009"] 2019 年 9 月 13 日 07:59:06.158 INFO [main] org.apache.catalina.core.StandardService.stopInternal 停止服务 [Catalina] 2019 年 9 月 13 日 07:59:06.247 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 出现已启动名为 [Gax-1] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194) [电子邮件保护]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2081) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1177) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 7:59:06.248 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-default-worker-ELG-1-1] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪:io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait0(Native 方法)io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait(Native.java:114)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:251)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:276)io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.250 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-default-worker-ELG-1-2] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪:io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait0(Native 方法)io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait(Native.java:114)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:251)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:276)io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 7:59:06.251 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-default-worker-ELG-1-3] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪:io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait0(Native 方法)io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait(Native.java:114)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:251)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:276)io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.252 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [Gax-2] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194) [电子邮件保护]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2081) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1177) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.253 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [Gax-3] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234) [电子邮件保护]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2123) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.254 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [Gax-4] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194) [电子邮件保护]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2081) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1177) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.255 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-default-worker-ELG-1-4] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪:io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait0(Native 方法)io.grpc.netty.shaded.io.netty.channel.epoll.Native.epollWait(Native.java:114)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:251)io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:276)io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.257 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-shared-destroyer-0] 的线程,但未能停止它。这很可能会导致内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194) [电子邮件保护]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2081) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1170) [电子邮件保护]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.258 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web 应用程序 [app] 似乎已启动名为 [grpc-default-executor-0] 的线程,但未能停止它。这很可能造成内存泄漏。线程的堆栈跟踪: [电子邮件保护]/jdk.internal.misc.Unsafe.park(本机方法) [电子邮件保护]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234) [电子邮件保护]/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462) [电子邮件保护]/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361) [电子邮件保护]/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114) [电子邮件保护]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [电子邮件保护]/java.lang.Thread.run(Thread.java:834) 2019 年 9 月 13 日 07:59:06.259 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@40a0364a]),但在 Web 应用程序停止时未能将其删除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.259 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@708ddfd3]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.259 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@2778f3d1]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.260 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@30a34f07]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.260 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@71702d3f]),但在 Web 应用程序停止时未能将其删除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。2019 年 9 月 13 日 07:59:06。260 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@6f9d1785]),但在 Web 应用程序停止时无法将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.261 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@5503e208]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.262 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@1d3aefd]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.268 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@3f46fb53]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.269 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@5e16e521]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.269 严重 [主要] org.apache.catalina.loader.WebappClassLoaderBase。checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@51a4472d]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.269 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@5930a229]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.269 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@6bd21eb7]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.270 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@204d101]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.270 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@716a6343]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。 2019 年 9 月 13 日 07:59:06.271 严重 [主要] org.apache.catalina.loader.WebappClassLoaderBase。checkThreadLocalMapForLeaks Web 应用程序 [app] 创建了一个 ThreadLocal,其键类型为 [java.lang.ThreadLocal](值 [java.lang.ThreadLocal@43aa9ccd]),值类型为 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap](值 [io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap@2d17b6ad]),但在 Web 应用程序停止时未能将其移除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。
答案1
如果您能够关闭 tomcat 并重新启动它而没有任何问题,那么我认为可以安全地忽略关闭错误日志,因为最终该过程将按预期工作。最坏的情况是您始终可以通过直接在 PID 上使用 kill -9 来强制关闭。
答案2
这似乎是 GRPC 上的泄漏,请参见https://github.com/grpc/grpc-java/issues/6692
我在 GRPC 服务器清理代码中添加了此代码,该代码使用私有 API 来清理关闭 GRPC 服务器后剩余的线程。
@SneakyThrows
@SuppressWarnings("java:S3011")
private void cleanGrpcSharedResources() {
final Field instancesField = SharedResourceHolder.class.getDeclaredField("instances");
instancesField.setAccessible(true);
final Field holderField = SharedResourceHolder.class.getDeclaredField("holder");
holderField.setAccessible(true);
final Map<?, ?> instances = (Map<?, ?>) instancesField.get(holderField.get(null));
while (!instances.isEmpty()) {
instances.keySet()
.stream()
.map(entry -> (SharedResourceHolder.Resource<Object>) entry)
.forEach(resource -> {
final Object instance = SharedResourceHolder.get(resource);
SharedResourceHolder.release(resource, instance);
});
Thread.yield();
}
}