【发布时间】:2016-07-07 00:00:45
【问题描述】:
我的问题:
当线程处于TIMED_WAIT 状态(非睡眠)>99.9% 的时间时,JVM 中的大量线程是否会消耗大量资源(内存、CPU)?当线程在等待时,如果需要的话,维护它们需要多少 CPU 开销?
答案是否也适用于非 JVM 相关环境(如 linux 内核)?
上下文:
我的程序收到大量占用空间的包。它在不同的包中存储相似属性的计数。在收到包裹后的给定时间段(可能是几小时或几天)后,该特定包裹将过期,并且该包裹贡献的任何计数都应减少。
目前,我通过将所有包存储在内存或磁盘中来实现这些功能。每 5 分钟,我从存储中删除过期的包,并扫描剩余的包以计算属性。这种方法会占用大量内存,并且时间复杂度很差(O(n) 表示时间和内存,其中 n 是未过期包的数量)。这使得程序的可扩展性很差。
解决此问题的另一种方法是在每次收到包时增加属性计数,并启动一个Timer() 线程,在包过期后减少属性计数。这消除了存储所有大包的需要并将时间复杂度降低到O(1)。但是,这会产生另一个问题,因为我的程序将开始拥有O(n) 线程数,这可能会降低性能。由于大多数线程在其生命周期的绝大部分时间里都处于TIMED_WAIT 状态(Java 的Timer() 调用Object.wait(long) 方法),它是否仍然会对CPU 产生很大的影响?
【问题讨论】:
-
您认为有多少线程可能正在等待?几百个左右可能不会对内核进行检查线程以及何时需要安排它们的负担,但是如果您要排队 500+,您可能需要重新考虑您的方法..
-
我可能会有几百个。您能否解释一下为什么内核必须不断检查
TIMED_WAIT上的线程?我试图查找有关内核如何专门执行此操作的信息,但找不到任何所需的信息。 -
ScheduledExecutor / 一个优先级队列,按单线程过期时间戳。
标签: java multithreading performance timer