java - 从 java Grpc 服务器调试线程转储?

标签 java multithreading grpc

我正在调试 java Grpc 服务器上的一个问题,每 n 分钟,服务器在处理请求时就会暂停一次。我附加了一个分析器,我可以立即看到问题,每 n 分钟线程数量就会出现峰值,然后几秒钟后它再次恢复正常,并且在接下来的 n 分钟内一切正常。当线程峰值发生时,我对 jvm 进行了线程转储,我可以轻松地看到有大量等待线程。但从那里我无法真正判断是什么导致了这种情况 - 请参阅下面的线程转储的示例输出。服务器可能因太多请求而过载,但我无法从下面解释这一点:

"grpc-default-executor-1212" - Thread t@4520
   java.lang.Thread.State: TIMED_WAITING
    at java.base@11.0.1/jdk.internal.misc.Unsafe.park(Native Method)
    - parking to wait for <44b4dca3> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.base@11.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234)
    at java.base@11.0.1/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
    at java.base@11.0.1/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
    at java.base@11.0.1/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
    at java.base@11.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
    at java.base@11.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
    at java.base@11.0.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base@11.0.1/java.lang.Thread.run(Thread.java:834)

   Locked ownable synchronizers:
    - None

有没有人遇到过以上情况,能解释一下原因吗? (CPU 使用率和堆都很好,因此不会导致问题)谢谢

最佳答案

您可以查看java doc SynchronousQueue的

A blocking queue in which each insert operation must wait for a corresponding remove operation by another thread, and vice versa. A synchronous queue does not have any internal capacity, not even a capacity of one

你可以使用SynchronousQueue作为参数来创建一个ThreadPool。SynchronousQueue是一个没有容量的队列,当线程从线程池中获取某个任务时,它们会被阻塞,直到某些任务被提交。

关于java - 从 java Grpc 服务器调试线程转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468482/

相关文章:

ios - 停止由 `performSelector` 在 `viewDidDisappear` 上启动的子线程

java - 如何在 Java 中捕获所有传入的 gRPC 消息?

python - 使用 grpc 向客户端发送服务器错误

grpc - 使用 gRPC 服务定义作为多个实例的接口(interface)

java - 如何阻止 Eclipse 3.4 在项目中丢失对 JRE 的引用

java - 如何检测bundle是否完全加载到osgi容器中?

java - java变量的奇怪行为

javascript - 从 javascript 代码提交到 spring Controller

ios - 应用挂起在 __psynch_mutexwait

c++ - 使用 Atomic Builtins 旋转线程屏障