我的問題:等待線程資源消耗
是否大量存在於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