- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个连接到 Hazelcast 的应用程序。最近我发现对 hazelcast 的请求最终开始变得无响应,因此,我对 Hazelcast 进程进行了线程转储。在分析来自开发和生产环境的线程转储时,我发现池中等待任务的线程在不同的环境中处于不同的状态。
在生产服务器上,线程被阻塞(500 个中有 337 个)。在开发环境中,没有线程被阻塞(在 60 个线程中,50% 为可运行,50% 为等待)。
那些阻塞线程是否正在等待某些线程无限期持有的同步块(synchronized block)? 500 个线程是否过多(我收到一些分析器的警告)?这会导致我的应用程序变得无响应吗?
这种状态的可能原因是什么以及如何解决?
线程转储(生产):
Thread 120713: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.ForkJoinPool.awaitWork(java.util.concurrent.ForkJoinPool$WorkQueue, int) @bci=350, line=1824 (Compiled frame)
- java.util.concurrent.ForkJoinPool.runWorker(java.util.concurrent.ForkJoinPool$WorkQueue) @bci=44, line=1693 (Interpreted frame)
- java.util.concurrent.ForkJoinWorkerThread.run() @bci=24, line=157 (Interpreted frame)
Thread 120743: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Compiled frame)
- java.util.concurrent.LinkedBlockingQueue.take() @bci=29, line=442 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Compiled frame)
Thread 120743: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.park() @bci=5, line=304 (Compiled frame)
- com.hazelcast.internal.util.concurrent.MPSCQueue.takeAll() @bci=83, line=231 (Compiled frame)
- com.hazelcast.internal.util.concurrent.MPSCQueue.take() @bci=12, line=153 (Compiled frame)
- com.hazelcast.client.spi.impl.ClientResponseHandlerSupplier$ResponseThread.doRun() @bci=17, line=164 (Compiled
Thread 128753: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=215 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=78, line=2078 (Compiled frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=124, line=1093 (Compiled frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=809 (Compiled frame)
来自开发环境的线程转储:
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c1a1bc38> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
最佳答案
Thread states - 这里是线程状态的一点解释。
NEW The thread has not yet started.
RUNNABLE The thread is executing in the JVM.
BLOCKED The thread is blocked waiting for a monitor lock.
WAITING The thread is waiting indefinitely for another thread to perform a particular action.
TIMED_WAITING The thread is waiting for another thread to perform an action for up to a specified waiting time.
TERMINATED The thread has exited.
BLOCKED 状态是否会在同一线程中长时间存在,这应该是令人担忧的。这当然取决于您的情况 - 您如何处理数据、如何创建线程(和线程池)、您的关键部分是什么以及所有这些部分如何相互交互。
生产的单个线程转储是不够的 - 您应该进行多个转储和- 比较发生的事情和- 线程运行/等待多长时间- 这是在高负载时发生还是在高负载后发生- 你的线程数是否会随着时间的推移而增加,等等。
因此,无法判断在这个特定时间点 500 个阻塞线程是好是坏,但可以肯定的是,这是令人担忧的。一个线程大约需要 2MB 来初始化和分配,所以它是 1GB 的内存。
很可能有一些关键部分被某些线程占用,从而导致您的问题和应用程序无响应。您可能会使用阻塞方法等从队列中读取一些非常复杂的情况。
可能的行动方案:
关于java - Thread.State : WAITING (parking) vs BLOCKED at sun. misc.Unsafe.park() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62293140/
我将使用什么算法(是否使用蛮力)将尽可能多的汽车(假设所有汽车大小相同)放入 parking 场,以便至少有一个导出(来自容器)并且汽车不能被封锁。或者有人可以向我展示一个以编程方式解决此问题的示例。
我想使用 ggplot 绘制以下场景的网格图,我试图在下图中描绘该场景......我可以使用一些关于如何逻辑地思考该方法的指导。谢谢您的指导。 -- 下面示例图中的每个过道都有奇数边和偶数边 奇数一侧
嘿。 我正在设计一个网站(使用 spring、hibernate 和 postgres),供 parking 场所有者跟踪其 parking 场 parking 位的状态(占用、空置或保留),并且对于
我有一个连接到 Hazelcast 的应用程序。最近我发现对 hazelcast 的请求最终开始变得无响应,因此,我对 Hazelcast 进程进行了线程转储。在分析来自开发和生产环境的线程转储时,我
预计在汽车中使用 GPS。它有速度,但有时以 5 km/h 的低速行驶?:搜索 parking 位它显示速度为 0 - 并且汽车在移动! 如何检测汽车是否已停止? GPS 速度 = 0 并且: 加速度
我想编写一个 C 程序,其中有一个包含 10 个字符串的数组,其中每个字符串表示停在第 i 处的汽车的车牌号。随机选择一个点,如果空出,则生成一个随机车牌号并分配给该点,如果被占用,则腾出该点并删除车
看来,我找不到问题的答案,所以我在这里,首先在 Stackoverflow 上:) 即将提到的If语句树: buttonSzamol.addActionListener(new ActionListe
我们在 parking 场的入口和导出处安装了两个车牌读取器摄像头,在进行检测时会生成一个 CSV 文件,然后自动将其加载到数据库中,入口处还有一个自动操作的屏障由相机的“白名单”生成,然后从数据库内
编写一个程序,在给出以下信息时计算将车停在 parking 场的顾客的 parking 费: a.显示车辆类型的字符:C 代表轿车,B 代表巴士,T 代表卡车 b. 0 到 24 之间的整数,显示车辆
我是一名计算机科学专业的初学者,我们被要求完成一个项目,该项目将随机生成的汽车对象移动到城市 map 网格上随机生成的 parking 位。我为按钮、文本字段和文本区域开发了一个 GUI。一切都按要求
已解决。非常感谢所有提供意见的人。这里有很棒的社区。 我有一项任务,其中部分程序需要计算客户的 parking 费。 收费以小时和 1/2 小时为增量。 确定小时数和分钟数。第 1 分钟到第 30 分
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我注册了几个域名,每个域名都略有不同。 例如, 快车网快车网fastcar.co.uk网站fast-car.co.uk 等.. 我不希望因任何主要搜索引擎的重复内容或垃圾链接而受到惩罚。 我应该将它们
我网上找了很多解决导航方案的问题,均无法用于WordPress3.1之上,总会出现其他问题。而我所讲解的这种方法是最实用、简单的。如果你用的不是本款主题,你同样可以使用此方法。 首先,
我正在尝试线程驻留,并决定构建某种服务。看起来是这样的: public class TestService { private static final Logger logger = Log
我想创建一个应用程序来更快地支付 parking 费。 这个问题更多的是关于我的应用程序的逻辑,以及我需要使用什么工具来创建它。 此时,我每天使用一个 parking 位,并通过网页付费。 我是这样做
我无法同时运行超过 100 个线程。当我进行线程转储时,我注意到其中许多线程处于停放状态,即 parking to wait for (java.util.concurrent.locks.Abst
我正在开发车辆 parking 系统java应用程序。应用程序应该跟踪汽车何时进入 parking 场、何时离开 parking 场、 parking 场的状态,是否已满。该应用程序还应检查 park
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我有一个卡车停车应用程序,在该应用程序中,卡车运输公司可以预订特定日期的某个位置的停车位数量。 我需要帮助来修改查询以查找特定时期的停车位。 我在此过程中有3张桌子: 位置 +------------
我是一名优秀的程序员,十分优秀!