Почему используется простой наименьший недавно использованный механизм кэширования?

Я использую JProfiler для проверки микросервиса Java, в то время как я симулирую одновременных пользователей с JMeter. С JProfiler я вижу:обзорИстория ТемыМониторинг использованияИстория монитораПереходя к методу find(), я понял, что метод синхронизировал ключевое словометод

На мой взгляд, этот метод вызывает проблемы с заблокированными потоками. Но почему это используется? Можно ли отключить этот механизм кэширования в микросервисе? Микросервис написан на Java и использует Spring, Spring Boot.

Спасибо

Я добавил скриншот из того же снимка JProfiler для истории монитора, чтобы показать время, проведенное в классе ResolvedTypeCache. Иногда время меньше, но иногда огромно.Обновление монитора истории

2 ответа

Почему LRU используемый? Предположительно, потому что есть кое-что, что стоит кэшировать.

Почему это synchronized? Поскольку LinkedHashMap это используется в качестве кеша здесь не является потокобезопасным. Это действительно обеспечивает идиоматический механизм LRU все же.

Это может быть заменено на ConcurrentMap чтобы смягчить синхронизацию, но тогда у вас будет постоянно растущий кэш без LRU, и это совсем не одно и то же.

Теперь мало что можно с этим поделать. Лучшая идея - связаться с разработчиками и сообщить им об этом. В целом, библиотека может просто не подходить по объему трафика, который вы проходите через нее, или вы имитируете вид трафика, который будет демонстрировать патологическое поведение, или вы можете переоценивать влияние этого (не обижайтесь, я просто очень по- мульдерески про ТАК посты, т.е. "доверие №1").

Наконец, неоспоримая синхронизация обходится дешево, поэтому, если есть возможность разделить трафик на несколько экземпляров кэша, это может как-то повлиять на производительность (не обязательно положительное). Я не знаю об архитектуре библиотеки, так что это может быть совершенно невозможно.

Ваш вывод кажется мне очень неправильным, особенно если вы подразумеваете, что это либо плохо, либо что существует потенциальная тупиковая ситуация.

Тот факт, что есть synchronized методы внутри этого класса не являются признаком мертвых блокировок. Это просто тот факт, что есть несколько потоков, которые ждут на один замок - это то, что synchronized делает в конце концов. Также посмотрите на те времена, они выглядят как микросекунды, и самое большее, что остается там - это 4000, что составляет 4ms - не так много.

Поскольку это внутренняя библиотека, вы ничего не можете с этим поделать, возможно, вам предложат реализовать ConcurrentHashMap это улучшит производительность или лучше сделает патч самостоятельно.

Другие вопросы по тегам