java - 为什么要使用简单最近最少使用缓存机制?

标签 java spring spring-boot profiling jprofiler

我使用 JProfiler 检查 Java 微服务,同时使用 JMeter 模拟并发用户。 使用 JProfiler 我可以看到: Overview Thread History Monitor Usage Monitor History 导航到方法 find(),我意识到该方法具有同步关键字 method

在我看来,这种方法会导致阻塞线程的问题。但是为什么要用呢?我可以从微服务中禁用这种缓存机制吗?微服务是用 Java 编写的,它使用 Spring、Spring Boot。

谢谢

我为 Monitor History 添加了来自同一 JProfiler 快照的屏幕截图,以显示在 ResolvedTypeCache 类中花费的时间。有时时间较少,但有时时间很长。 History Monitor Update

最佳答案

为什么要使用LRU?大概是因为有值得缓存的东西。

为什么是同步?因为这里用作缓存的 LinkedHashMap 不是线程安全的。它确实提供了 idiomatic LRU mechanism虽然。

它可以用 ConcurrentMap 代替以减轻同步,但那样你就会有一个不断增长的非 LRU 缓存,这根本不是一回事。

现在您对此无能为力。最好的办法可能是联系开发人员并让他们知道这一点。总而言之,图书馆可能不适合您通过它的流量,或者您可能正在模拟会表现出病态行为的流量,或者您可能高估了这种影响(不是冒犯,我是对 SO 帖子非常Mulderesque,即“信任 no1”)。

最后,无争议同步的成本很低,因此如果有可能将流量分配给缓存的多个实例,它可能会以某种方式影响性能(不一定是积极的)。虽然我不知道图书馆的架构,所以这可能是完全不可能的。

关于java - 为什么要使用简单最近最少使用缓存机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065290/

相关文章:

java - 如何比较jaxb、对象、字符串来查找差异

java - Spring 安全 : How to add a redirect query parameter to the login url to allow bookmarking of the page?

PreAuthorize 注释中的 Java 8/Spring 常量

java - 使用 Logback RollingFileAppender 时,有没有办法使用默认的 Spring Boot "/actuator/logfile"端点?

java - 通过接口(interface)注入(inject)服务类?

java - Axis2网络服务: wrong number of arguments when invoking method

java - 如何在 Spring Batch 中覆盖 spring 框架版本?

java - 在 String.format() 中选择参数

java - TomEE 中部署 org.springframework.context.ApplicationListener 异常

java - 如何使用 :list behave with scope ="prototype"?