Моя проблема:
Сколько больших потоков в JVM потребляет много ресурсов (память, ЦП), когда потоки TIMED_WAIT
состояния (не спящие) > 99,9% времени? Когда потоки ждут, сколько накладных расходов процессора стоит поддерживать, если они вообще нужны?
Отвечает ли ответ на не связанные с JVM среды (например, ядра Linux)?
Контекст:
Моя программа получает большое количество пакетов, занимающих пространство. Он хранит количество одинаковых атрибутов в разных пакетах. По истечении заданного периода времени после получения пакета (может быть часы или дни), этот конкретный пакет истекает, и любой счет, который был внесен в пакет, должен быть уменьшен.
В настоящее время я достигаю этих функциональных возможностей, сохраняя все пакеты в памяти или на диске. Каждые 5 минут я удаляю истекшие пакеты из хранилища и просматриваю оставшиеся пакеты для подсчета атрибутов. Этот метод использует много памяти и имеет сложную временную сложность (O(n)
для времени и памяти, где n - количество оставшихся пакетов). Это делает масштабируемость программы ужасной.
Одним из альтернативных способов решения этой проблемы является увеличение количества атрибутов каждый раз, когда приходит пакет, и запускает поток Timer()
, который уменьшает количество атрибутов после истечения срока действия пакета. Это устраняет необходимость хранения всех громоздких пакетов и сокращения временной сложности до O(1)
. Однако это создает еще одну проблему, так как моя программа начнет иметь O(n)
количество потоков, что может привести к снижению производительности. Поскольку большинство потоков будет находиться в состоянии TIMED_WAIT
(Javas Timer()
вызывает метод Object.wait(long)
) подавляющее большинство их жизненного цикла, все равно влияет на процессор очень большим образом?