I am using JProfiler to inspect a Java microservice while I simulate concurrent users with JMeter.
With JProfiler I can see:
Navigating to the method find(), I realized the method has synchronized keyword
在我看来,这种方法会导致线程阻塞的问题。但为什么要使用它呢?我可以从微服务中禁用此缓存机制吗?微服务是用Java编写的,它使用Spring、Spring Boot。
谢谢
I added screenshot from the same JProfiler snapshot for Monitor History to show the time spent in the ResolvedTypeCache class. Sometimes the time is less but sometimes is huge.
Why is LRU
用过的?大概是因为有一些东西值得缓存。
为什么synchronized
?因为LinkedHashMap
这里用作缓存的不是线程安全的。它确实提供了惯用的 LRU 机制 https://stackoverflow.com/questions/27475797/use-linkedhashmap-to-implement-lru-cache though.
它可以替换为ConcurrentMap
来减轻同步的影响,但是这样你就会有一个不断增长的非 LRU 缓存,而这根本不是一回事。
现在你对此无能为力。最好的主意可能是联系开发人员并让他们知道这一点。总而言之,该库可能不适合您通过它的流量,或者您可能正在模拟会表现出病态行为的流量,或者您可能高估了这种影响(不是冒犯,我是只是非常穆德风格关于 SO 帖子,即“信任 no1”)。
最后,无竞争的同步成本较低,因此如果有可能将流量分配到缓存的多个实例,则可能会以某种方式影响性能(不一定是积极的)。不过我不了解图书馆的架构,所以这可能完全不可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)