我使用 JProfiler 检查 Java 微服务,同时使用 JMeter 模拟并发用户。 使用 JProfiler 我可以看到: 导航到方法 find(),我意识到该方法具有同步关键字
在我看来,这种方法会导致阻塞线程的问题。但是为什么要用呢?我可以从微服务中禁用这种缓存机制吗?微服务是用 Java 编写的,它使用 Spring、Spring Boot。
谢谢
我为 Monitor History 添加了来自同一 JProfiler 快照的屏幕截图,以显示在 ResolvedTypeCache 类中花费的时间。有时时间较少,但有时时间很长。
最佳答案
为什么要使用LRU
?大概是因为有值得缓存的东西。
为什么是同步
?因为这里用作缓存的 LinkedHashMap
不是线程安全的。它确实提供了 idiomatic LRU mechanism虽然。
它可以用 ConcurrentMap
代替以减轻同步,但那样你就会有一个不断增长的非 LRU 缓存,这根本不是一回事。
现在您对此无能为力。最好的办法可能是联系开发人员并让他们知道这一点。总而言之,图书馆可能不适合您通过它的流量,或者您可能正在模拟会表现出病态行为的流量,或者您可能高估了这种影响(不是冒犯,我是对 SO 帖子非常Mulderesque,即“信任 no1”)。
最后,无争议同步的成本很低,因此如果有可能将流量分配给缓存的多个实例,它可能会以某种方式影响性能(不一定是积极的)。虽然我不知道图书馆的架构,所以这可能是完全不可能的。
关于java - 为什么要使用简单最近最少使用缓存机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065290/