我的问题:等待线程资源消耗
是否大量存在于JVM线程消耗了大量的资源(内存,CPU),当线程TIMED_WAIT
状态(不睡觉)>的99.9% ?当线程在等待时,如果有需要的话,维护它们需要多少CPU开销?
答案也适用于非JVM相关环境(如Linux内核)吗?
语境:
我的程序接收到大量的空间消费套餐。它存储不同软件包中相似属性的计数。在收到包裹后的一段时间(可能是几小时或几天)之后,该特定包裹将到期,并且该包裹所贡献的计数应该减少。
目前,我通过将所有包存储在内存或磁盘中来实现这些功能。每隔5分钟,我从存储中删除过期的软件包,并扫描剩余的软件包以计算属性。此方法耗尽了大量内存,并且时间复杂度较低(时间和内存的O(n)
,其中n是未到期软件包的数量)。这使得该程序的可扩展性非常糟糕。
解决此问题的一种替代方法是在每次出现软件包时递增属性计数,并启动在软件包到期后递减属性计数的线程Timer()
。这消除了存储所有大型软件包的需要,并将时间复杂度降低到O(1)
。但是,这会产生另一个问题,因为我的程序将开始具有O(n)
线程数,这可能会削减性能。由于大多数线程将处于TIMED_WAIT
状态(Java的Timer()
调用Object.wait(long)
方法),它们的绝大部分生命周期都会以非常大的方式影响CPU吗?
您认为有多少线程可能在等待?几百个左右的内核可能不会对核心检查线程以及他们需要安排的时间征税,但如果您排队等待超过500个,您可能需要重新考虑您的方法.. – txtechhelp
我可能会有超过几百人。你能解释为什么内核必须经常检查'TIMED_WAIT'上的线程吗?我试图找到有关内核如何执行此操作的信息,但无法找到任何所需的信息。 – PhotometricStereo
ScheduledExecutor /一个优先级队列通过单线程到期的时间戳。 – zapl